我有一个关于具有多个打包维度的符号属性的问题,该属性使用 typedef 分阶段定义。
基本上
logic signed [1:0][2:0] foo;
* foo[0] 没有符号(如果你期望有符号的元素,有符号是没有意义的(,因为所有整个打包数组都是有符号的,但每个元素都没有符号。
但
typedef logic signed [1:0] foo_t;
foo_t [2:0] foo;
* foo[0] 已签名。真奇怪..
Q1>会发生什么?为什么签名??
Q2> 是否与 逻辑签名 [1:0][2:0] foo;//??
Q3>LRM说[1:0]指数变化最快,这不是我的预期。 逻辑签名 [2:0][1:0] foo;//??
这是允许语法 (BNF( 的工件。signed
关键字将符号应用于整个标识符,而不是您正在打包的单个元素 ( logic
(。除了您发现的 typedef 阶段之外,没有任何语法允许您控制每个维度的符号性。
分阶段创建多维数组时,您添加的每个维度的变化速度都低于前一个维度。所以在维度上,你的 typedef 等价于
logic signed [2:0][1:0] foo;
foo_t [2:0] foo; // the [2:0] gets added to the left of [1:0]
如果使用解压缩数组,我们还可以为每个元素保留签名属性。
logic signed [1:0] foo [2:0];
但是,系统verilog似乎不支持带有解压缩数组的typedef数组。
typedef logic signed data_t [3:0];
data_t [2:0] foo;
当我尝试这样做时,编译器显示错误
"矢量的非法元素类型(矢量元素类型必须是整型("。 - 您可以对此发表任何评论。
无论如何,感谢您的回答。