Forループ
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 58/90。
Verilogのループを使用すると、コードブロックを複数回実行できます。これらは、反復的なテストパターンの生成、メモリの初期化、配列の反復処理を行うテストベンチで特に役に立ちます。並列に実行されるハードウェア記述とは異なり、ループは順次実行されるため、シミュレーションやテストに最適です。
最もよく使われるループは <strong>for</strong> ループで、これは特定の実行回数を繰り返します。for ループは、イテレーションごとに変化するループ変数を使って、コードのブロックを繰り返し実行します。実行する回数は正確にコントロールできます。
構文:
for (initialization; condition; increment) begin
// 繰り返すコード
end| Part | What It Does | Example |
|---|---|---|
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この loop は 5 回実行されます (i = 0, 1, 2, 3, 4)。
テストベンチにおける For Loop
For loop は、すべての入力パターンの組み合わせをテストするために一般的によく使用されます:
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 Loop
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 個の memory ロケーションが初期化されます。
重要なルール
| ルール | 説明 |
|---|---|
ループ変数は integer または reg でなければならない | wire は使用不可 |
複数のステートメントには begin/end を使用する | 2行以上の場合に必須 |
| 無限ループを避ける | condition が最終的に false になることを確認する |
| テストベンチでの使用が最適 | ほとんどのループは合成不可 |
チャレンジ
作業内容:
不足している for ループを追加して、0 から 3 までの数字を出力してください。
自分で試してみよう
module for_challenge;
integer i;
initial begin
$display("Printing 0 to 3:");
// TODO: forループを追加
// i = 0 を初期化
// i < 4 の間ループ
// i = i + 1 でインクリメント
// 内側で、i を表示
$finish;
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。