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つずつ生成する形に展開されます |
チャレンジ
やること:
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ