Verilog阵列的不同大小的矢量

时间:2017-02-08 21:46:05

标签: arrays multidimensional-array vector verilog system-verilog

我遇到的问题是需要分阶段收敛导线,每个阶段的输入和输出都是前一阶段的一半(想想类似于分阶段选择器)。我不希望我的模块中有未连接的电线。

我可以声明一个大小为numStages的向量数组,然后在生成循环中定义每个向量的大小吗?例如:

module Log2Alg(x, a, b);
    parameter N = 1;
    localparam numStages = $clog2(N);
    output x;
    input [N-1:0] a, b;
    wire [???] stageInputs [0:numStages-1];
    wire [???] stageOutputs [0:numStages-1];

    genvar i, j;
    generate
        for(i = 0; i < numStages; i = i + 1)
        begin: generateStage
            stageInputs[i] = [2**(N-i):0]; // ???
            stageOutputs[i+1] = [2**(N-i-1)-1:0] // ???

            // Do stuff. Loop over j = i**2-1:0
        end
    endgenerate

endmodule

我应该考虑另一种方法,还是一种方法来完成我的尝试?

1 个答案:

答案 0 :(得分:1)

您可以将电线的声明移动到generate循环中,而不是将它们作为数组。

module Log2Alg #(N=1) (
    output x, 
    input [N-1:0] a, b
    );
    localparam numStages = $clog2(N);


    genvar i, j;
    generate
        for(i = 0; i < numStages; i = i + 1)
        begin: generateStage
        wire stageInputs [2**(N-i):0];
        wire stageOutputs [2**(N-i-1)-1:0];
            // Do _stuff_. Loop over j = i**2-1:0
            //
        end
    endgenerate

endmodule

然后,如果您需要访问与当前内容不同的阶段的电线,您可以使用类似generateStage[i+1].stageInputs的内容。您使用访问generateStage的索引必须是常量,因为它实际上不是相同元素的数组。