Verilog:有没有办法制作广义加法器(输入变量width/number)?
Verilog: Is there a way to make a generalized adder (variable width/number of inputs)?
我正在尝试编写一些 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 阶段进行添加。这是否更适合生成语句?
谢谢
你不需要为此生成区块
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
我正在尝试编写一些 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 阶段进行添加。这是否更适合生成语句?
谢谢
你不需要为此生成区块
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