For loop 生成for循环的初始迭代器

For loop 生成for循环的初始迭代器,for-loop,verilog,For Loop,Verilog,在生成循环中,通常需要在数组开始工作之前,将第一次迭代的导线连接到输入(或某组独特的导线)。下面粘贴的是我的可参数化模块或Reduce模块的一个片段(我的任务需要结构化的verilog,因此oOUt=| adjA是不合法的) 有什么方法可以清理我的生成循环吗?您可以将输入数组声明为比要求宽一个条目。我发现这通常会导致更可读的代码: logic [N_LEVELS:0] block_inputs; // Last entry not used, optimised away lo

在生成循环中,通常需要在数组开始工作之前,将第一次迭代的导线连接到输入(或某组独特的导线)。下面粘贴的是我的可参数化模块或Reduce模块的一个片段(我的任务需要结构化的verilog,因此
oOUt=| adjA
是不合法的)


有什么方法可以清理我的生成循环吗?

您可以将输入数组声明为比要求宽一个条目。我发现这通常会导致更可读的代码:

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];
逻辑[N\u级别:0]块\u输入;//未使用最后一个条目,已优化
逻辑[N_电平-1:0]块_输出;
//管道的开始
分配块_输入[0]=阶段1_输入;
genvar i;
生成

对于(i=0;iSo您的解决方案是不要在for循环中声明我的
tmp
导线,而是预先分配我在循环中需要的每条导线?我有时会这样做,但有些实现有疯狂的导线,并且预先计算所有必要的导线并不总是那么容易。创建这些临时值的能力可以让事情变得更糟更简单更干净,所以我想要一个解决方案(如果可能的话)这仍然保留了临时互连。@Aggieboy如果您想避免在生成循环中使用If语句,我认为您无法避免至少预分配一些布线。通常,您可以将此类结构描述重新分解为更可读的更高级别描述,但您无法这样做。我发现示例样式比您的OP更容易阅读,查看和评估其他可能性会很有趣。
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
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];