SV:SystemVerilog
- 开启SV之路
数据类型
內建数据类型
-
四状态与双状态 :
- 四状态指0、1、X、Z,包括logic、integer、 reg、 wire。
- 双状态指0、1,包括bit、byte、 shortint、int、longint。
-
有符号与无符号 :
- 有符号:byte、shortint、int、longint、integer。
- 无符号:bit、logic、reg、wire。
-
关于数据类型使用的几个注意点 :
-
SV中虽然支持reg和wire,但对于 验证平台要尽量使用logic ,并且建议采样RTL信号时变量要使用logic类型。
-
实际工作中 使用最多的是logic和bit ,一般 需要计数和比较大小时会使用byte或int 。
-
尽量 避免两种不同数据类型变量进行操作 ,包括 有无符号、四状态双状态、不同位宽 ,如必须进行操作,请先转换为同一类型。
-
-
关于数据类型转换的几个注意点 :
- 四状态转换为双状态时, x和z转换为0 。
- 多位数据赋值给少位数据,则 高位被截取忽略 ;少位数据赋值给多位数据,双状态类型的 高位赋值为0 ,四状态类型的 高位赋值为x 。(以上指的是无符号类型)
- 有符号变量转无符号变量,直接赋值的话会将 原始比特数据 赋给无符号变量,但其原符号位失去含义;使用转换语句转换的话,会将有符号变量 取模 赋值给无符号变量。
- 总之,还是尽量避免数据类型间的转换,数据类型间的转换是容易出错的地方,需要格外注意。
-
数据类型转换操作 :
//静态转换(不对转换值进行检查):
unsigned_data = unsigned'(signed_data);
int_data = int'(real_data);
real_data = real'(int_data);
//动态转换(仿真时对转换值进行检查,转换失败会报告):
//$cast(tgt, src);
$cast(unsigned_data, signed_data);
//静态和动态转换都属于显示转换,不借助操作符的转换称为隐式转换
logic data0;
bit data1;
data1 = data0;
定宽数组
- 数组声明 :
//变量左侧为矢量宽度,右侧为维度,且从左至右代表维度从高到低
//二维数组(习惯上左右顺序是从低到高,这对初始化很重要)
int data_a[0:15]; // 16个整数[0]...[15]
int data_a[16]; // 紧凑型声明
//多维数组(左边为高维度)
int data_a[0:7] [0:3];
int data_a[8] [4]; // 紧凑的多维数组声明
int data_a[7][3] = 1; // 为最后一个元素赋值
- 数组的初始化和赋值 :
int data_a[4] = '{0,1,2,3}; //data_a[0]为0 ... data_a[3]为3
int data_a[0:3] = '{0,1,2,3}; //data_a[0]为0 ... data_a[3]为3
int data_a[4] = '{4{1}}; //全赋值为1
int data_a[4] = '{5,default:-1}; //data_a[0]为5,其他为-1
- 存储空间 :
bit [3][7:0] b_pack;
bit [7:0] b_unpack [3];
logic [3][7:0] b_pack;
logic [7:0] b_unpack [3];
//变量左侧代表矢量宽度,右侧代表数组维度,也可以称为数组的合并与非合并,以上都可以代表24bit数据容量。
//二值逻辑bit声明,每bit位占用1bit空间,第一种声明占用1WORD空间,3x8bit,第二种声明占用3个WORD空间,3WORD x 1x8bit;
//四值逻辑logic声明,每bit位占用2bit空间,第一种声明占用2WORD空间,3x16bit,第二种声明占用3WORD空间,3WORD x 1x16bit。
//所以,在合适的时候选用合并数组,能够节省存储空间。(软件仿真时计算机空间占用都是以word为单位的)
- 数组操作之for和foreach循环 :
bit [31:0] src[5];
bit [31:0] dst[5