一个或函数的SystemVerilog参数

时间:2013-11-14 13:01:32

标签: verilog system-verilog hdl

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

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]指定的启用。

我还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

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]。请记住通过在for循环之前将l_en分配给全零来清除旧值。未能清除值将创建锁存器并防止任何从高到低的转换发生。由于宽度匹配,因此不需要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,模拟器将支持操作员。