有没有办法使用传递给父模块的参数值来选择我想要实例化的模块?下面的例子
module parent ();
parameter WORD = 1;
child_`WORD child (); // obviously does not work
endmodule
如果WORD == 1
,我想实例化 child_1 模块,对于WORD == 2
,child_2 模块等等。当然,以前有人需要这样做吗?
有没有办法使用传递给父模块的参数值来选择我想要实例化的模块?下面的例子
module parent ();
parameter WORD = 1;
child_`WORD child (); // obviously does not work
endmodule
如果WORD == 1
,我想实例化 child_1 模块,对于WORD == 2
,child_2 模块等等。当然,以前有人需要这样做吗?
如果你想有条件地实例化一个模块,你需要使用一个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