1

我有一个关于具有多个打包维度的签名属性的问题,该属性是使用 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; //??

4

2 回答 2

4

这是允许的语法(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]
于 2019-07-26T14:10:30.813 回答
0

如果使用解包数组,我们还可以为每个元素保留有符号属性。

logic signed [1:0] foo [2:0];

但是,systemverilog 似乎不支持带有解压数组的 typedef 数组。

typedef logic signed data_t [3:0];
data_t [2:0] foo;

当我尝试这个时,编译器显示错误

“向量的非法元素类型(向量元素类型必须是整数类型)”。- 您可以对此发表任何评论。

无论如何,谢谢你的回答。

于 2019-07-31T02:16:20.540 回答