有没有办法使用传递给父模块的参数值选择要实例化的模块?下面使用SystemVerilog参数来决定实例化哪个模块
module parent();
parameter WORD = 1;
child_`WORD child(); // obviously does not work
endmodule
例如如果WORD == 1
,我想实例化child_1模块,用于WORD == 2
,所述child_2模块等。当然,有人需要这样做吗?
有没有办法使用传递给父模块的参数值选择要实例化的模块?下面使用SystemVerilog参数来决定实例化哪个模块
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个子模块,并且你不想在generate块中明确枚举它们,你可能需要创建一个辅助宏。
顺便说一下,这是有效的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
输出:
child_1 top.p1.genblk1.child
child_2 top.p2.genblk2.child
感谢您的回复。这就是我要做的 – user2292757
@ user2292757你可以将答案标记为接受,如果这是你想要的。 :-) – Paddu
我不认为这是可能的,如果这个词已经成为一个参数。您可以使WORD成为文本宏,也可以使用非预处理器机制来组合字符串。如果你描述原始问题是什么,你可能会得到更好的答案。 – Andy
我想第二个意见,这是不可能的,并要求你解释你为什么要这样做,或者你想解决什么问题。 – dwikle