unpacked数组和packed数组的主要区别

描述

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 and 1-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 and 3-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 and 2D-Unpacked Array

 

logic [1:0] [7:0] uP[3:0] [2:0];

 

上面声明了一个2维unpacked 数组,每个数组项都是一个2维的packed数组。所以,如果每个unpacked数据项使用1word存储,那么总的存储空间是:

 

4*3*1word

 

3-D Packed and 1-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数组

文章出处:【微信公众号:芯片验证工程师】欢迎添加关注!文章转载请注明出处。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分