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 と共に使用します | そうしないとシミュレーションが終了しません |
| テストベンチでの使用が最適です | 論理合成は不可です |
チャレンジ
作業内容:
不足している forever ループを追加して、10 タイムユニットごとにトグルするクロックを生成してください。
自分で試してみよう
module forever_challenge;
reg clk;
initial begin
clk = 0;
// TODO: clkを10時間単位ごとにトグルするforeverループを追加
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。