Foreverループ
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 61/90。
foreverループは、コードのブロックを継続的に、永遠に繰り返します。それ自体で停止することはありません。
foreverループは、終了することなく繰り返し実行されます。これは、テストベンチでクロックやその他の連続信号を生成するのに役立ちます。
構文:
forever begin
// 永遠に繰り返されるコード
end簡単な例
forever begin
$display("This prints forever");
endこれは無限に出力され続け、シミュレーションをクラッシュさせます。常に遅延(ディレイ)または停止条件を追加してください。
クロックの生成(一般的な用途)
forever の最も一般的な用途は、クロックを生成することです:
initial begin
clk = 0;
forever begin
#5 clk = ~clk; // 5時間単位ごとにトグル(反転)させる
end
endこれにより、シミュレーション全体を通して実行されるクロックが作成されます。
Disable による Forever の停止
disable 文を使用して forever ループを停止させることができます:
initial begin : clock_gen // ここに名前を追加
clk = 0;
forever begin
#5 clk = ~clk;
end
endinitial begin
#100;
disable clock_gen; // これで動作します
endForever と他のループの比較
| ループ | 停止するか? | 使用場面 |
|---|---|---|
for | はい(固定回数の反復後) | 繰り返しの回数がわかっている場合 |
while | はい(条件が偽になったとき) | 停止条件が不明な場合 |
repeat | はい(固定回数の反復後) | 繰り返しの回数がわかっている場合 |
forever | いいえ(停止しない) | 継続的な信号(クロックなど) |
重要なルール
| ルール | 説明 |
|---|---|
| 遅延を含める必要があります | #10 または @(posedge clk) |
| 遅延がないと、シミュレーションがハングします | 時間が進まない無限ループ |
停止するには disable と共に使用します | そうしないとシミュレーションが終了しません |
| テストベンチでの使用に最適です | 論理合成不可 |
チャレンジ
やること:
10時間単位ごとに反転するクロックを生成するために、不足している forever ループを追加してください。
チートシート
forever ループは、コードブロックを停止することなく継続的に繰り返します。シミュレーションのハングアップを防ぐために、常に遅延を含めてください。
initial begin
clk = 0;
forever begin
#5 clk = ~clk; // 5時間単位ごとに反転
end
end名前付きブロックで disable を使用して forever ループを停止します:
initial begin : clock_gen
clk = 0;
forever begin
#5 clk = ~clk;
end
end
initial begin
#100;
disable clock_gen;
end主なルール:
- 遅延(
#10または@(posedge clk))を含める必要があります。そうしないとシミュレーションがハングアップします - 停止するには
disableを使用してください。そうしないとシミュレーションが終了しません - 論理合成不可 — テストベンチでの使用のみ
自分で試してみよう
module forever_challenge;
reg clk;
initial begin
clk = 0;
// TODO: 10時間単位ごとにclkを反転させるforeverループを追加してください
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。