用于生成for循环的初始迭代器

时间:2014-04-03 20:28:23

标签: for-loop verilog

在生成循环中,您经常需要在数组内容开始之前将第一次导线连接连接到输入(或一些独特的导线)。下面粘贴的是来自可参数化的OR-Reduce模块的片段(我的赋值需要结构verilog,因此oOUt = |adjA不合法。

for(i=0; i<depth; i=i+1) begin : lvl
  localparam iWidth = p2Width>>i;
  localparam oWidth = iWidth>>1;
  wire [oWidth-1:0] tmp;
  if(i==0) begin
    or2$ reduce [oWidth-1:0]
      (tmp, adjA[iWidth/2-1:0], adjA[iWidth-1:iWidth/2]);
  end else begin
    or2$ reduce [oWidth-1:0]
      (tmp, lvl[i-1].tmp[iWidth/2-1:0], lvl[i-1].tmp[iWidth-1: iWidth/2]);
  end
end

我必须把这个讨厌的if语句用来捕获第一次迭代并将它连接到输入。问题是我不能只将初始i值更改为1并在for循环外声明lvl[0].tmp。如果这是合法的话,我认为这样看起来会更好。

wire [p2Width-1] lvl[0].tmp;
or2$ reduce [oWidth-1:0]
  (lvl[0].tmp, adjA[iWidth/2-1:0], adjA[iWidth-1:iWidth/2]);
for(i=1; i<depth; i=i+1) begin : lvl
  localparam iWidth = p2Width>>i;
  localparam oWidth = iWidth>>1;
  wire [oWidth-1:0] tmp;
  or2$ reduce [oWidth-1:0]
    (tmp, lvl[i-1].tmp[iWidth/2-1:0], lvl[i-1].tmp[iWidth-1: iWidth/2]);
end

有没有办法清理我的生成循环?

1 个答案:

答案 0 :(得分:0)

您可以将输入数组声明为比所需更宽的一个条目。我发现这通常会产生更易读的代码:

logic [N_LEVELS:0]      block_inputs;     // Last entry not used, optimised away
logic [N_LEVELS-1:0]    block_outputs;

// Start of pipeline
assign block_inputs[0] = stage1_input;

genvar i;
generate
for (i=0; i<N_LEVELS; i++) begin: levels
    some_block i_some_block (
        .data       (block_inputs[i]),
        .result     (block_outputs[i])
    );

    assign block_inputs[i+1] = block_outputs[i];
end
endgenerate

assign final_result = block_outputs[N_LEVELS-1];