遅延とは何か
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 待機します |
| 合成不可 | 遅延はシミュレーション専用です |
チャレンジ
作業内容:
不足している遅延を追加して、このコードが 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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。