generate文

generate文を使うと、下位モジュールの生成をパラメタイズすることができます。

generate
モジュールの生成
endgenerate

以下に例を示します。

parameter WIDTH = 8;

generate
// ビット幅が8ビットの時、8ビット用のモジュールを接続

if(WIDTH == 8)
  Multiplier8 multi(.out(out), .in0(in0), .in1(in1), .reset(reset), .clock(clock));
// ビット幅が8ビットでない時、汎用のモジュールを接続

else
  Multiplier multi(.out(out), .in0(in0), .in1(in1), .reset(reset), .clock(clock));

endgenerate

ループ

generate文内でループを使い、複数の同モジュールを接続することができます。ループを使うためには、genvarを用いて変数を宣言する必要があります。

genvar 変数名;

generate
for(条件式) begin: ブロック名
  モジュールの生成式
end
endmodule

以下に例を示します。

parameter MODULE_NUMBER = 8;
genvar i;

generate
// MODULE_NUMBERの数だけ、Memoryのインスタンスを生成

for(i = 0; i < MODULE_NUMBER; i = i + 1) begin: GenerateMemory
  Memory memory(.out(out[i]), .in(in[i]), .reset(reset[i]), .clock(clock));
end
endgenerate