0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

芯片验证工程师 来源:芯片验证工程师 作者:芯片验证工程师 2022-10-18 09:13 次阅读

unpacked数组和packed数组的主要区别是unpacked数组在物理存储时不能保证连续,而packed数组则能保证在物理上连续存储。

另一种看待unpacked数组和packed数组差异点的角度是,packed数组可以看成一个整体,一个单一向量。

unpacked数组的维度是在数组名称之后声明的,数组中内容可以是任何数据类型或者其他数组。

bit uP [3:0]; //1-D unpacked
 //unpacked dimensions declared after the data identifed name.

c789901e-4e36-11ed-a3b6-dac502259ad0.png

正如你所注意到的,uP0到uP3分散在多个word中,它们不是连续的。

packed数组的维度是在数组名称之前声明的,下面是一个packed数组的例子:

bit [3:0] p; //1-D packed
 //packed dimensions declared before the data identifer name

这个打包数组可以表示为如下所示:

c79bbe10-4e36-11ed-a3b6-dac502259ad0.png

正如上图所示的,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数组

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

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

    关注

    12

    文章

    3823

    浏览量

    84587
  • Verilog
    +关注

    关注

    28

    文章

    1322

    浏览量

    109218
  • 数组
    +关注

    关注

    1

    文章

    406

    浏览量

    25580

原文标题:SystemVerilog中的Packed和Unpacked数组

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

收藏 人收藏

    评论

    相关推荐

    C语言数组和指针的区别

    大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是C语言数组和指针的区别,希望能对你有所帮助。
    发表于 07-11 12:40 260次阅读
    C语言<b class='flag-5'>数组</b>和指针的<b class='flag-5'>区别</b>

    C语言中指针数组数组指针的区别

    指针和数组之间存在着紧密的关系。在本文中,我们将探讨指针和数组的关系、指针算术和数组遍历、多维数组与指针以及指针数组
    发表于 08-17 15:29 269次阅读

    指针和数组都是C语言的精髓所在 两者有何联系区别

    指针和数组都是C语言的精髓所在,对于很多C程序员来说,如果你问这样一个问题:数组和指针有什么区别?他们的答案很可能是:”数组和指针不是同一样东西吗,他们之间有什么
    的头像 发表于 05-27 14:51 2969次阅读
    指针和<b class='flag-5'>数组</b>都是C语言的精髓所在 两者有何联系<b class='flag-5'>区别</b>

    详谈数组和指针的区别与联系

    详谈数组和指针的区别与联系
    的头像 发表于 06-29 15:18 2.2w次阅读
    详谈<b class='flag-5'>数组</b>和指针的<b class='flag-5'>区别</b>与联系

    指针数组数组指针的区别

    这里我们区分两个重要的概念:指针数组数组指针。
    的头像 发表于 06-29 15:30 1.9w次阅读
    指针<b class='flag-5'>数组</b>和<b class='flag-5'>数组</b>指针的<b class='flag-5'>区别</b>

    C语言指针和数组区别

    在C语言教程中我们使用通过数组名通过偏移和指针偏移都可以遍历数组,那么指针和数组到底有什么区别??
    的头像 发表于 07-18 16:29 1488次阅读

    二维数组数组指针以及指针数组

    二维数组数组指针以及指针数组
    的头像 发表于 08-16 09:02 2219次阅读

    变长数组和动态数组区别

    动态数组是指在声明时,没有确定数组大小的数组,它可以随程序需要而重新指定大小。动态数组的内存空间是从堆动态分配的,当程序执行到我们编写的分配语句时,才为其分配存储空间。
    的头像 发表于 09-28 15:20 1497次阅读

    SystemVerilog中的Packed Union

    packed union相比unpacked union最大的一个区别就是,在packed union中,所有成员的大小必须相同,这就保证了不管union中存储了哪一个成员,最终这个u
    的头像 发表于 11-12 09:05 766次阅读

    C语言二维数组的定义

    按以上定义,数组a课用的下标范围为0~2,“列下标”的范围为0~3,。用a[3][4]表示元素显然超过了数组的范围。 读者要严格区分在定义数组时用的a[3][4]和引用元素时的a[3][4]的
    的头像 发表于 03-09 11:38 1667次阅读

    数组的定义 什么是数组

    数组 数组是内置类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。 在初始化后长度是固定的,无法修改其长度。当作为方法的参数传入时将复制一份数组而不是引用同一指针。
    的头像 发表于 10-09 09:39 1207次阅读

    字符数组和字符串有没有区别

    字符数组和字符串有没有区别
    的头像 发表于 11-30 16:39 305次阅读

    数组和指针不相同吗?数组和指针有哪些区别

    数组就是指针,指针就是数组,这样的言论在评论区看到不下于10次。
    的头像 发表于 12-13 16:34 308次阅读
    <b class='flag-5'>数组</b>和指针不相同吗?<b class='flag-5'>数组</b>和指针有哪些<b class='flag-5'>区别</b>

    数组和链表有何区别

    数组和链表的区别,这个问题,不仅面试中经常遇到,考研的同学也得掌握才行。
    的头像 发表于 02-19 15:33 134次阅读
    <b class='flag-5'>数组</b>和链表有何<b class='flag-5'>区别</b>

    数组和链表在内存中的区别 数组和链表的优缺点

    数组和链表在内存中的区别 数组和链表的优缺点  数组和链表是常见的数据结构,用于组织和存储数据。它们在内存中的存储方式以及优缺点方面存在一些显著的差异。本文将详细探讨这些差异以及它们的
    的头像 发表于 02-21 11:30 152次阅读