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を使った無限ループ
disable文を使うと、foreverループを停止できます。
initial begin : clock_gen // ここに名前を追加
clk = 0;
forever begin
#5 clk = ~clk;
end
endinitial begin
#100;
disable clock_gen; // これで動作します
endforeverとほかのループ
| ループ | 停止する? | 使用する場面 |
|---|---|---|
for | はい(指定回数の反復後) | 反復回数がわかっている場合 |
while | はい(条件がfalseになったとき) | 停止条件がわからない場合 |
repeat | はい(指定回数の反復後) | 反復回数がわかっている場合 |
forever | いいえ(停止しない) | 継続的な信号(時計) |
重要なルール
| ルール | 説明 |
|---|---|
| 遅延を含める必要がある | #10 または @(posedge clk) |
| 遅延がないと、シミュレーションが停止する | 時間が進まない無限ループ |
disable でループを停止するか、$finish でシミュレーションを終了する | そうしないと、シミュレーションは終了しない |
| テストベンチでの使用が最適 | 合成できない |
チャレンジ
やること:
10時間単位ごとに切り替わるクロックを生成するために、欠けているforeverループを追加してください。
自分で試してみよう
module forever_challenge;
reg clk;
initial begin
clk = 0;
// TODO: 10時間単位ごとにclkを切り替えるforeverループを追加する
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ