【问题标题】:SystemVerilog parameters for an or function或函数的 SystemVerilog 参数
【发布时间】:2013-11-14 13:01:32
【问题描述】:

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

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] 分配的启用。

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

【问题讨论】:

  • l_en 和 l_output_grant 是否也参数化为 N 和 M?还是他们的声明是独立的?请出示他们的声明。
  • 是的。我已经编辑了。

标签: verilog system-verilog hdl


【解决方案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,模拟器将支持算子。

【讨论】:

  • 谢谢,虽然乍一看,我不认为代码在换位。我的意图是我有 N 个启用信号,并且如果任何 M 个打包输出授权的第 i 位为高,则第 i 个启用为高。不过我可能是错的,明天我会检查。谢谢。
  • 它有效,参见示例:edaplayground.com/s/6/379。由于 Icarus 的限制,我不得不删除一些 SV。关键点起作用了。
  • 干杯,我明白你现在做了什么,但不幸的是,它无法使用我拥有的信号定义,因为 l_en 不是一个压缩数字。
  • - 但我只是将我所有的信号打包到整个设计中,因为我看不出有什么不这样做的理由!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多