遅延とは何か
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 ブロックで clk が first に 0 に初期化されている必要があります。そうでない場合、~x は x のままになります)。
重要なルール
| ルール | 説明 |
|---|---|
# 記号 | ディレイ(遅延)を指定する |
# の後の数値 | 待機するタイムユニットの数 |
| ディレイは累積される | #10 の後に #20 を実行すると、合計 30 待機する |
| 論理合成不可 | ディレイはシミュレーション専用 |
チャレンジ
作業手順:
不足している 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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。