首页 > 解决方案 > 使用 typedef + 压缩数组(与多维压缩数组相比)的每个元素的有符号类型是否有效

问题描述

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

标签: typedefsystem-verilogsignedpacked

解决方案


这是允许的语法(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]

推荐阅读