数値と型
この記事シリーズでは暗黙に数値や演算子を使用して式を記述していました。今回の記事ではを数値と型を取り上げます。
数値表現
回路、特にデジタル回路では0或いは1のどちらかの値を扱いますが、回路なので不定(xで表記)とハイインピーダンス(zで表記)も記述できます。そしてそのような2進数で常に書くのは面倒でもあり、また数値に何らかの目的がある際、視認性が低い時があります。このため複数の基数をサポートしています。
数値は整数と浮動小数点数をサポートしています。小数点を記述しなければ整数、記述すれば小数表現で他の言語と同じです。また、デジタル回路は2進数や16進数で表現したい場合があります。例えば、符号化した値を記述したい場合は2進数、回路上の整数値を割り当てたい場合は16進数で記述したいことがよくあります。
基数ラベル
例えば5-bit幅の2進数表現は以下のように記述します。
5'b10000
プリフィックスとして幅(例では5)を指定し、 2進数指示ラベルとしてbを記述して続けて2進数の各桁を記述します。幅指定は(ローカル)パラメータ記述でも問題ないですが、念の為処理系でのコーディングルールを確認してください。
先の例を16進数表現で記述すると以下のようになります。
5'h10
16進数指示としてhを記述して続けて16進数の各桁を記述します。この例では下位4ビットは"0"として記述しています。16進数は各桁4ビットずつ表現するので上位1ビット(下から5ビット目)は4'b0001
として上記のような記述をします。
まとめると
幅+'+基数ラベル+基数に基づいた数値
の文法で、幅は省略して記述することもできます。その際は幅が不定の数値ということでオブジェクトへの割り当ての際に気をつける必要があります。主な基数ラベルは以下の通りです。
基数ラベル | 基数 |
---|---|
h | 16 |
d | 10 |
b | 2 |
基数ラベルは大文字でも記述できます。基数ラベルを省略すると10進数として扱われます。符号付き数値(2の補数)を記述したいときはs+基数ラベル
と符号を指示するsを付与します。符号を用いる場合は例えば
-10'sh10a
と記述でき、これは2の補数なので
10'h2f6
と等しいです。
繰り返し表現
また、文字列表現の際に値を繰り返し記述したい場合があります。
例えば数値"2"を3回繰り返したい場合、
3{2}
と記述すれば
222
と等しく繰り返し回数+{+文字+}
という文法に従います。これは例えば1ビットのフラグ信号を使用して値をマスクしたい際に有益です。
ネット型
他の言語と同じくあらかじめ型が用意されており、回路特有の型もサポートされています。ネット型にはwireとtriがあり、ネット型もユーザー定義できます。例えばデータの型としてtype T
がある場合、例えば
nettype T wT;
と宣言できます。
特定のネット型のオブジェクトに複数の信号が割り当てられている場合、これをマルチドライブと呼びます。ネット型は不定とハイインピーダンスの状態を含む状態を持ち、マルチドライブの際に割り当てられる値について気をつける必要があります。下の表は縦軸と横軸二つのネット型によりマルチドライブしている時のSystemVerilogでの扱いを定義しています。
wire/tri | 0 | 1 | x | z |
---|---|---|---|---|
0 | 0 | x | x | 0 |
1 | x | 1 | x | 1 |
x | x | x | x | x |
z | 0 | 1 | x | z |
整数型
SystemVerilogは整数型として下記をサポートしています。
型名 | 幅[bits] | 符号 | ベクタ | 状態数 |
---|---|---|---|---|
shortint | 16 | 有 | 無 | 2 |
int | 32 | 有 | 無 | 2 |
longint | 64 | 有 | 無 | 2 |
byte | 8 | 有 | 有 | 2 |
bit | UD | 有 | 有 | 2 |
logic | UD | 無 | 有 | 4 |
reg | UD | 無 | 有 | 4 |
integer | 32 | 無 | 有 | 4 |
time | 64 | 無 | 有 | 4 |
UDはユーザー定義であり、宣言時に幅を指定する必要があります。ベクタとは今までの説明でたびたび出てきたユーザーが定義した幅あるは要素を持つことを意味します。そして他の言語同様に
[3:2]
と言った形で大カッコを用いて表現しスライス":"を使用してベクトル内の要素の参照範囲を指定できます(上の例では下位3ビット目から4ビット目まで計2ビットの範囲を指定)。状態数が2の型は純粋に整数値を表現するのに用いられます。例えばforループでの型に用いたりします。状態数が4の型は実際回路として扱われ、不定(xで表記)とハイインピーダンス(zで表記)の状態も含みます。