Menu
Coddy logo textTech

What Are Delays

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

Verilogでは、遅延によって文が実行されるタイミングや信号が変化するタイミングを制御します。遅延は、実際のハードウェアのタイミング動作をモデル化するために使用されます。

遅延が必要な理由

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

  • シミュレーションでは、遅延がない場合、すべてが時刻 0 に発生します
  • 遅延を使うと、イベントを時間の経過に沿って間隔を空けて配置できます
  • 遅延は、クロックやステートマシンのようなタイミングに敏感な設計のテストに役立ちます

遅延の種類

遅延の種類目的
ゲート遅延論理ゲートを通過する際の遅延
代入遅延値を代入する際の遅延
Timescale ディレクティブシミュレーションの時間単位を設定

基本構文

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

#10 clk = ~clk;   // 10タイムユニット待ってから、クロックをトグルする
#5 a = b;         // 5タイムユニット待ってから、a = b を代入する

# の後の数字は、待機する time units の数です。

簡単な例

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

タイミング:

  • Time 0: a = 0
  • Time 10: a = 1
  • Time 15: a = 0

Always ブロックでの遅延

always #5 clk = ~clk;   // 5タイムユニットごとにクロックをトグルする

これにより、連続的な clock 信号が生成されます(clkinitial ブロックで 0 に first 初期化されている場合)。そうでなければ、~xx のままになります。

重要なルール

ルール説明
# 記号delay を示します
# の後の数値待機する time units の数
遅延は累積されます#10 の後に #20 を指定すると、合計 30 待機します
合成不可遅延はシミュレーション専用です
challenge icon

チャレンジ

行うこと:

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

自分で試してみよう

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腕試し

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

基礎のすべてのレッスン

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