我编写了以下工作代码来计算启用信号。
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]指定的启用。
我还有其他方法吗?
答案 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,模拟器将支持操作员。