基于参数值的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

是否可以根据参数值在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
  `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