Menu
Coddy logo textTech

遅延とは何か

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

Verilogにおいて、遅延はステートメントがいつ実行されるか、または信号がいつ変化するかを制御します。これらは、実際のハードウェアのタイミング動作をモデル化するために使用されます。

なぜ遅延が必要なのか

実際のハードウェアでは、信号が配線やゲートを通過するのに時間がかかります。遅延を使用することで、このタイミング動作をシミュレートできます。

  • シミュレーションでは、遅延がない場合、すべてが時刻0で発生します
  • 遅延を使用すると、イベントを時間の経過とともに分散させることができます
  • これらは、クロックやステートマシンなどのタイミングに敏感な設計のテストに役立ちます

遅延の種類

遅延の種類目的
ゲート遅延論理ゲートを通過する際の遅延
代入遅延値を代入する際の遅延
タイムスケール・ディレクティブシミュレーションの時間単位を設定します

基本構文

遅延は、# の後に数値を続けて記述します:

#10 clk = ~clk;   // 10タイムユニット待機し、クロックを反転させる
#5 a = b;         // 5タイムユニット待機し、a = b を代入する

# の後の数字は、待機する時間単位の数です。

簡単な例

initial begin
  a = 0;
  #10 a = 1;   // 10時間単位後、aは1になります
  #5 a = 0;    // さらに5時間単位後、aは0になります
end

タイミング:

  • 時間 0: a = 0
  • 時間 10: a = 1
  • 時間 15: a = 0

Alwaysブロックにおける遅延

always #5 clk = ~clk;   // 5時間単位ごとにクロックを反転させる

これにより、連続的なクロック信号が生成されます。

重要なルール

ルール説明
# 記号遅延(ディレイ)を示します
# の後の数字待機する時間単位の数
遅延は累積されます#10 の後に #20 がある場合、合計 30 待機します
合成不可遅延はシミュレーション専用です
challenge icon

チャレンジ

作業内容:

不足している遅延を追加して、このコードが 0、10、25、40 の時刻にメッセージを表示するようにしてください。

チートシート

Verilogにおいて、遅延(delays)#の後に時間単位を続けて記述し、文が実行されるタイミングを制御します:

#10 a = 1;   // 10時間単位待機してから代入

遅延は累積的です。各遅延は現在の時間に追加されます:

initial begin
  a = 0;      // 時刻 0
  #10 a = 1;  // 時刻 10
  #5  a = 0;  // 時刻 15
end

クロックを生成するためにalwaysブロックで使用します:

always #5 clk = ~clk;  // 5単位ごとに反転

注意: 遅延はシミュレーション専用であり、論理合成(synthesizable)はできません。

自分で試してみよう

module delay_challenge;
  
  initial begin
    $display("Time %0t: Start", $time);
    // TODO: 時刻 10 に到達するように遅延を追加してください
    $display("Time %0t: After first delay", $time);
    // TODO: 時刻 25 に到達するように遅延を追加してください
    $display("Time %0t: After second delay", $time);
    // TODO: 時刻 40 に到達するように遅延を追加してください
    $display("Time %0t: End", $time);
    $finish;
  end
  
endmodule

quiz icon腕試し

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

基礎のすべてのレッスン