unpacked数组和packed数组的主要区别
unpacked数组在物理存储时不能保证连续,
packed数组则能保证在物理上连续存储。
另一种看待unpacked数组和packed数组差异点的角度是,packed数组可以看成一个整体,一个单一向量。
unpacked array
unpacked数组的维度是在数组名称之后声明的,如
bit unpack [3:0];
非合并数组的存储方式:
... | unpack[0] |
... | unpack[1] |
... | unpack[2] |
... | unpack[3] |
byte c2; // same as bit signed [7:0] c2;
integer i1; // same as logic signed [31:0] i1;
packed array
packed数组的维度是在数组名称之前声明的,如
bit [3:0] pack;
合并数组的存储方式:
... | unpack[3] | unpack[2] | unpack[1] | unpack[0] |
The following examples declare equivalent size two-dimensional fixed-size arrays of int variables:
int Array[0:7][0:31]; // array declaration using ranges
int Array[8][32]; // array declaration using sizes
Multidimensional arrays
- 理解数组的维度和索引顺序
- 对于
bit [3:0] [7:0] joe [1:10];
这个声明,它定义了一个三维数组。从左到右,第一个维度bit [3:0]
表示每个元素内部的位宽(4 位),第二个维度[7:0]
表示每个元素的子元素位宽(8 位),第三个维度[1:10]
表示数组的元素个数(10 个)。
- 对于
- 索引方式
- 访问单个元素:
- 要访问数组中的单个元素,需要使用三个索引。索引的顺序是按照数组声明的维度从左到右进行的,即先索引第三个维度(元素个数维度),再索引第二个维度(子元素位宽维度),最后索引第一个维度(元素内部位宽维度)。
- 例如,要访问第 3 个元素(索引为 3)中的第 5 个子元素(索引为 5)中的第 2 个位(索引为 2),可以使用
joe[3][5][2]
。这里joe[3]
选择了第 3 个元素,joe[3][5]
在第 3 个元素中选择了第 5 个子元素,joe[3][5][2]
在第 5 个子元素中选择了第 2 个位。
- 访问部分元素(切片):
- 在第三个维度(元素个数维度)切片:可以使用范围索引来选择多个元素。例如,
joe[3:6]
会选择第 3 到第 6 个元素,得到一个新的二维数组,其类型为bit [3:0] [7:0]
。 - 在第二个维度(子元素位宽维度)切片:同样可以使用范围索引。例如,
joe[2][3:6]
会在第 2 个元素中选择第 3 到第 6 个子元素,得到一个新的一维数组,其类型为bit [3:0]
。 - 在第一个维度(元素内部位宽维度)切片:例如,
joe[4][7][2:3]
会在第 4 个元素的第 7 个子元素中选择第 2 到第 3 个位,得到一个包含 2 个位的向量。
- 在第三个维度(元素个数维度)切片:可以使用范围索引来选择多个元素。例如,
- 访问单个元素:
参考文献:
https://zhuanlan.zhihu.com/p/574587543
官方spec 7.4章