Menu
CoddyTech

Initialブロック

CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 47/90。

Verilogには2つの手続きブロックがあります。initial(1回だけ実行)とalways(継続的に実行)です。ここでは、initialブロックについて説明します。

Initialブロックとは?

initialブロックは、シミュレーションの開始時(時刻0)に1回だけ実行されます。終了すると、再び実行されることはありません。

主にテストベンチで次の用途に使用されます:

  • 初期値の設定
  • テスト信号の生成
  • メッセージの表示
  • シミュレーションの開始

構文

initial begin
  // 文は順番に1回ずつ実行される
end

基本的な例

initial begin
  $display("Simulation started");
  $display("This runs once");
  $finish;
end

出力:

Simulation started
This runs once

テスト信号に initial ブロックを使用する

initial begin
  a = 0;
  #10 a = 1;
  #10 a = 0;
  #10 $finish;
end

これにより、時刻 0、10、20 で a の値が変わります。

初期実行と常時実行

 initialalways
実行回数1回継続的(永久に)
用途テストベンチ、初期化ハードウェア(フリップフロップ、カウンター)
合成可能?初期値の設定のみ(FPGA)はい(センシティビティリストを使用)

重要な注意事項

  • initialブロックは主にシミュレーション用です。合成ツールでは、#10のような遅延や$displayのようなタスクをハードウェアに変換できません
  • テストベンチでは主にinitialを使用します。設計モジュールでは、FPGA合成ツールだけが使用し、レジスタまたはメモリの初期値を設定する場合に限られます
  • テストベンチに自走クロック(例:always #5 clk = ~clk;)が含まれている場合、$finishを呼び出さない限りシミュレーションは永遠に続きます。initialブロックだけの場合は、イベントがなくなるとシミュレータは自動的に停止しますが、それでも$finishを追加するのがよい習慣です
challenge icon

チャレンジ

aを0に設定し、その後10時間単位後にaを1に設定する、不足しているinitialブロックを追加してください。

すること:

  1. initial beginとendを追加する
  2. a = 0を設定する
  3. #10待つ
  4. a = 1を設定する
  5. シミュレーションを終了するために$finishを追加する

自分で試してみよう

module test;
  reg a;
  
  // TODO: ここにinitialブロックを追加する
  // a = 0に設定する
  // #10だけ待つ
  // a = 1に設定する
  // シミュレーションを終了するために$finish;を追加する
  
endmodule
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン

自分で練習してみよう: Verilogオンラインコンパイラ