返回介绍

7.13 非压缩数组表达式

发布于 2020-09-09 22:55:47 字数 1705 浏览 1144 评论 0 收藏 0

表达式中也可以使用花括号来为非压缩数组赋值。与C语言不同的是,表达式必须在元素与元素之间达到匹配,并且花括号必须匹配数组维数。在数组中对应元素类型的赋值关联文中,每一个表达式的元素都会被计算。这也就意味着,与上面的相似赋值不同,下面的例子不会发布尺寸警告信息:

bit unpackedbits[1:0] = {1,1}; // 不会发布警告信息,因为bit可以被设置成1
int unpackedints[1:0] = {1'b1, 1'b1}; // 不会发布警告信息,因为int可以被
                                      // 设置成1'b1

乘串联的语法也可以使用在非压缩数组表达式中。每一个复制均代表数组中的一维。

unpackedbits = {2{y}};         // 与{y, y}相同
int n[1:2][1:3] = {2{{3{y}}}}; // 与{{y,y,y},{y,y,y}}相同

当花括号使用在一条赋值语句的关联文中的时侯,由SystemVerilog确定花括号的关联文。如果花括号使用在一条对非压缩数组赋值的关联文中,那么花括号代表一个非压缩数组文本或表达式。在赋值语句右侧关联文之外,花括号必须与一个显式的强制类型转换一起使用以便将它与串联区分开来。

注意:一个集合表达式不能用作赋值的目标。下面的例子被认为是非法的:

logic [2:0] a[1:0];
logic [2:0] b, c;
always {b,c} = a; // 非法赋值,花括号不能被解析成一个非压缩数组表达式

有时我们希望将数组元素设置成某一个值而无需知道数组到底有多少个成员。这种方式可以使用default关键字来实现:

initial unpackedints = {default:2}; // 将数组元素设置为2

对于更多的结构体数组,指定一个或多个匹配类型键值非常有用,正如下面的结构体表达式所演示的那样。

struct {
    int a;
    time b;
} abkey[1:0];

abkey = {{a:1, b:2ns}, {int:5, time:$time}};

当花括号包含了一个类型键值或缺省键值的时候,无论对于压缩数组类型还是非压缩数组类型,花括号都不应被解释成串联。

非压缩数组的匹配规则如下:

  • index:value显式地为键入的数组索引指定一个值。这个值在为被索引的元素赋值的关联文中计算,并应该被强制转换成元素的类型。在单个数组表达式中多次为相同索引的元素指定值是错误的。
  • 对于type:value,如果非压缩数组的元素或子数组的类型等价于type指定的类型,那么每一个元素或子数组都应被设置成value指定的值。这个值必须能够被强制转换成数组元素或子数组类型。如果非压缩数组是多维的,那么需要使用本节描述的规则以及类型和缺省键值递归地深入到每一个子数组。另外,如果非压缩数组是一个结构体数组,那么需要使用结构体表达式规则以及类型和缺省键值递归地深入到数组的每一个元素。如果多个类型匹配于相同的元素,那么使用最后一个值。
  • 对于没有被本节前面几条规则所涵盖的非压缩数组元素,由default:value指定它们的值。这个值在对由default所涵盖的每一个元素的赋值关联文中计算,并且必须能够被强制转换成数组元素类型。

每一个元素都应该被其中的一条规则所涵盖。

如果类型键值、缺省键值、或复制操作符被用于一个具有边带效应的表达式,那么表达式的计算次数是未定义的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文