Menu
CoddyTech

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

foreverとほかのループ

ループ停止する?使用する場面
forはい(指定回数の反復後)反復回数がわかっている場合
whileはい(条件がfalseになったとき)停止条件がわからない場合
repeatはい(指定回数の反復後)反復回数がわかっている場合
foreverいいえ(停止しない)継続的な信号(時計)

重要なルール

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

チャレンジ

やること:

10時間単位ごとに切り替わるクロックを生成するために、欠けているforeverループを追加してください。

自分で試してみよう

module forever_challenge;
  reg clk;
  
  initial begin
    clk = 0;
    // TODO: 10時間単位ごとにclkを切り替えるforeverループを追加する
  end
endmodule
quiz icon腕試し

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

基礎のすべてのレッスン

自分で練習してみよう: Verilogオンラインコンパイラ