基于参数值的Verilog条件硬件
是否可以根据参数值在Verilog中创建条件硬件?像这样的基于参数值的Verilog条件硬件,verilog,conditional-compilation,Verilog,Conditional Compilation,是否可以根据参数值在Verilog中创建条件硬件?像这样的 module test #( parameter param = 1 )( input wire clk ); reg[3:0] counter = 0; always @(posedge clk) begin `ifdef (param == 0) // <----- counter <= counter + 1'b1; // ... more hardware here
module test #(
parameter param = 1
)(
input wire clk
);
reg[3:0] counter = 0;
always @(posedge clk) begin
`ifdef (param == 0) // <-----
counter <= counter + 1'b1;
// ... more hardware here
`else
counter <= counter - 1'b1;
// ... a different hardware here
`endif
end
endmodule // test
模块测试#(
参数param=1
)(
输入线时钟
);
reg[3:0]计数器=0;
始终@(posedge clk)开始
`如果def(param==0)/Yes,则可以对参数设置条件。只需使用它们,就像在任何其他情况下使用它们一样(尽管如果需要,也可以在过程块之外使用它们来调节整个实例化):
模块测试#(参数param=1)
(
输入线时钟
);
reg[3:0]计数器=0;
始终@(posedge clk)开始
如果(参数==0)开始
计数器实际上有generate
块是出于这个原因发明的:
module test
#(parameter param = 1)
(input wire clk);
reg [3:0] counter = 0;
generate
if (param == 0)
always @(posedge clk) begin
counter <= counter + 1'b1;
// ... more hardware here
end
else
always @(posedge clk) begin
counter <= counter - 1'b1;
// ... a different hardware here
end
endgenerate
endmodule // test
模块测试
#(参数param=1)
(输入线时钟);
reg[3:0]计数器=0;
生成
如果(参数==0)
始终@(posedge clk)开始
计数器还注意到,由于param
是一个常量,所以未使用的分支会得到优化。我想到了这一点,但我没有这样做,因为这两种情况都将在硬件中创建。在任何情况下,我都希望创建的不仅仅是计数器递增/递减。我希望避免使用在参数值为零时永远不会使用的资源。Serge提出的解决方案似乎实现了我想要的。@SebastianRV Serge的答案也不错,不过通过引入参数,您必须在param
的任何分支中包含一堆冗余代码(如始终@(posedge clk)
)。这样的冗余可能会导致bug,所以要小心。正如dave_59所指出的,由于param
是编译时常量,因此每个实例化中未使用的分支将被优化,从而不会产生额外的硬件。我忘了在我的回答中明确提到这一点。谢谢你的评论。我后来在实现过程中注意到编译器确实优化了代码,并且只实现了活动分支。在我的实现中,我将两种技术结合起来——由Serge提出的generate和由Unn提出的if-then-else-inside——用于不同的情况。谢谢您的回复。这似乎是一个实现,将做什么,我一直在寻找。我试试看。
module test
#(parameter param = 1)
(input wire clk);
reg [3:0] counter = 0;
generate
if (param == 0)
always @(posedge clk) begin
counter <= counter + 1'b1;
// ... more hardware here
end
else
always @(posedge clk) begin
counter <= counter - 1'b1;
// ... a different hardware here
end
endgenerate
endmodule // test