数组初始化可以使用或不使用'
:
int a[8] = '{0,1,2,3,4,5,6,7}; // Packed
int b[8] = {0,1,2,3,4,5,6,7}; // Unpacked
假设数组使用不可打包的类型,如int、string等,是否有正确的方法?两种方式似乎都很好。
EDA Playground 上的完整代码示例:http ://www.edaplayground.com/x/3Tc
数组初始化可以使用或不使用'
:
int a[8] = '{0,1,2,3,4,5,6,7}; // Packed
int b[8] = {0,1,2,3,4,5,6,7}; // Unpacked
假设数组使用不可打包的类型,如int、string等,是否有正确的方法?两种方式似乎都很好。
EDA Playground 上的完整代码示例:http ://www.edaplayground.com/x/3Tc
基于 IEEE 1800-2009:
数组赋值模式(1) 的优点是,它们可用于创建自定义类型的赋值模式表达式,方法是在模式前面加上类型名称。此外,分配模式中的项目可以使用诸如 '{ n{element} } 之类的语法进行复制,并且可以使用 default: 语法进行默认设置。但是,数组分配模式中的每个元素项都必须与目标数组的元素类型相同。相比之下,未打包的数组连接(2) 禁止复制、默认设置和显式类型,但它们提供了额外的灵活性,可以从任意混合的元素和数组中组合数组值。
所以:
int A3[1:3];
int A9[1:9];
A3 = '{1, 2, 3}; #legal
A9 = '{3{A3}}; #illegal
A9 = {A3, 4, 5, A3, 6}; #legal
A9 = '{9{1}}; #legal
A9 = {9{1}}; #illegal
在您所展示的简单情况下,分配模式和解包数组连接之间的功能重叠。事实上,在 SystemVerilog 的早期版本中,它们使用完全相同的语法(没有 '),但事实证明,赋值上下文类型规则过于复杂,无法使用完全相同的语法,因此添加了 ' 前缀来区分两者。