循环中位切片时归约OR运算不符合预期问题排查
循环中位切片宽度错误导致结果不符预期
你的问题根源是位切片的宽度参数写错了:循环里用了+: 1,但实际需要的是+: 2。
Verilog的起始索引 +: 宽度语法中,宽度指定了要截取的元素数量(对多维数组)或位数(对位向量)。你的quad_mask_dq_qq是[3:0][1:0]类型,即包含4个2位元素的数组。你期望的逻辑是每2个元素的所有位做或运算:
dfifo_rrdy_qq[0] = (|quad_mask_dq_qq[1:0]):取索引0、1的两个元素,对它们的所有位做或dfifo_rrdy_qq[1] = (|quad_mask_dq_qq[3:2]):取索引2、3的两个元素,对它们的所有位做或
但原循环里的2*qq +: 1只截取了1个元素,结合Verilog数组赋值的顺序({2,0,0,1}会把第一个值2赋给最高索引quad_mask_dq_qq[3],最后一个值1赋给最低索引quad_mask_dq_qq[0]),实际执行逻辑是:
- 当
qq=0时,仅取quad_mask_dq_qq[0](值为1),或运算结果为1; - 当
qq=1时,仅取quad_mask_dq_qq[2](值为0),或运算结果为0;
这和你实际得到的{0,1}出入,说明你可能同时搞反了元素对的处理顺序,若想先处理高索引的元素对,起始索引需调整为3 - 2*qq,同时宽度保持2。
修正后的循环代码如下:
always_comb begin for (int qq = 0; qq < 2; qq++) begin dfifo_rrdy_qq[qq] = (|quad_mask_dq_qq[2*qq +: 2]); // 将宽度从1改为2 end end
这样:
qq=0时,截取quad_mask_dq_qq[1:0](索引0、1的元素,值为1、0),或运算结果为1|0=1;qq=1时,截取quad_mask_dq_qq[3:2](索引2、3的元素,值为0、2),或运算结果为0|2=1;
最终dfifo_rrdy_qq就是你期望的{1,1}。
如果你的本意是把quad_mask_dq_qq当作连续的8位位向量(而非4个独立的2位元素),可以把变量定义改为logic [7:0] quad_mask_dq_qq,此时循环中的位切片逻辑依然适用,结果一致。
内容的提问来源于stack exchange,提问作者GFaz23
相关产品推荐
相关产品推荐

