硅芯思见:SystemVerilog中的packedarray和unpacked array
【注】因为在很多书籍资料中关于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 array
event 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的存储示意图。
3 多维数组
在实际使用时,除了会单独定义使用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相关推荐
- 硅芯思见:SystemVerilog中的类型转换有哪些
硅芯思见 更多内容↑↑↑↑↑↑↑↑↑↑,其中更新更多内容! 本文纯属学习之用,欢迎指正文中不足,封面图片若有侵权,请及时沟通! 在SystemVerilog中,经常会用到$cast对数据类型进行转换, ...
- 硅芯思见:“软约束”到底有多“软”
更多内容请关注下面公众号! 硅芯思见 本文纯属学习之用,欢迎指正文中不足,封面图片若有侵权,请及时沟通! 在SystemVerilog中,约束一般分为两种:一种称之为"硬约束hard con ...
- 硅芯思见:Timing Borrow深入浅出
硅芯思见 更多内容↑↑↑↑↑↑↑↑↑↑,其中更新更多内容! 本文纯属学习之用,欢迎指正文中不足,封面图片若有侵权,请及时沟通! Timing Borrow技术又称为cycle stealing技术,其 ...
- 硅芯思见:SystemVerilog中unpacked数组的assignment pattern
在SystemVerilog中根据数组中元素的存储方式,将数组细分为了packed数组和unpacked数组,packed数组一般使用拼接({})操作实现初始化赋值,unpacked数组则使用数值列表 ...
- 硅芯思见:IC验证应读书推荐
本文主要是跟大家分享一些在IC验证学习过程中的一些性价比极高的不错的书籍,通过这些书的学习,你的IC验证学习之路一定会很丰富!当然如果你时间充裕并且口袋比较富裕,觉得自己存数量比较少的话,你也可以买很 ...
- 硅芯思见:阻塞赋值与非阻塞赋值
0 丑话说在前边 RHS:运算符(= or <=)右侧的表达式 LHS:运算符(= or <=)左侧的表达式 竞争(Race Condition):在同一仿真时间槽(time-slot)多 ...
- SystemVerilog中根据系统时间产生随机数的函数
基本原理: 1.通过在SystemVerilog中调用$system系统函数 2.执行shell终端命令date +%N > tmp,将date +%N命令的结果写入文件tmp中 3.打开并读取 ...
- SystemVerilog中的Events事件
文章目录 前言 一.事件(Events) 二.@操作符和wait()操作的区别 三.wait_order 总结 前言 本文首先介绍SystemVerilog中的Events:其次记录了@操作符和wai ...
- systemverilog中rand机制的 $urandom_range()函数
使用SystemVerilog中的rand机制, 经常会用到$urandom_range()这个函数, 得到一个无符号的整型数. 语法:$urandom_range(int unsigned maxv ...
最新文章
- Nginx学习4:负载均衡实例
- Apache - AH00526 – server.crt
- 国内的IDC数据中心运营维护前景如何?
- freebsd从安装到想要的状态配置
- 洛谷P4173:残缺的字符串(FFT、通配符匹配)
- 编译分析:提memcmp.c+gcc四十米大刀到C#世界中屠龙
- 创新创业技术路线怎么写_怎么创业起步 如何写创业计划?
- C# 调用C++DLL声明 常规参数/结构体/指针/数组
- multipartfile获取文件路径_已知路径,通用获取文件名、后缀、类型
- Python实战 | 完美爬取LOL全英雄皮肤高清原画 JavaScript动态网页
- 走进Axure的表单设计
- 知识 | 四种渲染到底是啥?终于有人讲明白了(下)
- Redis 跳跃表实现原理 时间复杂度分析
- mysql获取数据库账号密码报错errorCode 1045, state 28000——常见5种解决办法
- Vue3+TS 快速上手 (尚硅谷)
- 数据分析面试题-面试话术
- 简单的java单位换算_Java实现蓝桥杯单位转换
- c++小游戏之文字版MC
- 如何高效阅读一本纸质书
- 我的微软漫漫信仰路【多图】