在系统verilog中打包vs unpacked向量

时间:2009-01-25 12:35:03

标签: vector system-verilog

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

node [range_hi:range_lo]x;

和其他定义如下:

node y[range_hi:range_lo];

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

System Verilog中的打包和解包矢量有什么区别?

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

6 个答案:

答案 0 :(得分:14)

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

  

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

答案 1 :(得分:5)

在了解完全打包和解压缩的数组之前,还可以看看如何通过声明来了解哪个数组是什么。 打包数组在大小声明之前有一个对象名称。例如:

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].

它产生一个4(即4 * 8)字节的数组,深度为3。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

出于这个原因,我在模块的端口定义上看到了解压缩的数组。如果信号的尺寸与具有解压缩阵列的端口不完全相同,则编译器将发生错误。对于打包数组,它通常会继续并尽可能地连接事物,而不是发出错误。

答案 4 :(得分:0)

bit[3:0] a->压缩数组 压缩数组可以用作完整数组(a='d1)或仅作为数组的一部分(a[0]='b1

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

答案 5 :(得分:-1)

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

--->在上面的语句中a [0] ='b1;将适用于解压缩数组,不适用于unpkd arry的某些部分[例如,逻辑unpkd [8];],例如unpkd = 5'h7;分配相同将适用于pkd数组 -> unpkd = unpkd +2;不会为unpkd炒锅将适用于pkd