初めてでも使えるVerilog HDL文法ガイド ―― 文法ガイド編

小林 優

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;

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日