SV
英数字と _ が使用可能
先頭は数字以外
大文字と小文字は区別する
最後の endmodule の後に ; は要らない
MODULE 文
module <module-name> ( <port-list> ) ;
<port-declaration>
<behavior>
endmodule
// トップモジュールではポートリストはつけない
module top ;
<behavior>
endmodule
次のどれか
次のどれか
FOR 文
for ( <代入文1>; <式>; <代入文2> )
<statement>
// 例
integer I;
initial begin
for ( I = 0; I < 4; I = I + 1 )
begin
#100 IN = IN + 1;
end // for
end // initial
CASE 文
case ( SEL )
0: SEL2 = A;
1: SEL2 = B;
default: SEL2 = A;
endcase
システムタスクの名前は $ から始まる。
単項演算子
二項演算子
?
{ LG, EQ, SE } = 3'b100;
3'b100
ss..s'fnnnn
`define <macro> <macro-strings>
以降 `<macro> でコンパイル時にマクロ名がマクロ文字列に変換される。
以下は同じ
OUT = IN[3] ^ IN[2] ^ IN[1] ^ IN[0];
OUT = ^ (IN);
`timescale <記述の1unitの単位>/<シミュレーションの1unitの単位>
最後に ; は要らない
`timescale 1ns/100ps
always の条件にリセットを or で入れる。クロックに関係なくリセット条件が反映される。リセット入力が always になければ同期リセット。
非同期リセット
always @ (posedge CLK or negedge RST ) begin // ここに RST を or で入れる
if ( ! RST )
Q <= 0;
else
...
end // always
組み合わせ回路を記述。右辺の変数が一つでも変化すると式の値を評価し左辺に代入する
assign <delay> <左辺> = <右辺>;
順序回路を記述。指定したイベントが発生した時に実行
always @(CLK) #10 OUT <= A & B;
シフトレジスタ
input IN;
reg Q[3:0];
always @ (posedge CLK or negedge RSTn )
Q <= ( ! RSTn ) ? 0 : (Q[2:0], IN);
foreach で回す
連想配列
foreach (num[k] ) begin
$display("%d %s",k, num[k])l
end
// initial value
string word[int] = `{default:"hello"};