Menu
CoddyTech

Forループ

CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 58/90。

Verilogのループを使うと、コードブロックを複数回実行できます。テストベンチでは、繰り返しのテストパターンの生成、メモリの初期化、配列の反復処理に特に役立ちます。並列に動作するハードウェア記述とは異なり、ループは逐次的に実行されるため、シミュレーションやテストに最適です。

最もよく使われるループはforループで、指定した回数だけ繰り返します。forループは、繰り返すたびに変化するループ変数を使って、コードブロックを繰り返し実行します。実行回数を正確に制御できます。

構文:

for (initialization; condition; increment) begin
  // 繰り返し実行するコード
end
部分役割例
initialization開始値を設定するi = 0
condition停止するタイミングi < 10
incrementループごとに値を変更するi = i + 1

簡単な例

integer i;

for (i = 0; i < 5; i = i + 1) begin
  $display("i = %d", i);
end

出力:

i = 0
i = 1
i = 2
i = 3
i = 4

ループは5回実行されます(i = 0, 1, 2, 3, 4)。

テストベンチにおけるforループ

すべての入力の組み合わせをテストするには、forループがよく使われます。

integer test_value;

for (test_value = 0; test_value < 16; test_value = test_value + 1) begin
  $display("test_value = %d", test_value);
end

これにより、4ビット信号で可能な16個すべての値をテストします。

配列を使ったforループ

reg [7:0] memory [0:9];
integer i;

initial begin
  for (i = 0; i < 10; i = i + 1) begin
    memory[i] = i * 8;
  end
end

これにより、10個のメモリ位置が初期化されます。

重要なルール

ルール説明
ループ変数はintegerまたはregでなければなりません wireにはできません
複数の文にはbegin/endを使用します1行を超える場合に必要です
無限ループを避けます条件が最終的にfalseになることを確認してください
合成可能なコードでは定数の境界値を使用します合成時に、ループは各反復につきロジックのコピーを1つずつ生成する形に展開されます
challenge icon

チャレンジ

やること:

0から3までの数字を出力するために、欠けているforループを追加してください。

自分で試してみよう

module for_challenge;
  integer i;
  
  initial begin
    $display("Printing 0 to 3:");
    
    // TODO: forループを追加する
    // i = 0 に初期化する
    // i < 4 の間、ループする
    // i = i + 1 でインクリメントする
    // ループ内で $display("i = %d", i); を使って表示する
    
    $finish;
  end
endmodule
quiz icon腕試し

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

基礎のすべてのレッスン

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