SV
ここでいう変数は正式にはオブジェクトと呼ばれるもの。変数はオブジェクトの一種だが、ここでは全部を変数と呼ぶことにする。
wire はネットであり変数ではないが、ここでは変数に入れる。
wire w; // wire logic w ; に同じ
wire [15:0] w ;
データ型を省略した場合、logic となる
使えるデータ型には制約がある。例えばサイズ不定の unpacked array は指定できない。
データ型に reg は使えない。
SystemVerilog には大別して、net と変数というオブジェクトがある。
net は値を保持できない。永続的に接続される。
ただし force 文で値を強制的に変えることができる。
net にはいくつかのタイプがあるが、代表的なのは wire。そのほかは tri など。
デフォルトの初期値は z 。
wire は net の一種。物理的な接続を現す。
ソースとなる代入は一つだけ。
wire はデータ型ではない。net の型。
net_declaration :=
net_type [ drive_strength | charge_strength ] [ vectored | scalared ] data_type_or_implicit [ delay3] list_of_net_decl_assignments ;
net_type_id [ delay_control ] list_of_nest_decl_assignments
interconnect // 省略
net_type ::= wire | その他
data_type_or_implicit ::= data_type | implicit_data_type
data_type, implicit_data_type こっち
delay3 := # delay_value | // 省略
list_of_net_decl_assignments ::= net_decl_assign { , net_decl_assign }
net_decl_assign ::= net_id { unpacked_dim } [ = expression ]
reg r1 ;
int r2 ;
reg [7:0] r1 ; // reg,bit,logic はビット範囲を指定できる
int unsigned r2 ;
reg unsigned [7:0] r1 ;
reg r1, r2 ;
reg [7:0] r1, r2 ; // どちらも [7:0]
reg r1 [P_NUM] ; // 配列
reg r1 [P_NUM-1] ; // 定数式も書ける
reg r1 [string] ; // 連想配列
reg r1 [*] ;
reg r1 [] ; // 動的配列
reg r1 [$] ; // キュー
reg r1 [$:P_NUM]
reg r1 [P_NUM] = ... ; // 初期値設定も書ける
// その他 dynamic_array の変数と、クラス変数宣言の書式がある。
struct 変数は struct へ
real r3 ; // real 型
struct r0 ;
enum r2 ;
string s ;
virtual interface if_00 ;
typedef t1 ;
class typedef
event e1 ;
ps_covergroup_id ;
type_reference ;
enum { .... } E1 ;
enum { .... } [7:0] E1 ;
enum { .... } E1 = ... ; // 初期化
enum { .... } E1 [P_NUM]; // 配列
package_item のひとつ
data_declaration ::=
[ const ] [ var ] [ lifetime ] data_type_or_implicit list_of_variable_decl_assignments ;
| type_declaration // typedef こちら
| package_import_declaration // class 内では書けない
| net_type_declaration // nettype 省略
list_of_variable_decl_assignments ::= variable_decl_assignment { , variable_decl_assignment }
variable_decl_assignment ::=
variable_identifier { variable_dimension } [ = expression ]
| dynamic_array_variable_identifier unsized_dimension { variable_dimension } [ = dynamic_array_new ]
| class_variable_identifier [ = class_new ]
variable_dimension ::=
unsized_dimension
| unpacked_dimension
| associative_dimension
| queue_dimension
wire w; // wire logic w ; に同じ
wire [15:0] w ;
// オーソドックスな書き方
wire w = a & b ; // 任意の式の代入を書ける
wire [7:0] x, y ; // , で続けて複数書ける
wire [7:0] x = a & b, y ;
wire [7:0] x, y = a & b ;
wire integer w ; // データ型を指定できる。ただし reg は禁止。
wire # 3 w ; // 遅延付き
wire ( weak0, weak1 ) [5:0] w ; // strength つき
wire ( small ) [5:0] w ; // charge つき
wire vectored [7:0] w ;
wire scalared [7:0] w ;
net_type_identifier を使った宣言。省略。
interconnect を使った宣言。省略。