初めてでも使えるVerilog HDL文法ガイド ―― 文法ガイド編
tag: 半導体 ディジタル・デザイン
技術解説 2009年7月13日
4.ステートメント
● タイミング・コントロール(各ステートメントの直前に記述できる)
- <イベント制御>
- #<定数式>
- #( <min_typ_max定数式> )
- repeat ( <式> ) <イベント制御>
注:このrepeatは,repeat文とは異なり,タイミング・コントロールの拡張とみなされる.
《記述例》
repeat ( 8 ) @( posedge CK ) TRIG = 1; // 8クロック待ってTRIGを1に
● イベント制御
- @<信号名>
- @( <イベント式> )
- @*
- @(*)
● イベント式
- <式>
- posedge <式>
- negedge <式>
- <イベント式> or <イベント式>
- <イベント式>, <イベント式>
● ブロッキング代入文
<変数左辺> = [<タイミング・コントロール>] <式>;
● 変数左辺
- <変数>
- <変数> [<レンジ式>]
- <変数> [<式>] [<式>] ... [<式>]
- <変数> [<式>] [<式>] ... [<式>] [<レンジ式>]
- <連接>
注:配列の[ ]は,宣言時に確保した次元の数だけ付加する.
ここの[ ]は省略可能を意味するのではなく,[ ]そのものを意味する.
● レンジ式
- <式>
- <定数式>:<定数式>
- <式>+:<定数式>
- <式>-:<定数式>
《記述例》
wire [7:0] BYTE;
wire [31:0] WORD;
reg [1:0] POS;
// POS=0 のとき WORD[7:0] を,1のとき WORD[15:8] を選択
assign BYTE = WORD[ POS*8 +: 8 ];
● 連接
- { <式>, <式>, ... }
- { <定数式> { <式>, <式>, ... } }
注:{ } 内を定数式の値だけ繰り返す.
《記述例》
{ {16{BUS[15]}}, BUS } // 16ビットから32ビットへの符号拡張
● ノン・ブロッキング代入文
<変数左辺> <= [<タイミング・コントロール>] <式>;
注:ブロッキング代入文は,一つの代入処理が終了するまで次の文を実行しない.
ノン・ブロッキング代入文は各右辺の処理が終了してから代入処理が行われる.
● ブロック
- begin <ステートメント> end
- begin : <ブロック名> <ブロック内宣言> <ステートメント> end
- fork <ステートメント> join
- fork : <ブロック名> <ブロック内宣言> <ステートメント> join
注:複数の文をまとめて一つの文として扱う.
begin ~ end(順序処理ブロック)... 記述順に実行.
fork ~ join(並列処理ブロック)... 並列に実行.
● ブロック内宣言
- <パラメータ宣言>
- <変数宣言>
- <イベント宣言>
● if文
- if ( <式> ) <ステートメント>
- if ( <式> ) <ステートメント> else <ステートメント>
《記述例》
if ( RST ) //カウンタの本体
Q <= 4'b0;
else
Q <= Q + 4'h1;
● case文(casex,casezも同様)
case ( <式> )
<ケース・アイテム>
endcase
● ケース・アイテム(複数記述できる)
- <式> : <ステートメント>
- <式>, <式>, ... : <ステートメント>
- default:<ステートメント>
《記述例》
case ( din ) // デコーダ
0: dec = 4'b0001;
1: dec = 4'b0010;
2: dec = 4'b0100;
3: dec = 4'b1000;
default:
dec = 4'bx;
endcase
● for文
for ( <代入文> ; <式> ; <代入文> ) <ステートメント>
《記述例》
for( i=0; i<256; i=i+1 ) // メモリの初期化
MEM[i] = 8'h0;
● while文
while ( <式> ) <ステートメント>
《記述例》
i=0;
while( i<256 ) begin // メモリの初期化
MEM[i] = 8'h0;
i=i+1;
end
● repeat文
repeat ( <式> ) <ステートメント>
注:repeatは固定回のループ.
《記述例》
i=0;
repeat( 256 ) begin // メモリの初期化
MEM[i] = 8'h0;
i=i+1;
end
repeat ( 8 ) @( posedge CK ); // 8クロック待ってTRIGを1に
TRIG = 1; // タイミング・コントロールと代入文を分離した例
● forever文
forever <ステートメント>
注:foreverは無限ループ
《記述例》
initial begin //クロックの作成
CK = 0;
forever #(STEP/2) CK = ~CK;
end
● wait文
wait( <式> ) <ステートメント>
注:<式> が偽なら(0なら)待つ,真なら <ステートメント> を実行する.
● disable文
- disable <タスク名>;
- disable <ブロック名>;
注:指定したタスクやブロック(begin ~ endやfork ~ join)の処理を強制終了させる.
《記述例》
begin: LOOP
for ( i=0; i<256; i=i+1 )
if ( MEM[i]===8'hx )
disable LOOP; // forループからの脱出
end
● force文
force <代入文>;
注:強制代入.
《記述例》
force BLK_A.CNT_EN = 1'b1; // 内部信号の強制イネーブル
● release文
release <信号名>;
注:強制代入の解除.一つのrelease文で,信号は一つしか記述できない.
《記述例》
release blk_A.cnt_en; // 強制イネーブル解除
● タスク呼び出し(システム・タスクも同様)
- <タスク名>;
- <タスク名> ( <式>, <式>, ... );
表6 主要システム・タスク
表7 出力フォーマット指定
表8 ファイル入出力システム・タスク
C言語のファイル入出力のライブラリ関数とはほぼ同じものがある
● イベント起動
-> <イベント名>
注:イベント信号の起動.
《記述例》
-> EVENT_SIG;