generate
モジュールを条件付きでインスタンス化する場合は、ブロックを使用する必要があります。
generate
if (WORD == 1) begin
child_1 child();
end
if (WORD == 2) begin
child_2 child();
end
endgenerate
以下は完全な動作例です。child_1 と child_2 の存在のみを考慮していることに注意してください。インスタンス化するモジュールの型名の一部としてパラメーターを使用することはできません。N 個の子モジュールがあり、それらすべてを生成ブロックで明示的に列挙したくない場合は、おそらくヘルパー マクロを作成する必要があります。
ところで、これは有効な Verilog コードです。SystemVerilog 機能は一切使用しません。
module child_1();
initial begin
$display("child_1 %m");
end
endmodule
module child_2();
initial begin
$display("child_2 %m");
end
endmodule
module parent();
parameter WORD = 1;
// Conditionally instantiate child_1 or child_2 depending
// depending on value of WORD parameter.
generate
if (WORD == 1) begin
child_1 child();
end
if (WORD == 2) begin
child_2 child();
end
endgenerate
endmodule
module top();
parent #(.WORD(1)) p1();
parent #(.WORD(2)) p2();
endmodule
Incisive からの出力:
child_1 top.p1.genblk1.child
child_2 top.p2.genblk2.child