29

查看我在 System Verilog 中维护的一些代码,我看到一些信号定义如下:

node [range_hi:range_lo]x;

以及其他定义如下:

node y[range_hi:range_lo];

我知道这x被定义为打包,而y被定义为未打包。但是,我不知道这意味着什么。

System Verilog 中的压缩向量和非压缩向量有什么区别?

编辑:响应@Empi 的回答,为什么在 SV 中编写的硬件设计师应该关心数组的内部表示?是否有任何时候我不应该不能使用打包信号?

4

7 回答 7

16

本文提供了有关此问题的更多详细信息: http ://electrosofts.c​​om/systemverilog/arrays.html ,尤其是第 5.2 节。

打包数组是一种将向量细分为子字段的机制,这些子字段可以作为数组元素方便地访问。因此,可以保证打包数组表示为一组连续的位。解压缩的数组可能会或可能不会如此表示。打包数组与未打包数组的不同之处在于,当打包数组作为主数组出现时,它被视为单个向量。

于 2009-01-25T13:02:38.240 回答
4

在了解确切的打包和解包数组是什么之前,让我们看看如何仅通过它们的声明就知道哪个数组是什么。压缩数组在大小声明之前有一个对象名称。例如:

bit [3][7] a;

未打包的数组在大小声明之后有一个对象名称。例如:

bit a[3];

打包的数组会产生内存,而未打包的则不会。您也可以像这样访问/声明未打包的数组

reg unpacked_array [7:0] = '{0,0,0,0,0,0,0,1};

您可以混合打包和解包数组来制作多维内存。例如:

bit [3:0][7:0]a[2:0].

它创建一个深度为 3 的 4(即 4*8)字节数组。

于 2012-04-12T10:58:58.950 回答
3

当我们写一个 [3:0][7:0]A[4:0] 时,压缩数组主要用于有效的内存使用,这意味着在 32 位内存位置中,每个 8 位的 4 个切片被打包以形成一个 32 位。右侧的值表示那里有 5 个这样的切片。

于 2016-09-07T14:19:24.233 回答
3

bit[3:0] a-> 打包数组 打包数组可以用作完整数组 ( a='d1) 或只是数组的一部分 ( a[0]='b1)

bit a [3:0]-> unpacked array 解压后的数组不能用作a[0]='b1,它必须用作完整的a={8{'b1}}

于 2018-09-24T08:01:10.240 回答
0

未打包的数组将比打包数组提供更多的编译时错误检查。

出于这个原因,我在模块的端口定义上看到了未打包的数组。如果信号的维度与未打包数组的端口不完全相同,编译器将出错。对于打包的数组,它通常会继续尽可能地连接东西,而不是发出错误。

于 2017-12-05T01:42:15.840 回答
0

验证学院给出了很好的解释。

一个压缩数组可以想象成一个单行 n 列的数组。n vectors

而一个未打包的数组可以想象为n 列和 m 行的 a。"n" vectors and "m" unpacked dimensionsmatrix/2D array

于 2022-02-01T10:54:34.483 回答
-1

bit a [3:0] -> unpacked array 解压后的数组不能作为 a[0]='b1 使用,必须作为完整的 a={8{'b1}}

---> 在上面的语句中 a[0] ='b1; 将适用于未打包的数组,它不适用于 unpkd 数组的某些部分[例如逻辑 unpkd [8];],如 unpkd = 5'h7; 分配同样适用于 pkd 数组 --> unpkd = unpkd +2; 不会为 unpkd 工作 将适用于 pkd

于 2020-10-15T17:05:09.077 回答