Menu
Coddy logo textTech

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
end
initial begin
  #100;
  disable clock_gen;   // これで動作します
end

Forever と他のループの比較

ループ停止するか?使用場面
forはい(固定回数の反復後)繰り返しの回数がわかっている場合
whileはい(条件が偽になったとき)停止条件が不明な場合
repeatはい(固定回数の反復後)繰り返しの回数がわかっている場合
foreverいいえ(停止しない)継続的な信号(クロックなど)

重要なルール

ルール説明
遅延を含める必要があります#10 または @(posedge clk)
遅延がないと、シミュレーションがハングします時間が進まない無限ループ
停止するには disable と共に使用しますそうしないとシミュレーションが終了しません
テストベンチでの使用に最適です論理合成不可
challenge icon

チャレンジ

やること:

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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン