そろそろ、Verilog HDLからSystemVerilogへ移行しようかと考えている。
Verilatorも限定的ながらもSystemverilogに対応しているようだし、昔からVerilogの<=と=の意味の無さに嫌気もあるし・・・
VivadoでサポートされているSystemVeriogの内容を確認しよう。
http://japan.xilinx.com/support/answers/51327.html
参考までにAltimaにもSystemVerilogについて記載がある。
http://www.altima.jp/products/software/mentor/sysveri1.html
XilinxページからVivadoの部分を抜き出しておく・・・
Vivadoで合成できるSystemVerilogのデータ型
1.整数データ型 shortint: 2 値の 16 ビット符号付き整数
int: 2 値の 32 ビット符号付き整数
longint: 2 値の 64 ビット符号付き整数
byte: 2 値の 8 ビット符号付き整数
bit: 2 値のユーザー定義のベクター
logic: 4 値のユーザー定義のベクター
reg: 4 値のユーザー定義のベクター
integer: 4 値の 32 ビット符号付き整数
time: 4 値の 64 ビット符号なし整数
とりわけ、使用するのはlogicを多用していくことになるだろう。
アルゴリズム検討する時はshortint、int、longint、byte、bitなどを多用するかもしれない。
ただし、intはCソースの時でもビット数がコンパイラ依存になるのでSystemVerilogでは32bitだと、しっかり意識して使用していかなくてはいけないかな?
logicはVerilogのregとwireの両方に対応する。
logic a, a1, a2;
assign a = b ^ c;
always @ (c or d) a1 = c + d;
mymodule module(.out(a2), .in(xyz)),
2.実数データ型使うかどうか判断に迷う所である。
下手に合成されても困るので当面、無視するつもり。
real: C の double 同様
shortreal: C の float 同様
realtime: real と同一
Vivadoでは定数実数型のデータしかサポートされていない。
次のようなコードでは、「[Synth 8-502] non-constant real-valued expression is not supported」というエラーが発生する。
input real r;
input int a;
output int y;
always_comb
y = a + int''(r),
3.void型voidはストレージがないことを表し、値を返さない関数を定義するために使用できる。
4.ユーザー定義型
typedefを使用することができる。
typedef data_type type_identifier {size};
または
typedef [enum, struct, union] type_identifier;
Alteraは構造体はOKだけど、共用体はNGらしい。
当面はenumのみ使用していくと思う。
5.enumデータ型
enumがサポートされている。
実際のデータはデフォルトでは0から開始される。
enumは今まで、ステートマシンを次の用にlocalparamで書いていたのでこの部分が、enumで定義できるようになれば、数値の記述ミスが少なくなる。
localparam S_IDLE = 2''d0;
localparam S_WAIT = 2''d1;
localparam S_ACTIVE = 2''d2;
localparam S_FINISH = 2''d3;
case(state)
S_IDLE: ...
S_WAIT: ...
S_ACTIVE: ...
S_FINISH: ...
endcase
typedef enum { circle, ellipse, freeform } ClosedCurve;
ClosedCurve a, b, c, d;
parameter int e = 2;
assign a = 2; //illegal, must assign a label name
assign b = ellipse; //legal
assign c = e; //illegal, must assign an identical enum type
assign d = ClosedCurve''(2), //legal, SystemVerilog requires to explicitly cast the value when trying to store integer value in an enum.
6.定数
parameter : Verilog HDLと同じ。
localparam : parameterと類似、上位やdefparamで上書きできない。
const : グローバル定数であり、エラボレーションの最後に修正されます。
const bit TRUE = 1
specparamはVivadoでサポートされていない。(指定ブロックで遅延値やタイミング値の指定に使用する。)
7.type演算子
SystemVerilogではデータ型をパラメータ化できる。
module my_mod #(parameter type my_param = int)
(//inputs and outputs),
my_param my_sig; //this declares a signal called my_sig that is of type int
......
endmoddule
上記のレベルでは、my_mod を次のようにインスタンシエートできるため有用です。
my_mod #(.my_param(shortint)) u0 (<port names>),
Cソースではよく、unsigned intとかをUINTとかしてる場合があるけど、それ以外ではデータ型を変更してしまうとわけが分からない状態が発生するのであまり使用しないのではないかと思う。
8.キャスティング
SystemVerilogは1つのデータ型の値を別のデータ型に割り当てると不正になる。
キャスティングは、あるデータ型を別のデータ型に変換するのに使用する。
<type>''(<expression>) : 記述を別のデータ型に型変換する
<size>''(<expression>) : 記述をベクターに型変換する
<sign>''(<expression>) : 記述を符号付きまたは符号なしに型変換する
これは明示的に「変換しているよ」と示せるのでソースコードの可読性を高めるにはよいと思う。