Menu
Coddy logo textTech

遅延とは何か

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

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

遅延が必要な理由

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

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

遅延の種類

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

基本構文

ディレイは # の後に数字を付けて記述します:

#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 ブロックにおけるディレイ (Delays in Always Blocks)

always #5 clk = ~clk;   // 5時間単位ごとにクロックをトグルする

これにより、継続的なクロック信号が生成されます(ただし、initial ブロックで clkfirst に 0 に初期化されている必要があります。そうでない場合、~xx のままになります)。

重要なルール

ルール説明
# 記号ディレイ(遅延)を指定する
# の後の数値待機するタイムユニットの数
ディレイは累積される#10 の後に #20 を実行すると、合計 30 待機する
論理合成不可ディレイはシミュレーション専用
challenge icon

チャレンジ

作業手順:

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

自分で試してみよう

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

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

基礎のすべてのレッスン