Bootstrap

systemverilog的packed array和unpack array

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 

  1. 理解数组的维度和索引顺序
    • 对于bit [3:0] [7:0] joe [1:10];这个声明,它定义了一个三维数组。从左到右,第一个维度bit [3:0]表示每个元素内部的位宽(4 位),第二个维度[7:0]表示每个元素的子元素位宽(8 位),第三个维度[1:10]表示数组的元素个数(10 个)。
  2. 索引方式
    • 访问单个元素
      • 要访问数组中的单个元素,需要使用三个索引。索引的顺序是按照数组声明的维度从左到右进行的,即先索引第三个维度(元素个数维度),再索引第二个维度(子元素位宽维度),最后索引第一个维度(元素内部位宽维度)。
      • 例如,要访问第 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章

;