本节主要介绍了SystemVerilog中的基本数据类型以及自定义数据类型
基本数据类型
SystemVerilog中的信号同时具有类型和数据类型
类型表示信号是线网还是变量:
$$
类型\begin{cases}
变量(var):可以用连续赋值或者过程赋值\
线网(wire):只能用于连续赋值语句(assign)\
\end{cases}\
$$数据类型表示变量和线网的值是二值逻辑还是四值逻辑
$$
数据类型\begin{cases}
四值逻辑:1、0、x、z\
二值逻辑:1、0\
\end{cases}\
$$常见的二值逻辑与四值逻辑如下:
$$
\begin{cases}
四值逻辑类型:logic、integer、reg、net-type(wire、tri)\
二值逻辑类型:bit、byte、shortint、int、longint\
\end{cases}\
$$有符号类型与无符号类型的划分如下:
$$
\begin{cases}
有符号类型:byte(8bit)、shortint(16bit)、int(32bit)、longint(64bit)、integer\
无符号类型:bit、logic、reg、net-type(wire、tri)\
\end{cases}\
$$可以在有符号类型后添加
unsigned
来表示无符号类型,如:1
byte unsigned //等同于bit[7:0],表示的数值范围是[0, 255]
需记住变量最常用的logic、bit都默认为无符号变量var,而所有的线网类型只能是四值逻辑类型
1
2
3logic [0: 7] array [0: 255]; //256个8bit数据组成的数组
(var) logic [63: 0] addr;
wire logic [63: 0] data;四值逻辑变量在仿真开始时初值为X,二值逻辑变量在仿真开始时初值为0
如果四值逻辑与二值逻辑的数据类型之间发生默认转换,那么X和Z值将转换为0
SV添加void类型来表示空类型,经常用在函数定义时表示不会返回数值
SV添加shortreal表示32位单精度浮点类型(同C语言的float)
未指定类型No type specified-未指定数据类型No data type specified时,默认类型端口为wire
指定数据类型时,默认类型为wire(输入和输入输出端口)和var(输出端口)
未指定数据类型No data type specified-所有端口的默认数据类型为logic(4态)
自定义类型
通过
typedef
来创建用户自定义类型:1
2typedef int unsigned uint;
uint a, b;通过
enum
来创建枚举类型:1
enum {red, green, blue} RGB
默认的枚举类型是int,在未赋值情况下默认第一个数为0
为了能够更准确地描述硬件,SV允许指明枚举类型的数据类型
1
enum logic [1: 0] {WAITE, LOAD, READY} state
如果一个枚举类型数据被赋值,那么所附的值必须符合其数据类型
1
enmu logic [2: 0] {WAITE = 3'b001, LoAD = 3'b010, READY = 3'b100} state
整形不能直接赋值给枚举类型
枚举类型可以和typedef联合使用,来声明自定义类型,这使得可以用同一个枚举类型来声明多个变量或者线网
1
2typedef enum {WAITE, LOAD, READY} state_t;
states_t state, next_state;
通过
struct
来创建结构体类型1
2
3
4
5
6struct{
int a, b;
opcode_t opcode;
logic [23: 0] address;
bit error;
} Instruction_Word;类似于枚举类型,结构体类型也可以伴随着typedef来实现自定义结构体类型
1
2
3
4
5
6
7typedef struct{
int a, b;
opcode_t opcode;
logic [23: 0] address;
bit error;
} instruction_Word_t;
instruction_Word_t IW;结构体类型默认也是变量类型,用户也可以显示声明其为var或者wire类型
结构体变量可以通过
.
索引对成员赋值:1
2IW.a = 100;
IW.opcode = 8'hFF;也可以通过
'
和{}
整体赋初值1
2IW = '{100, 3, 8'hFF, 0}; //位置对应赋值
IW = '{address:0, opcode:8'hFF, a:100, b:5}; //名字索引赋值
字符串类型
字符串类型变量的存储单元为byte类型
字符串结尾没有“空字符”即null字符“\0”
字符串最高位从0开始
1
2
3
4typedef logic [15: 0] r_t;
r_t r;
string b = ""; //相当于string b
r = r_t'(a); //显示转换,将a转化为数据类型r_t并赋值给r字符串内建方法:
str.len()
//返回字符串的长度str.putc(i, c)
//将第i个字符替换成字符C,等同于stri[i]=cstr.getc(i)
//返回第i个字符str.substr(i, j)
//将从第i个字符到第j个字符的字符串返回str.{atoi(), atohex(), atooct(), atobin()}
//将字符串转变为十进制、十六进制、八进制或者二进制数据1
2str = "123";
int i = str.atoi(); //将”123“转化为整数123