System Verilog中的packed向量与unpacked向量对比

31

我在维护一些System Verilog代码时发现了一些被定义为这样的信号:

node [range_hi:range_lo]x;

还有一些定义方式如下:

node y[range_hi:range_lo];

我了解到x被定义为packed,而y被定义为unpacked。但是,我不知道这意味着什么。

在System Verilog中,紧缩和非紧缩向量之间有什么区别?

编辑:回应@Empi的答案,为什么一个使用SV编写的硬件设计师要关心数组的内部表示方式?是否存在我不能或不应该使用紧缩信号的情况?

7个回答

16

这篇文章详细介绍了一个问题: http://electrosofts.com/systemverilog/arrays.html,特别是第5.2节。

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


3
一个压缩数组与一个未压缩数组的区别在于,当一个压缩数组出现为主要元素时,它被视为单个向量。 - Mah35h

5
在了解什么是打包和解包数组之前,让我们看看如何通过它们的声明来知道哪个数组是什么。 打包数组有一个对象名称,该名称位于大小声明之后。例如:
bit [3][7] a;

其中a是一个28位向量,分为3个7位子字段。

未打包的数组具有在大小声明之前出现的对象名称。例如:

bit b [3];

b 是一个宽度为 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)字节数组。


4
“Packed array make memory whereas Unpacked dont.” 这句话的意思是,打包数组会占用存储空间,而未打包的数组则不会占用存储空间。有很多FPGA综合工具可以将未打包的数组转换成某种类型的内存(无论是寄存器还是RAM)。 - Tom Verbeure

3

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

bit a [3:0] -> 非打包数组 非打包数组不能像这样使用 a[0]='b1', 它必须被用作完整的数组 a={8{'b1}}


3

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


1
verification academy有一个很好的解释。
一个包装数组由n向量组成,可以想象成单行n列的数组。
而一个由"n"个向量和"m"未打包的维度组成的未打包数组可以想象成一个n列m行的矩阵/2D数组。

0

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

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


-1

bit a [3:0] -> 未打包的数组。未打包的数组不能像a[0]='b1那样使用,必须使用完整的a={8{'b1}}。

---> 在上述语句中,a[0] ='b1; 对于未打包的数组可以工作,但对于某些部分未打包的数组[例如逻辑未打包[8];],如unpkd = 5'h7;赋值相同,将适用于已打包的数组 --> unpkd = unpkd +2; 对于未打包的数组不起作用,但对于已打包的数组起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接