在一个模块中,我想制作许多不同长度的寄存器,并在每个时钟周期在这些寄存器之间发送信息。具体来说,我正在尝试创建一个模块,该模块通过将成对的元素成对添加到新列表中,然后继续进行直到有一个元素,来有效地添加列表中的所有元素。
类似于以下内容,其中输入代表4个长度为16的8位整数列表(此代码通过了综合和实现,尽管我尚未对其进行测试,所以我不确定要执行我想要的操作):< / p>
module math_op #(
parameter listlength=16,
parameter numlists=4,
parameter bits=8
)(
input clk,
input [bits*listlength*numlists-1:0] addthese,
output reg [bits*numlists-1:0] add
);
integer k;
integer j;
reg [bits*listlength/2-1:0] sum1[numlists-1:0];
reg [bits*listlength/4-1:0] sum2[numlists-1:0];
reg [bits*listlength/8-1:0] sum3[numlists-1:0];
always @(posedge clk) begin
for(k=0; k<numlists; k=k+1)
for(j=0; j<listlength/2; j=j+1) begin
sum1[k][bits*j +: bits]=addthese[2*bits*j+k*bits*listlength +: bits]+addthese[bits*2*j+bits+k*listlength +: bits];
end
for(k=0; k<numlists; k=k+1)
for(j=0; j<listlength/4; j=j+1) begin
sum2[k][bits*j +: bits]=sum1[k][2*bits*j +: bits]+sum1[k][2*bits*j+bits +: bits];
end
for(k=0; k<numlists; k=k+1)
for(j=0; j<listlength/8; j=j+1) begin
sum3[k][bits*j +: bits]=sum2[k][2*bits*j +: bits]+sum2[k][2*bits*j+bits +: bits];
end
for(k=0; k<numlists; k=k+1) begin
add[k*bits +: bits]=sum3[k][0 +: bits]+sum3[k][bits +: bits];
end
end
endmodule
我希望能够快速更改代码以添加不同的长度列表。例如,我希望能够将'listlength'更改为32,并编译代码以创建一个额外的寄存器(即添加另一个成对添加步骤,以便输出保持相同的长度)。如果将“ listlength”更改为8192,则应创建相应数量的寄存器,以成对加总正确的长度输出。
基于少量研究,似乎我正在寻找的是Verilog中的generate / genvar命令。但是,我发现的所有generate示例仅创建模块实例,而不是寄存器实例,而且我甚至不确定是否可以在generate命令的一个循环中创建一个变量引用另一个。
基本上,我不太了解如何使用generate命令,也不能完全确定这是我要查找的命令。有建议吗?