Menu
Coddy logo textTech

Generateループ

CoddyのVerilogジャーニー「RTL設計と検証」セクションの一部。レッスン 13/38。

generate-for ループは、エラボレーション中に繰り返しハードウェアを生成します。その genvar インデックスは、実行時に変化するレジスタではありません。名前付き generate ブロックは、生成されたインスタンスや代入に対して予測可能な階層名を提供します。ループの範囲は、エラボレーション時定数でなければなりません。

関連する抜粋です。周囲の宣言と接続は課題内に用意されています。

genvar i;
generate
    for(i=0;i<WIDTH;i=i+1) begin: bitcell
        assign y[i] = a[i] ^ b[i];
    end
endgenerate

各反復では、クロックサイクルを消費するのではなく、ビットレベルの個別の演算が展開されます。

エラボレーション時に繰り返される構造を記述するには、定数の境界とともに genvar を使用します。

challenge icon

チャレンジ

中級

genvar i を使用する名前付き generate-for ループを使って、ビットごとに 1 つの連続代入をインスタンス化し、y[i] = a[i] XOR b[i] を生成してください。WIDTH は正の値です。ロックされたテストベンチは、WIDTH の値として 1、4、8 をインスタンス化し、幅の狭いインスタンスには a と b の下位ビットを使用します。出力列は、10 進数表記の y1、y4、y8 です。

design.v を完成させ、モジュール名とポートを保持してください。ロックされた testbench.v は入力を変化させ、値が安定した後に出力を表示します。+CASE=1 のようなシミュレータ引数を使用してシナリオを選択します。標準入力は必要ありません。設計に表示、遅延、またはシミュレーション終了処理を追加しないでください。期待される出力は、観測ごとに 10 進数値を 1 行に並べ、値同士を 1 個の空白で区切り、改行で終わる形式です。

自分で試してみよう

module dut #(parameter WIDTH=4) (input [WIDTH-1:0] a,b, output [WIDTH-1:0] y);
    // パラメータ化された回路を実装する。
    assign y = 0;
endmodule
quiz icon腕試し

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

RTL設計と検証のすべてのレッスン

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