如何反转一些打包数组
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 节表达式位长度。
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 节表达式位长度。