【注】因为在很多书籍资料中关于packed array和unpacked array有不同的翻译,有的称之为压缩数组和非压缩数组,有的称之为合并数组和非合并数组,为了避免混淆,本文不采用任何翻译名称,仅使用packed array和unpacked array。

在SystemVerilog中一般认为数组维数声明位于数组名左侧的数组为packed array,并且在使用时经常也将一维的packed array作为vector;维数位于数组名右侧的数组称之为unpacked array,当维数同时出现在数组名左右两侧时,该数组也是unpacked array。packed array和unpacked array的常见格式如下例所示:

bit [7:0] packed_array;     // packed arrayevent unpacked_array[0:7]; // unpacked array

下面我们将分别讨论学习packed array和unpacked array的异同。

1 packed array

packed array常由按位(bit-wise)类型(logic、bit、reg,etc)、线网(wire、uwire、wand、tri、triand,etc)、枚举类型和其他的packed数据结构等构成,而像byte、shortint、int、longint、integer和time等这些数据类型,因为其本身就已经包含特定的位宽信息,所以不能在这些类型和数组名之间指定维数,也就不能指定这些类型为packed array,但是这并不影响这些类型声明的变量在满足一定要求的情况下同packed array进行交互的。

packed array中数组元素在存储时是按照位连续的方式进行存放的,即其中所有元素是连续存放的,并且存放不依赖于任何EDA工具,一般情况下一维的packed array与vector类似,根据packed array的特点,其存储方式如下图示例所示。

正是因为packed array中数据存储的这个特点,所以我们在对packed array赋值时采用的是拼位操作实现的。

2 unpacked array

与packed array对于数据类型的要求不同,unpacked array就奔放很多,基本上通吃所有数据类型,数组的索引范围声明在数组名的右侧,数组的维数也可以像packed array一样指定为多维的,与packed array维数指定不同的是,unpacked array维数的指定有两种方式:一种是传统的数组声明方式,即指定索引的具体开始结束,另一种方式是采用C语言方式,即仅需要指定数组中元素的总个数(packed array不能使用这种方式进行声明)即可。除此之外,在数据存储方面,unpacked array中所有的数据元素在存储时是相互独立的,所以在对unpacked array进行赋值操作时采用的是数值列表的方式,即’{},注意不能使用拼位方式,但是packed array赋值方式不仅可以使用拼位方式也可以使用数值列表方式。在数组元素存储时,数组中元素具体存储在几位的空间一般情况下取决于编译器,例如如果定义的unpacked array中每个元素宽度为8位,但是编译器在存储数组元素时给每个元素分配了32位空间,那么unpacked array中每个元素将仅使用32位中的8位,从而导致部分空间的浪费,下图为一个unpacked array的存储示意图。

多维数组

在实际使用时,除了会单独定义使用packed array和unpacked array之外,经常还会将两者组合在一起形成多维数组进行使用,特别是在声明定义一些memory模型时。下图为一个多维数组的示例,其中标明了索引时各索引号对应的索引位置。

多维数组索引的顺序如上图所示,即先从unpacked维数开始,并且unpacked的维数中按照从左到右的顺序进行索引,完成unpacked侧所有维数索引之后,再从packed侧的维数开始索引,也是按照从左到右的顺序进行索引。

4 使用场景

ü 非bit-wise类型,例如byte、int、integer、real、其他unpacked类型结构,对于这些类型建模数组使用unpacked array;

ü 构建存储类模型时,常需要一次访问一个多位元素的数组采用unpacked array;

ü bit-wise类型、所有的packed类型结构都可以采用packed array;

ü 如果需要经常访问数组中的某些位时,可以考虑构建数组时采用packed array;

更多内容请关注下面公众号!

本文纯属学习之用,欢迎指正文中不足,封面图片若有侵权,请及时沟通!

硅芯思见:SystemVerilog中的packedarray和unpacked array相关推荐

  1. 硅芯思见:SystemVerilog中的类型转换有哪些

    硅芯思见 更多内容↑↑↑↑↑↑↑↑↑↑,其中更新更多内容! 本文纯属学习之用,欢迎指正文中不足,封面图片若有侵权,请及时沟通! 在SystemVerilog中,经常会用到$cast对数据类型进行转换, ...

  2. 硅芯思见:“软约束”到底有多“软”

    更多内容请关注下面公众号! 硅芯思见 本文纯属学习之用,欢迎指正文中不足,封面图片若有侵权,请及时沟通! 在SystemVerilog中,约束一般分为两种:一种称之为"硬约束hard con ...

  3. 硅芯思见:Timing Borrow深入浅出

    硅芯思见 更多内容↑↑↑↑↑↑↑↑↑↑,其中更新更多内容! 本文纯属学习之用,欢迎指正文中不足,封面图片若有侵权,请及时沟通! Timing Borrow技术又称为cycle stealing技术,其 ...

  4. 硅芯思见:SystemVerilog中unpacked数组的assignment pattern

    在SystemVerilog中根据数组中元素的存储方式,将数组细分为了packed数组和unpacked数组,packed数组一般使用拼接({})操作实现初始化赋值,unpacked数组则使用数值列表 ...

  5. 硅芯思见:IC验证应读书推荐

    本文主要是跟大家分享一些在IC验证学习过程中的一些性价比极高的不错的书籍,通过这些书的学习,你的IC验证学习之路一定会很丰富!当然如果你时间充裕并且口袋比较富裕,觉得自己存数量比较少的话,你也可以买很 ...

  6. 硅芯思见:阻塞赋值与非阻塞赋值

    0 丑话说在前边 RHS:运算符(= or <=)右侧的表达式 LHS:运算符(= or <=)左侧的表达式 竞争(Race Condition):在同一仿真时间槽(time-slot)多 ...

  7. SystemVerilog中根据系统时间产生随机数的函数

    基本原理: 1.通过在SystemVerilog中调用$system系统函数 2.执行shell终端命令date +%N > tmp,将date +%N命令的结果写入文件tmp中 3.打开并读取 ...

  8. SystemVerilog中的Events事件

    文章目录 前言 一.事件(Events) 二.@操作符和wait()操作的区别 三.wait_order 总结 前言 本文首先介绍SystemVerilog中的Events:其次记录了@操作符和wai ...

  9. systemverilog中rand机制的 $urandom_range()函数

    使用SystemVerilog中的rand机制, 经常会用到$urandom_range()这个函数, 得到一个无符号的整型数. 语法:$urandom_range(int unsigned maxv ...

最新文章

  1. Nginx学习4:负载均衡实例
  2. Apache - AH00526 – server.crt
  3. 国内的IDC数据中心运营维护前景如何?
  4. freebsd从安装到想要的状态配置
  5. 洛谷P4173:残缺的字符串(FFT、通配符匹配)
  6. 编译分析:提memcmp.c+gcc四十米大刀到C#世界中屠龙
  7. 创新创业技术路线怎么写_怎么创业起步 如何写创业计划?
  8. C# 调用C++DLL声明 常规参数/结构体/指针/数组
  9. multipartfile获取文件路径_已知路径,通用获取文件名、后缀、类型
  10. Python实战 | 完美爬取LOL全英雄皮肤高清原画 JavaScript动态网页
  11. 走进Axure的表单设计
  12. 知识 | 四种渲染到底是啥?终于有人讲明白了(下)
  13. Redis 跳跃表实现原理 时间复杂度分析
  14. mysql获取数据库账号密码报错errorCode 1045, state 28000——常见5种解决办法
  15. Vue3+TS 快速上手 (尚硅谷)
  16. 数据分析面试题-面试话术
  17. 简单的java单位换算_Java实现蓝桥杯单位转换
  18. c++小游戏之文字版MC
  19. 如何高效阅读一本纸质书
  20. 我的微软漫漫信仰路【多图】

热门文章

  1. NOIP2014、2015普及组初赛难点整理
  2. 完成对靓号号码的筛选
  3. 向5岁小朋友解释什么是微服务
  4. 怀揣巨资等了一季 陈天桥距门户野心咫尺之遥
  5. Linux中gcc4.8.5升级到gcc5.4.0用已经编译好的安装包升级(重点是不用编译安装,可以更省时)
  6. 【后续还会补充】Sublime Text 4 常用插件安装及配置方法
  7. JAVA基础个人总结,不喜勿喷
  8. 什么是重排和重绘?何时会触发?
  9. 《怪诞小镇》的怪诞之物
  10. BCELOSS和MSELOSS区别(pytorch BCELoss and MSELoss)