返回介绍

第四章 数组

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

主题

主题描述
4.1 简介(一般信息)数组是变量的集合,这些变量具有相同的数据类型,并可以使用相同的名字加上一个或多个索引来访问。

在C语言中,数组从0开始并以整数的形式进行索引,或者将其转换成指针。尽管整个数组可以作为一个整体被初始化,但在过程语句中,它的每一个元素必须被分离地读或写。

在Verilog-2001中,数组使用从左边界到右边界的顺序进行索引。如果它们是向量,它们还可以作为一个整体赋值,而如果他们是数组则不允许这样做。在Verilog-2001中允许多维数组。

在Verilog-2001中,所有的数据类型都可以声明成数组。reg、wire以及所有其它线网类型还可以具有向量宽度。在对象名字之前声明的尺寸被称作是“向量宽度”尺寸。在对象名字之后声明的尺寸被称为“数组”尺寸。

4.2 压缩与非压缩数组压缩数组提供了一种将向量细分成子域的机制,这些子域可以作为数组元素方便地访问。这就可以保证压缩数组能够被表示成一个连续的位组(FPGA技术网提示:是指可以在内存中连续分配存储空间)。一个非压缩数组既可以这样表示也可以不这样表示(FPGA技术网提示:是指仿真器可以选择如何安排存储空间)。压缩数组与非压缩数组的不同之处在于:当一个压缩数组作为一个整体出现的时候,它被当作是单一的向量。

如果一个压缩数组被声明成有符号的,那么作为单一向量看待的数组也是有符号的。数组的单个元素是无符号的,除非它们的类型是被声明成有符号的命名类型。一个压缩数组的部分选择也是无符号的。

压缩数组可以是任意长度的整数类型(关于整数类型参见3.3节),因此,尺寸为48的压缩数组可以由48位组成,然后这个压缩数组就可以使用在48位算术表达式中。一个压缩数组可以实现的最大尺寸可以是有限制的,但最少应该可以实现65536(216)的长度。

压缩数组可以仅由单位整数数据类型(bit、logic、reg、wire以及其他线网类型)组成,也可以由其它能够递归成单位整数类型的压缩数组和压缩结构体组成。

具有预定义宽度的整数类型不能声明成压缩数组。这些类型是:byte、shorting、int、longint、以及integer。一个具有预定义宽度的整数类型可以被看作是一个一维的压缩数组。这些整数类型的压缩尺寸应该以趋向0的方向编号,并且最右边的索引是0。

4.3 多维数组于Verilog的存储器类型类似,在类型之后声明的尺寸设置压缩尺寸,在实例之后的尺寸设置非压缩尺寸。
4.4 数组的索引与分片一个表达式可以选取压缩数组的一部分,或者选取任何整数类型,并假定具有趋向0的编号方式。

SystemVerilog使用术语“部分选择(part selet)”来表示从一个单维压缩数组中选取一个或多个连续的位。这与Verilog中对术语“部分选择”的使用是一致的。

4.5 数组查询函数SystemVerilog提供了新的系统函数来返回有关数组的信息。包括:$left、$right,、$low,、$high,、$increment、$size、以及$dimensions。这些函数将在23.7节中描述。
4.6 动态数组动态数组是一维的非压缩数组,它的尺寸可以在运行时设置或改变。动态数组的存储空间只有当数组在运行时被显式产生之后才会存在。

动态数组的声明语法如下:

4.7 数组赋值对固定尺寸的非压缩数组赋值要求源数组和目的数组都具有相同非压缩维数,并且每一维的长度都必须相同。赋值通过将源数组的每一个元素赋值给目的数组的对应元素来实现,它要求源数组与目的数组具有兼容的类型。兼容类型是指在赋值操作上能够兼容的类型。在尺寸不等的固定尺寸非压缩数组间赋值会导致类型检查错误。
4.8 将数组作为自变量数组可以作为自变量传递给任务或函数。数组自变量通过值进行传递的规则与数组赋值的规则相同(参见10.4节)。当数组自变量通过值传递的时候,一个数组的拷贝被传递给调用任务或函数。这条规则适用于所有的数组类型:固定尺寸数组、动态数组、或联合数组。

注意:未定义尺寸的维数只能出现在动态数组中,或者出现在导入DPI函数的形式变量中。如果一个形式变量的一维是未定义尺寸的,那么真实变量中对应维数具有任意尺寸也是可以接受的。

例如:

4.9 联合数组对于处理成员数目会动态改变的连续变量集合而言,动态数组非常有用。然而,当集合的尺寸是未知的或者数据空间紧缺的时候,联合数组则是更好的选择。联合数组在使用之前不会分配任何存储空间,并且索引表达式不再被限制成integral表达式,而是可以具有任何数据类型。

联合数组实现了一个所声明类型的元素的查找表。用作索引的数据类型作为查找表的查找键值,并强制了一种顺序。

联合数组的声明语法如下:

4.10 联合数组方法除了索引操作符之外,SystemVerilog提供了几个内建方法来允许用户分析和处理联合数组,同时提供了对联合数组的索引或键值的迭代处理。
4.11 联合数组赋值联合数组只能被赋值为另外一个具有兼容类型并且具有相同索引类型的联合数组。其它的数组类型不能赋值给一个联合数组,而联合数组也不能赋值给其它类型的数组,无论是固定尺寸数组还是动态动态数组。

将联合数组赋值给另外一个联合数组会先将目的数组中所有现存条目清除,然后再将源数组中的每一个条目拷贝到目的数组。

4.12 联合数组自变量作为自变量的联合数组只能传递给具有兼容类型并具有相同索引类型的联合数组。其它类型的数组,无论是固定尺寸数组还是动态数组,都不能传递给使用联合数组作为自变量的子程序。同样,联合数组也不能传递给使用其它类型的数组作为自变量的子程序。

通过值传递一个联合数组会产生联合数组的本地拷贝。

4.13 联合数组文本联合数组文本值使用{index:value}这样的语法并带有可选的缺省索引。与所有其它数组一样,联合数组可以一次只写一个条目,或者使用数组文本替代整个数组内容。
4.14 队列队列是一个相同元素的可变尺寸的有序集合。队列能够以常量时间访问它的所有元素,也能够以常量时间在队列的尾部和头部插入和删除元素。队列中的每一个元素都通过一个序号来标识,这个序号代表了元素在队列内的位置,0代表第一个元素,$代表最后一个元素。队列类似于一个一维的非压缩数组,它可以自动地增长和缩减。因此,与数组一样,队列可以使用索引、串联、分片、相等操作符进行处理。

队列使用与非压缩数组相同的语法声明,但可以使用$作为数组尺寸。队列的尺寸可以通过指定可选的右边界(最后一个索引)进行限制。

4.15 数组处理方法SystemVerilog提供了几个内建的方法来方便数组的搜索、排序和缩减。

调用这些数组方法的基本语法如下:

链接

主题

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

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

发布评论

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