返回介绍

4.2 压缩与非压缩数组

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

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

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

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

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

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

byte c2;     // 与bit [7:0] c2相同;
integer i1;  // 与logic signed [31:0] i1相同;

非压缩数组可以由任何类型组成。SystemVerilog增强了固定尺寸非压缩数组的能力:除了所有变量类型外,非压缩数组还可以由对象句柄(参见11.4节)和事件(参见13.5节)组成。

除了可以使用一个范围值来指定非压缩数组的尺寸外,SystemVerilog还可以像C一样使用单个数值来指定非压缩数组的尺寸。也就是说,[size][0:size-1]相同。例如:

int Array[8][32]; // 与int Array[0:7][0:31];相同

下面的操作可以对所有的数组(压缩的或非压缩的)进行操作。例子假定AB是具有相同形状和相同类型的数组。

  • 读和写数组,例如,A = B
  • 读和写数组的片断,例如,A[i:j] = B[i:j]
  • 读和写数组的可变片断,例如,A[x+:c] = B[y+:c]
  • 读和写数组的一个元素,例如,A[i] = B[i]
  • 数组或数组片断的相等操作,例如,A==B, A[i:j] != B[i:j]

下面的操作只能用于压缩数组而不能作用于非压缩数组。例子假定A是一个数组。

  • 从一个整数赋值,例如, A = 8'b11111111
  • 作为一个整数在表达式中使用,例如,(A + 3)

如果一个非压缩数组被声明成有符号的,那么数组的单个元素也是有符号的,因为非压缩数组不能被看作单个向量。

当为一个非压缩数组赋值的时候,源数组和目的数组必须具有相同的非压缩尺寸,并且每一维的长度也必须是相同的。非压缩数组的赋值可以通过将源数组的每一个元素赋值到目的数组的对应元素来实现。注意:非压缩数组的元素可以是一个压缩数组。

为了进行赋值,一个压缩数组可以当作一个向量来使用。任何压缩数组都可以赋值为任意向量表达式。目的压缩数组的边界不会影响赋值。如果不使用显式的强制类型转换,一个压缩数组不能够直接赋值到一个非压缩数组。

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

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

发布评论

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