Menu
Coddy logo textTech

initial ブロック

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

Verilogには、initial(一度だけruns)とalways(継続的にruns)の2つのプロシージャルblockがあります。ここではinitial blockについて説明します。

Initial Blockとは?

initial blockは、simulationの開始時(time 0)に一度だけexecuteされます。finishすると、二度とexecuteされません。

主にテストベンチで以下のような用途に使用されます:

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

構文

initial begin
  // ステートメントは一度だけ、順番に実行されます
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 が変化します。

Initial と Always の比較

 initialalways
実行Once継続的(永久)
用途Testbench、初期化ハードウェア(フリップフロップ、カウンタ)
論理合成可能か?いいえ(simulation のみ)はい(感度リスト付き)

重要事項

  • initial ブロックは論理合成不可能(not synthesizable)です — ハードウェアに変換することはできません
  • initialテストベンチ内でのみ使用してください
  • テストベンチに自走クロック(例: always #5 clk = ~clk;)が含まれている場合、$finish を呼び出さない限りシミュレーションは永続的に実行されます。initial ブロックのみの場合はイベントがなくなるとシミュレータは自動的に停止しますが、それでも $finish を追加するのが優れたプラクティスです
challenge icon

チャレンジ

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

作業手順:

  1. initial beginend を追加します
  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腕試し

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

基礎のすべてのレッスン