SystemVerilog不同索引顺序等长非打包数组赋值行为咨询
SystemVerilog反向索引非打包数组赋值行为解答
现有两个长度相同、索引顺序相反的int型非打包数组定义:
int a [10:1]; int b [1:10];
执行连续赋值操作:
assign b = a;
针对三个选项的判断如下:
- 选项1错误:两个数组均为一维int非打包数组,长度均为10,类型和维度完全匹配,赋值操作合法。
- 选项2错误:该行为是部分工具未严格遵循标准的实现结果,不属于规范定义的正确行为。
- 选项3正确:符合IEEE 1800 SystemVerilog标准的定义。
标准依据
根据IEEE 1800规范,非打包数组赋值时按**序数位置(ordinal position)**匹配元素,而非直接匹配索引数值:
数组声明的范围[left:right]中,左边界对应第0个序数位置,向右依次递增,右边界对应最后一个序数位置。非打包数组赋值时,相同序数位置的元素一一对应赋值。
对应到示例中的数组:
- a[10:1]的序数位置0对应a[10],位置9对应a[1]
- b[1:10]的序数位置0对应b[1],位置9对应b[10]
最终赋值结果为b[1]=a[10]、b[2]=a[9]……b[10]=a[1],即镜像索引赋值。
商用工具出现结果差异,是因为部分早期工具的实现未严格遵循标准规范,采用了索引值直接匹配的逻辑,不属于标准要求的正确行为。
内容的提问来源于stack exchange,提问作者Fischreiher
相关产品推荐
相关产品推荐

