SV
wire は正確にはデータ型ではなく、ネット型の一つである。接続を現し値を保持しない。データ型としては4値のベクトル型(logic)である。int などを wire の後につけて整数型にすることもできる。
reg は4値のベクトル型であり、値を保持する。wire と対比して使われる。
ここでは整数型とベクトル型を合わせて基本型と呼ぶことにする。
2値
shortint, int, logint, byte
4値
linteger, time ( integer のみ signed )
2値
bit
4値
logic, reg
ビット範囲指定をつけることで多ビットの変数を定義できる。多ビットの場合、デフォルトで unsigned である。
SystemVerilog の値は以下の4つ
0
1
x : 不定値
z : ハイ・インピーダンス
ビット幅の大きい型への変換は、unsigned はゼロ拡張、signed は符号拡張
ビット幅の小さい型への変換は MSB が切り取られる
4値から2値への変換では、x と z は 0 に変換される
キャスト演算により明示的に変換することもできる
real, shortreal, realtime
string
独自の演算が定義されている。len () など
void : 返り値のない function の型として使われる
chandle
class handle
構造体、共用体、列挙型、typedef など。
class はデータ型としては扱わない。
隙間型以外のすべて。配列や構造体に packed がつくと詰込型になる。
32ビットの境界に合わせてデータの入る隙間ができるデータ型。unpacked (デフォルト) の配列、構造体
data_type ::=
integer_vector_type [ signing ] { packed_dimension } // bit, logic, reg
| integer_atom_type [ signing ] // byte, int, integer, time など
| non_integer_type // real, realtime など
| struct_union [ packed [ signing ] ] { struct_union_member { struct_union_member } } { packed_dimension }
| enum [ enum_base_type ] { enum_name_declaration { , enum_name_declaration } } { packed_dimension } 13
| string
| chandle
| virtual [ interface ] interface_identifier [ parameter_value_assignment ] [ . modport_identifier ]
| [ class_scope | package_scope ] type_identifier { packed_dimension }
| class_type
| event
| ps_covergroup_identifier
| type_reference
implicit_data_type ::= [ signing ] { packed_dimension } // 空白でもよいということ
signing ::= signed | unsigned
packed_dimension ::= [ constant_range ] | unsized_dimension
constant_range ::= constant_expression : constant_expression
unsized_dimension ::= [ ]