一、变量类型
四值变量: (0、1、x、z)四种状态
四值逻辑类型:integer、reg、logic、reg、net-type(如wire、tri);
- SV并不太常用变量类型是wire(assign语句中)还是reg(initial和always语句中)。
- logic用的比较多。可以被连续赋值语句驱动,可用在assign、initial、always语句中。
四值变量与二值变量的特性:
-
四值变量的默认初始值为x,二值变量的默认初始值为0,在initial中可以直接使用~clk变成1,但是如果是logic,必须设置初值为0、或者1.**
-
将四值变量赋值给二值变量,x和z状态会转变为0;
二值变量: (0、1)两种状态
二值逻辑类型:byte、shortint、int、longint、bit。
有符号类型:byte、shortint、int、longint、integer。
无符号类型:bit、logic、reg、net-type(如wire、tri)。
对于转换方式,可以分为隐式转换和显式转换。显式转换又可以分为静态转换和动态转换
- 静态转换:unsigned’(signed);注意单引号。
- 动态转换:$cast(tgt,src)
二、数组
2.1.固定数组
静态数组是指其数组的大小在定义时被显性地指定。
sv引入两种类型的数组:压缩数组 (packedarray)和非压缩数组 (unpackedarray)。
压缩(合并)数组,维数定义在变量标识符之前,如: bit [7:0] c1; //压缩数组 (c1在左边)
非压缩数组,维数的定义在变量标识符之后,如: bit [7:0] up_array [3]; //非压缩数组
更深入理解
答案:2WORD、3WORD(logic 2位存储)
24x2 = 48位 2word ; 3x(8x2) 3word;
- 字
word
: 1字=2字节(1word
= 2byte
) 字长是指字的长度 - 字节
byte
:1字节=8位(1byte
= 8 bit) - 位
bit
一个字的字长为16
一个字节的字长是8
混合数组
2.2.动态数组
- 声明时使用 [ ] 进行动态数组声明;
- 在仿真过程中进行分配内存空间和设置数组元素个数;
- 使用 new[]来分配内存空间,传递数组元素的个数;
- 通过数组名称可以实现整个数组的赋值;
- $size系统函数返回数组元素个数;
- 动态数组和固定数组之间可以进行相互赋值,但需要满足:(数据类型相同,元素数目相同);
2.3.数组方法
-
求和sum、求积product、与and、或or、异或xor
-
a.sum——单bit数组的求和返回单bit的数值;
-
求最大值max,求最小值min,唯一化unique;
2.4.数组定位方法
- 查找元素:find
- 查找第一个元素:find_first
- 查找第一个元素的索引:find_first_with_index
三、队列
- 声明时使用 [$] 进行队列声明;
- 能够迅速分配额外的空间和额外的元素;
- 不需要new[]进行分配空间;
- 支持 push(数据入队——写)和 pop(数据出对——读)操作;push时自动增补空间,pop后空间不消失;
- 具有排序和搜索的功能;
- 支持add和remove元素操作;
四、结构体
- 结构体相当于是对一组数据类型的封装,是一组变量的集合,可以作为一个整体进行操作;
- 一般使用结构体的名字对其中的变量进行操作;
- 结构体默认情况下是非填充的,当然也可以使用关键字packed将其声明为填充型的;
- 可以使用关键词
typedef来定义结构体
,实现对同一个结构体的多次例化
,增强结构体的重用性;
五、枚举
- 数值必须唯一;默认为int型,且会初始化为0。上图INIT缺失代表0,如果赋值{INIT=1,…}报错。
六、字符串
- 字符串类型(string)是一个大小可变、动态分配的字节数组。字符串文本为一个具有宽度为8的整数倍的压缩数组。
- 在未赋值的情况下,string类型的变量初始值为
空字符 “ ”
- 可以使用
系统函数$psprintf()
生成字符串; - 字符串类型变量具有内建的操作符和函数,len(), getc(), putc(),substr()等;
参考:
Mr.翟的博客