Verilog:创建许多不同长度的寄存器/ generate / genvar命令

时间:2019-03-22 02:06:09

标签: verilog fpga

在一个模块中,我想制作许多不同长度的寄存器,并在每个时钟周期在这些寄存器之间发送信息。具体来说,我正在尝试创建一个模块,该模块通过将成对的元素成对添加到新列表中,然后继续进行直到有一个元素,来有效地添加列表中的所有元素。

类似于以下内容,其中输入代表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命令,也不能完全确定这是我要查找的命令。有建议吗?

0 个答案:

没有答案