0

我编写了以下工作代码来计算启用信号。

logic            l_en [0:N-1];
logic    [0:N-1] l_output_grant [0:M-1];

always_comb begin
  for (int i=0; i<N; i++) begin
    l_en[i]   = |{l_output_grant[0][i], 
                  l_output_grant[1][i], 
                  l_output_grant[2][i], 
                  l_output_grant[3][i], 
                  l_output_grant[4][i]};
  end
end

我现在正在尝试将代码更改为 [0] 到 [4] 的参数。我尝试了以下代码

logic            l_en [0:N-1];
logic    [0:N-1] l_output_grant [0:M-1];

always_comb begin
  for(int i=0; i<N; i++) begin
    for(int j=0; j<M; j++) begin
      l_en[i]   = |l_output_grant[j][i]; 
    end
  end
end

这是行不通的。我认为这是因为它会在 j 的每次迭代中重新计算,因此如果 [j+1][i] 较低,则清除由 [j][i] 分配的启用。

请问我还有什么其他方法可以做到这一点?

4

1 回答 1

0

l_en[i] = |l_output_grant[j][i]覆盖预览分配。此外,|l_output_grant[j][i]它是一个信号位的按位或运算符,它什么都不做。

对于所需的功能,请使用按|=位运算符;l_en |= l_output_grant[j]. 或者,使用传统的 Verilog 方法l_en = l_en | l_output_grant[j]l_en请记住通过在 for 循环之前分配全零来清除旧值。未能清除这些值将创建锁存器并防止任何从高到低的转换发生。由于宽度匹配,for(i=...)因此不需要循环。

always_comb begin
  l_en = '0; // all bits to zero
  for(int j=0; j<M; j++) begin
    l_en |= l_output_grant[j];
    // equivalent to: l_en[0:N-1] = l_en[0:N-1] | l_output_grant[j][0:N-1];
  end
end

注意:如果合成器不支持|=运算符,请使用 Verilog 样式。如果支持 SystemVerilog,模拟器将支持操作员。

于 2013-11-14T17:57:46.220 回答