【问题标题】:Verilog array of different sized vectors不同大小向量的 Verilog 数组
【发布时间】:2017-02-08 21:46:05
【问题描述】:

我有一个问题,需要分阶段向下汇聚线,其中每个阶段的输入和输出是前一个阶段的一半(类似于分段选择器)。我不想在我的模块中有未连接的电线。

我可以声明一个大小为 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

我是否应该考虑另一种方法,或者实现我正在尝试的方法?

【问题讨论】:

  • 为什么不在生成块中定义电线?这样您就可以调整导线尺寸,并且可以像访问数组一样访问。 (例如generateStage[3].stageInputs)
  • 你能合并一个stage的2个输出线还是所有输出都不一样?你有几个阶段?

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


【解决方案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

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

【讨论】:

  • 后续问题:有什么方法可以创建或访问隐式 generateStage[-1]?
  • 您可以在 -1 处开始生成循环。您还可以在 stuff 代码周围放置条件生成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
相关资源
最近更新 更多