unpacked数组和packed数组的主要区别是unpacked数组在物理存储时不能保证连续,而packed数组则能保证在物理上连续存储。
另一种看待unpacked数组和packed数组差异点的角度是,packed数组可以看成一个整体,一个单一向量。
unpacked数组的维度是在数组名称之后声明的,数组中内容可以是任何数据类型或者其他数组。
bit uP [3:0]; //1-D unpacked //unpacked dimensions declared after the data identifed name.
正如你所注意到的,uP0到uP3分散在多个word中,它们不是连续的。
packed数组的维度是在数组名称之前声明的,下面是一个packed数组的例子:
bit [3:0] p; //1-D packed //packed dimensions declared before the data identifer name
这个打包数组可以表示为如下所示:
正如上图所示的,p3到p0在物理空间上是连续的。
某种意义上,这个所谓的packed就是表示是否在物理空间连续存放。
2-D Packed Array
module tb; // 2-D packed array // 4 entries(rows) of 8 bits(columns) each // Total packed dimension (contiguous bits) = 4*8 = 32 bits bit [3:0][7:0] m_data; initial begin m_data = 32'h0102_0304;//Assign to 32 contiguous bits //display 2-d packed array as a contiguous set of bits $display ("m_data = 0x%h", m_data); //display 1 byte each stored at m_data[0]...m_data[3] for (int i = 0; i < 4; i++) begin $display ("m_data[%0d] = 0x%h", i, m_data[i]); end end endmodule
仿真log:
m_data = 0x01020304 m_data[0] = 0x04 m_data[1] = 0x03 m_data[2] = 0x02 m_data[3] = 0x01 V C S S i m u l a t i o n R e p o r t
在上面的例子中,我们声明了一个名为“m_data”的二维packed数组。请注意,所有维度的声明都位于数组名称的左侧。
这个数组一共有4(行),每行8bit(列),总的大小是4*8 = 32bit。因为是packed数组,其中所有的bit都是连续存储的,所以可以按照bit单独索引到。
我们给这个数组赋值(32'h 0102_0304),然后打印相应的4行数据。
0x04、0x03、0x02、0x01
3-D Packed Array
3维数组和2维数组类似。
module tb; bit [2:0][1:0][7:0] m_data; // 3-D packed array initial begin // Assign 16-bits ([1:0][7:0]) at each of the three //([2:0])locations m_data[0] = 16'h0102; m_data[1] = 16'h0304; m_data[2] = 16'h0506; // m_data as a single packed value $display ("m_data = 0x%h", m_data); //Assign the entire array with a single value m_data = 48'hcafe_face_0708; // m_data as a single packed value $display("m_data = 0x%h", m_data); foreach (m_data[i]) begin $display ("m_data[%0d] = 0x%h", i, m_data[i]); foreach (m_data[, j]) begin $display ("m_data[%0d][%0d] = 0x%h", i, j, m_ data[i][j]); end end end endmodule
仿真log:
m_data = 0x050603040102 m_data = 0xcafeface0708 m_data[2] = 0xcafe m_data[2][1] = 0xca m_data[2][0] = 0xfe m_data[1] = 0xface m_data[1][1] = 0xfa m_data[1][0] = 0xce m_data[0] = 0x0708 m_data[0][1] = 0x07 m_data[0][0] = 0x08 V C S S i m u l a t i o n R e p o r t
在上面的例子中,我们声明了一个三维packed数组,命名为“m_data”,一共是328 = 48bit。由于这是一个packed数组,48bit在物理空间上是连续分配的。
我们可以理解为:
1*48 或者 3*16 或者 6*8 或者48*1
1-D Packed and1-D Unpacked Array
下面是一个一维packed数组和1维unpacked数组的示例:
module PU; logic [31:0] v1 [7:0]; //1-D packed & 1-D unpacked (memory) initial begin //Array Index 7 of unpacked v1[7] = 'h FF_FF_FF_FF; //equivalent to v1[7][31:0] $display(v1); //Array Index 6 of unpacked; 31:0 of packed v1[6][31:0] = 'h 11_11_11_11; $display(v1); //Array Index 5 of unpacked; 15:0 of packed v1[5][15:0] = 'h aa_aa; $display(v1); //Array Index 4 of unpacked; 0th bit of packed v1[4][0] = 1; $display(v1); end endmodule
仿真log:
'{‘h ffffffff, ‘h xxxxxxxx, ‘h xxxxxxxx, ‘h xxxxxxxx, ‘h xxxxxxxx, ‘h xxxxxxxx, ‘h xxxxxxxx, ‘h xxxxxxxx} '{‘h ffffffff, ‘h 11111111, ‘h xxxxxxxx, ‘h xxxxxxxx, ‘h xxxxxxxx, ‘h xxxxxxxx, ‘h xxxxxxxx, ‘h xxxxxxxx} '{‘h ffffffff, ‘h 11111111, ‘h xxxxaaaa, ‘h xxxxxxxx, ‘h xxxxxxxx, ‘h xxxxxxxx, ‘h xxxxxxxx, ‘h xxxxxxxx} '{‘h ffffffff, ‘h 11111111, ‘h xxxxaaaa, ‘h xxxxxxx1, ‘h xxxxxxxx, ‘h xxxxxxxx, ‘h xxxxxxxx, ‘h xxxxxxxx} V C S S i m u l a t i o n R e p o r t
在上面的例子中,我们声明了一个1维unpacked数组("v1",共包含8项),数组中的每一个内容又是一个packed数组(bit [31:0])“v1”。我们可以理解为一个深度为8,宽度为32的存储器。
4-D Unpacked Array
我们声明一个4维unpacked数组,所有维度相关的声明都在数组名称的右边
logic uP [3:0][2:0][1:0][7:0];
如果一个unpacked数据项使用1word存储,上面的数组就需要物理空间
4*3*2*8*1 word
1-D Packed and3-D Unpacked Array
logic [7:0] uP [3:0][2:0][1:0];
上面这个示例,是一个4*3*2个unpacked数组,其中每一个数据项都是一个8bit的packed数组。
如果每一个unpacked数据项使用1word存储,那么数组uP总的存储空间就是
4*3*2*1word
2-D Packed and2D-Unpacked Array
logic [1:0] [7:0] uP[3:0] [2:0];
上面声明了一个2维unpacked 数组,每个数组项都是一个2维的packed数组。所以,如果每个unpacked数据项使用1word存储,那么总的存储空间是:
4*3*1word
3-D Packed and1-D Unpacked Array
logic [2:0][1:0][7:0] uP [3:0];
上面声明了一个1维unpacked数组uP,一共4项,每项是一个3维packed数组。如果每个unpacked数据项使用1word存储,那么总的存储空间是
4*1word * 2
因为1word装不下一个packed数组
原文标题:SystemVerilog中的Packed和Unpacked数组
-
存储
+关注
关注
13文章
4298浏览量
85802 -
Verilog
+关注
关注
28文章
1351浏览量
110077 -
数组
+关注
关注
1文章
417浏览量
25939
原文标题:SystemVerilog中的Packed和Unpacked数组
文章出处:【微信号:芯片验证工程师,微信公众号:芯片验证工程师】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论