Verilog:有没有办法制作广义加法器(可变宽度/输入数量)?

时间:2016-12-14 17:09:41

标签: 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
);

  //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

这或多或少是我想要做的。在verilog中有没有办法做到这一点并让它可以合成?理想情况下,for循环将被展开并进行优化,因此它不会尝试在NUM_INPUTS-1阶段进行添加。这更适合生成语句吗?

由于

1 个答案:

答案 0 :(得分:2)

您不需要为此

生成块
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