我的问题可能是不可避免的,我不确定输入信号是否可以用作verilog中的参数。
我的问题是基于需要根据输入信号选择两个可用实例中的一个。这个信号在系统后是静态的。
module DUT (signal1 ....)
input signal1; // this signal to be used as parameter
`ifdef signal1
X U1
`else
Y U1
`endif
endmodule
这里X和Y是两个不同的模块。 也可以使用替代建议来实现相同的建议。
问候
进一步说明:
合成后我只想要两块硬件中的一块。我想要一种语法,可以允许由信号控制的硬件配置,该信号将具有静态值。 Signal1将在设计的其他部分连接到0或1。我知道这似乎是一种不正确的做事方法,但它是一个多模块设计,我无法控制其他块。
答案 0 :(得分:3)
如果你真的想避免使用参数并希望使用信号,根据你的综合工具,可能得到你想要的。
您需要确保signal1强制您不想要不关心的模块输出。如果您的综合工具足够智能(大多数都是),它将优化该模块。
以下是一个例子:
module DUT (signal1, out....)
input signal1; // this signal to be used as parameter
X U1 (in,out_x)
Y U2 (in,out_y)
assign out = (signal1) ? out_x : out_y;
endmodule
如果在细化过程中,综合工具看到signal1始终为1,则可以优化模块Y.
正如其他人所说,这不是一种常见/推荐的做法。
另外,使用`ifdef无法实现这一点,因为它们是在编译时处理的。在精化时处理信号的值以及如果信号静态为1或0的事实。
答案 1 :(得分:1)
正如摩根建议的那样,您可以将parameters
与generate
块一起使用来代替您想做的事情。这里的工作示例:http://www.edaplayground.com/x/2w2
module X();
initial begin
$display("%m is module X!");
end
endmodule
module Y();
initial begin
$display("%m is module Y!");
end
endmodule
module top();
parameter USE_X_NOT_Y = 1'b0;
generate
if(USE_X_NOT_Y == 1'b1) begin
X U1();
end
else begin
Y U1();
end
endgenerate
endmodule
然后,当您实例化此模块时,您可以覆盖参数以获得所需的行为:
top #(.USE_X_NOT_Y(1)) top_inst ();
答案 2 :(得分:0)
没有。实例是隐含的硬件块。除非你是一个邪恶的机器人,否则你无法动态创建和销毁硬件。
您可以做的是使用输入信号作为两个块的启用/禁用,以便只有1个处于活动状态,然后OR
结果一起或暗示多路复用器,以选择所需的输出。
module DUT (
input signal1, //sel_x
output tx
);
reg x_tx;
reg y_tx;
X U1(.en(signal1), .out(x_tx) ... );
Y U1(.en(~signal1), .out(y_tx) ... );
assign tx = (signal1) ? x_tx : y_tx ;
endmodule