Vector 系统verilog中的压缩向量与非压缩向量

Vector 系统verilog中的压缩向量与非压缩向量,vector,system-verilog,Vector,System Verilog,查看我在System Verilog中维护的一些代码,我看到一些信号定义如下: node [range_hi:range_lo]x; node y[range_hi:range_lo]; 以及其他定义如下: node [range_hi:range_lo]x; node y[range_hi:range_lo]; 我知道x被定义为打包,而y被定义为未打包。然而,我不知道这意味着什么 系统Verilog中的压缩向量和非压缩向量有什么区别 编辑:回应@Empi的回答,为什么用SV编写的硬件设

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

node [range_hi:range_lo]x;
node y[range_hi:range_lo];
以及其他定义如下:

node [range_hi:range_lo]x;
node y[range_hi:range_lo];
我知道
x
被定义为打包,而
y
被定义为未打包。然而,我不知道这意味着什么

系统Verilog中的压缩向量和非压缩向量有什么区别


编辑:回应@Empi的回答,为什么用SV编写的硬件设计师应该关心阵列的内部表示?是否有任何时候我不应该或不能使用压缩信号?

本文提供了有关此问题的更多详细信息: ,特别是第5.2节

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


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

bit [3][7] a;
bit a[3];
bit [3:0][7:0]a[2:0].
解包数组的对象名称位于大小声明之后。例如:

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

压缩数组生成内存,而非压缩数组不生成内存。 您也可以像这样访问/声明未打包的数组

reg unpacked_array [7:0] = '{0,0,0,0,0,0,0,1};
您可以混合打包和解包数组来创建多维内存。例如:

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

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

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

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


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

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

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

--->在上述语句中,a[0]='b1;将适用于未打包的阵列,当unpkd的某些部分到达时(例如逻辑unpkd[8];]如unpkd=5'h7时,它将不起作用;同样的分配也适用于pkd阵列
-->unpkd=unpkd+2;不适用于unpkd将适用于pkd

“压缩阵列生成内存,而非压缩阵列生成内存。”这是什么意思?有很多FPGA合成工具可以将未打包的阵列转换为某种内存(FFs或RAM)。