SystemVerilog宽位数组分割出错求助:将[1077:0]tmpVal拆分为49个22位元素
问题分析和修复方案
你的代码存在两个关键问题,导致分割结果不符合预期:
1. 位宽指定错误
你在部分选择中写了+: 21,但实际需要提取22位的元素,必须改为+: 22。SystemVerilog的[起始位 +: 位宽]语法中,第二个参数代表要提取的位宽,必须与目标元素的位宽匹配。
2. 起始索引计算冗余
你引入额外变量j来计算起始位,其实可以直接用i*22 +21实现相同逻辑,代码更简洁直观。
修正后的代码
bit[21:0] data[49]; for(int i=0; i<49;i++) begin data[i] = tmpVal[(i*22)+21 +: 22]; end
逻辑验证
- 当
i=0时,起始位为0*22+21=21,提取21 +:22位,对应tmpVal[21:0],符合你的期望; - 当
i=1时,起始位为1*22+21=43,提取43 +:22位,对应tmpVal[43:22]; - ...
- 当
i=48时,起始位为48*22+21=1077,提取1077 +:22位,对应tmpVal[1077:1056],刚好覆盖tmpVal[1077:0]的全部1078位(49×22=1078)。
另外,也可以用-:语法实现等价效果,代码更简洁:
for(int i=0; i<49;i++) begin data[i] = tmpVal[i*22 +: 22]; end
这里i*22 +:22表示从i*22(该段的最低位)开始,向上提取22位,与之前的写法逻辑完全一致,可根据个人习惯选择。
内容的提问来源于stack exchange,提问作者Linocomp
相关产品推荐
相关产品推荐

