You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 11:12:45