- 1 SystemVerilog引进的新的数据类型的优点?
- 2 Verilog与SystemVerilog内建数据类型的比较?
- 2.1 Verilog
- 2.2 SystemVerilog
- 3 Verilog与SystemVerilog数组的比较
- 3.1 定宽数组
- 3.2 动态数组
- 3.3 关联数组
- 3.4 SystemVerilog定宽数组与动态数组赋值
- 3.5 数组的方法
- 3.5.1 数组缩减方法
- 3.5.1 数组定位方法
- 3.5.1 数组排序方法
- 4 SystemVerilog 的新数据类型:队列
- 4.1 队列的操作
- 5 SystemVerilog 的新数据类型:链表
- 5 SystemVerilog 创建新的类型
- 6 SystemVerilog 创建用户自定义结构
- 7 类型转换
- 7.1 静态转换
- 7.2 动态转换
- 7.3 流操作符
- 8 枚举类型
- 8.1 枚举类型的子程序
- 8.2 枚举类型转换
- 9 常量
- 10 SystemVerilog 的新数据类型:字符串
- 双状态数据类型:更好的性能,更低的内存消耗。
- 队列、动态和关联数组:减少内存消耗,自带搜索和分类功能。
- 类和结构:支持抽象数据结构。
- 联合和合并结构:允许对同一数据有多种视图(view)。
- 字符串:支持内建的字符序列。
- 枚举类型:方便代码编写,增加可读性。
- 两种数据类型:变量和线网(net)。
- 变量:
- 单bit或多bit无符号数 reg。
- 32bit 有符号数 interger。
- 64bit 无符号数 time。
- 浮点数 real。
- 所有数据都是静态static类型。
-
逻辑(logic)类型
- 为什么创建这个类型? SystemVerilog对经典reg数据类型改进,使得作为一个变量外还可以被连续赋值。为了区分寄存器类型,新建logic类型。
- logic不能有多个结构性驱动,比如双向总线,其他情况下任何使用线网的地方均可以使用logic。
-
双状态数据类型
- 最简单的双状态数据类型:bit。
- 另4种带符号的双状态数据类型:byte(8bit)、shortint(16bit)、int(32bit)和longint(64bit)。
- 注意双状态连接到被测设计输出时X或Z会转换成双状态值。$isunknown() 检测到X或Z会返回1。
- Verilog必须在声明种给出数组的上下界 int data[0:15],SystemVerilog可以只给出数据宽度int data[16]。
- Verilog-1995数组下标和位下标不能同时使用。Verilog-2001与SystemVerilog可以 src[0][2:1] src数组0的bit2:1。
- SystemVerilog可以创建多维定宽数组 int array[0:7][0:3] /int array[8][4] 创建一个8行4列的数组。
- SystemVerilog操作数组最常见的方式是使用for或foreach循环。
- SystemVerilog可以合并数组 bit [3:0][7:0] bytes,四个8bit数据合并在一起。
- Verilog数组宽度编译时确定。SystemVerilog 提供了动态数组类型 int data[],可以在仿真时分配空间或调整宽度 data = new[5]。
- 系统函数$size返回数组宽度。
SystemVerilog 提供了关联数组类型,用来保存稀疏矩阵的元素。当对一个非常大的地址空间进行寻址,只为实际写入的元素分配空间,节省存储空间。
3.4 SystemVerilog定宽数组与动态数组赋值- 基本数据类型相同,定宽数组与动态数组之间就可以相互赋值。
- 元素数目相同,动态数组的值可以复制到定宽数组。
- 定宽数组复制给动态数组时,SystemVerilog 会调用构造函数new[]来分配空间并复制数值。
功能:把一个数组缩减成一个值。 常用方法:sum,对数组中所有元素求和。
3.5.1 数组定位方法功能:最大值,特定值 方法:data.min() ; data.max() ; data.unique(); data.find with (item > 3) ,返回一个队列 data.sum with (item > 3) 就可以找出大于3的元素的个数。
3.5.1 数组排序方法功能:改变数组元素顺序 方法:data.reverse(); data.sort(); data.rsort(); data.shuffle();
4 SystemVerilog 的新数据类型:队列队列结合链表与数组的优点。 类似链表:可在一个队列中人任何位置增加或删除元素。 类似数组:可用索引访问任一元素。
4.1 队列的操作声明:q[$] = {0, 2, 5};// 注意队列常量不需要’{}。 插入:q.insert(1,3); // {0, 3, 2, 5} 在索引1前插入3 删除:q.delete(1); // {0, 2, 5} 删除索引1元素 放 在 范 围 表 达 式 左 边 表 示 最 小 值 , 右 边 表 示 最 大 值 。 q [ 放在范围表达式左边表示最小值,右边表示最大值。 q[ 放在范围表达式左边表示最小值,右边表示最大值。q[,2] 代表[0:2],q[1:$] 代表 q[1:2]。 可以把定宽或动态数组的值复制给队列。
5 SystemVerilog 的新数据类型:链表链表数据结构类似标准模板库(STL)的列表容器。这个容器定义为一个参数化的类,可以根据用户需要存放各种类型的数据。 避免使用,因为 SystemVerilog 队列更高效。
5 SystemVerilog 创建新的类型typedef reg[7:0] opreg_t;
6 SystemVerilog 创建用户自定义结构Verilog没有数据结构。SystemVerilog 可以使用struct语句创建结构。 struct 只是把数据组织到一起。
使用struct创建新类型: struct {bit [7:0] r,g,b} pixel; struct packed {bit [7:0] r,g,b} pixel; //packed 代表合并结构,以连续bit存放,不然默认存储空间为长字。
对结构进行初始化: 在声明或过程赋值语句把多个值用’{}给结构体赋值,与数组赋值类似。
7 类型转换如果源变量与目标变量bit位分布完全相同,它们之间可以直接相互赋值。 bit位分布不同,则需要使用流操作符对bit分布重新安排。
7.1 静态转换静态转换不对值进行检查。 转换时指定目标类型,并在要转换的表达式前加上单引号即可。 int i; real r; i = int '{10.0 - 0.1}; // 转换非强制
7.2 动态转换动态转换函数 $cast 允许对越界的数组进行检查。
7.3 流操作符流操作符: > ,后面带表达式、结构或数组。 可以替换位拼接符{},使代码更简洁。 功能:将其后的数据打包成一个bit流。>> :把数据从左至右变成流。
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?