如何反转一些打包数组

How to invert a bit of a packed array

logic [4:0] count_zeros;
logic [2:0] id;
integer i;
logic [7:0] [15:0] vld;

always@*
begin
  count_zeros = 5'b0; 
  for (i=0; i<2; i=i+1)
    count_zeros = count_zeros + ~vld[id][i];
end

对于输入 d8,我得到 count_zeros 作为 1e。我的预期输出是 2。上面的代码片段有什么问题?

~ 是位取反,! 是逻辑取反。我哪里错了?

Verilog 扩展单个位值 (vld[id][i]) 以匹配它所在的表达式的宽度,由于 count_zeros 信号,它是 5 位。这是在 应用按位反转运算符之前完成的。由于 vld[0][0]1'b0,因此 1'b0 扩展为 5'b00000。然后 ~(5'b00000) 结果为 5'b11111.

创建一个1位信号,如temp,直接设置为反转后的位值。然后在加法表达式中使用它。

logic temp;

always @* begin
    count_zeros = 5'b0;
    for (i=0; i<2; i=i+1) begin
        temp = ~vld[id][i];
        count_zeros = count_zeros + temp;
    end
end

参考 IEEE Std 1800-2017,第 11.6 节表达式位长度