返回介绍

4.3 多维数组

发布于 2020-09-09 22:55:44 字数 1278 浏览 1179 评论 0 收藏 0

于Verilog的存储器类型类似,在类型之后声明的尺寸设置压缩尺寸,在实例之后的尺寸设置非压缩尺寸。

bit [3:0][7:0] joe [1:10]; // 10个4字节的条目(压缩成32位)

上面声明的数组可以作如下的使用:

joe[9] = joe[8] + 1;       // 四字节加
joe[7][3:2] = joe[6][1:0]; // 两字节拷贝

注意:在类型之后、名字之前声明的维数(上面例子中的[3:0][7:0])比在名字之后声明的维数(上面例子中的[1:10])变化要快。在使用的时候,第一维([3:0])之后跟着第二维([1:10])。

与C语言一样,在一系列维数中,最右边的一维变化的最快。然而,压缩维数要比非压缩维数变化的快。

bit [1:10] foo1 [1:5];          // 1到10变化最快,兼容于Verilog-2001数组
bit foo2 [1:5][1:10];           // 1到10变化最快,兼容于C
bit [1:5][1:10] foo3;           // 1到10变化最快
bit [1:5][1:6] foo4 [1:7][1:8]; // 1到6变化最快,然后是1到5,再然后是1到8,
                                // 最后是1到7

多个压缩维数还可以使用typedef定义。

typedef bit [1:5] bsix;
bsix [1:10] foo5; // 等价于bit [1:10][1:5],1到5变化最快

多个非压缩维数也可以使用typedef定义。

typedef bsix mem_type [0:3]; // 四个’bsix’元素的数组
mem_type bar [0:7];          // 八个’mem_type’元素的数组

当数组以较少数目的维数使用的时候,它们必须是变化最慢的那些维数。

bit [9:0] foo6;
foo6 = foo1[2]; // 一个10位的粒度

就像Verilog-2001一样,可以使用逗号来分割一个数组声明的列表。列表中的所有数组具有相同的数据类型和相同的压缩数组维数。

bit [7:0][31:0] foo7 [1:5][1:10], foo8 [0:255]; // 声明了两个数组

如果索引表达式超出了地址边界或者地址中的任一位是X或Z,那么这个索引是无效的。如果使用无效索引读取数组,那么会返回数组元素类型的缺省值。使用无效索引写入数组不会引起任何操作。如果使用无效索引进行数组的读写操作,EDA工具在实现的时候可以返回一个警告信息。

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

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

发布评论

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