For loop Verilog:有没有办法制作一个通用加法器(可变宽度/输入数)?

For loop Verilog:有没有办法制作一个通用加法器(可变宽度/输入数)?,for-loop,verilog,addition,generic-programming,auto-generate,For Loop,Verilog,Addition,Generic Programming,Auto Generate,我正在尝试编写一些verilog代码,我希望这些代码能够被一个应用程序重用,该应用程序具有大量的附加数据和不同数量的输入。 假设我有一个模块: module parameterizable_adder #( parameter WIDTH = 16, parameter NUM_INPUTS = 16)( input [NUM_INPUTS*WIDTH-1:0] in_data, output [NUM_INPUTS+WIDTH-1:0] out_data ); //tre

我正在尝试编写一些verilog代码,我希望这些代码能够被一个应用程序重用,该应用程序具有大量的附加数据和不同数量的输入。 假设我有一个模块:

module parameterizable_adder #( 
  parameter WIDTH = 16,
  parameter NUM_INPUTS = 16)( 
  input [NUM_INPUTS*WIDTH-1:0] in_data, output [NUM_INPUTS+WIDTH-1:0] out_data
);

  //treat this block as psuedo code
  integer i;
  for (i = 0; i < NUM_INPUTS; i = i + 1) begin
    out_data = out_data + in_data[i*WIDTH+WIDTH-1:i*WIDTH];
  end

endmodule
模块参数化加法器#(
参数宽度=16,
参数NUM_INPUTS=16)(
输入[NUM_INPUTS*WIDTH-1:0]输入_数据,输出[NUM_INPUTS+WIDTH-1:0]输出_数据
);
//将此块视为伪代码
整数i;
对于(i=0;i
这或多或少是我想做的。在verilog中有没有一种方法可以做到这一点并使其能够合成?理想情况下,for循环将被取消滚动和优化,因此它不会尝试在NUM_INPUTS-1阶段中进行加法。这更适合生成语句吗


谢谢

您不需要为此生成块

integer i;
reg [NUM_INPUTS+WIDTH:0] temp_data;
always @* begin
     temp_data = 0;
     for (i = 0; i < NUM_INPUTS; i = i + 1) 
       temp_data = temp_data + in_data[i*WIDTH +: WIDTH];
     out_data = temp_data;
    end
整数i;
reg[NUM_INPUTS+宽度:0]温度数据;
总是开始
温度数据=0;
对于(i=0;i
谢谢你,戴夫,那代码会在一个时钟周期内执行吗?temp_数据是在单个时钟周期内更新还是在每个加法操作的时钟周期内更新?已尝试编辑,但我无法。我注意到没有时钟(在我的代码中也没有),它是一个“*”表示always块。我想我明白了。谢谢