or函数的SystemVerilog参数

or函数的SystemVerilog参数,verilog,system-verilog,hdl,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_ou

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

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:N-1]l_输出_授予[0:M-1]; 总是从梳子开始
for(int i=0;i
l_en[i]=|l_输出授权[j][i]
覆盖预览赋值。另外,
|l_输出授权[j][i]
是对信号位的位或运算符,它不起任何作用

对于所需的功能,使用
|=
逐位运算符;
l|en |=l|u输出授权[j]
。或者,使用传统的Verilog方法
l|en=l|u输出授权[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
始终\u开始
l_en='0;//所有位归零

对于(int j=0;jAre l_en和l_output_grant也被参数化为N和M?或者它们的声明是独立的?请显示它们的声明。是的。我已经编辑了。谢谢,尽管乍一看,我认为代码没有转置。我的意图是我有N个启用信号,如果任何M压缩输出拨款都很高。但我可能错了,我明天会检查。谢谢。它有效,请参见示例:。由于Icarus的限制,我不得不删除一些SV。关键点有效。干杯,我知道你现在所做的,但不幸的是,使用我的信号定义它不起作用,因为l_en不是压缩数。-但我只是去ng在整个设计中打包我的所有信号,因为我看不出有任何理由不打包!
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