1.信号声明
语法:
变量类型 信号类型 符号转换 位宽 信号名 深度;
2.变量类型
(1)说明:
systemverilog中的信号类型主要分为线网类型(wire)和变量类型(var);
(2)关键字
wire //线网类型
var //变量类型
(3)特点:
线网类型的信号只能进行连续赋值,变量类型的信号既可以连续赋值又可以在过程块中进行赋值;
(4)使用注意点:
使用时,线网类型的信号要用wire关键字进行修饰,变量类型的信号要用var关键字进行修饰,缺省默认是变量类型;
在systemverilog中,reg类型是变量类型中的一种,所以我们一般直接使用var类型;
在systemverilog中,var类型既可以连续赋值又可以在过程块中赋值,而在verilog中,reg类型只能在过程块中赋值;
(5)例子
结果:
注意:如果w2类型声明是wire logic w2;时,w2就只能用连续赋值;而var类型的信号既可以连续赋值又可以在过程块中赋值;
3.数据类型
(1)说明
systemverilog中数据类型有两种,四值逻辑(0,1,x,z)和二值逻辑(0,1);
(2)关键字
四值逻辑(硬件逻辑)
logic
二值逻辑:
bit //1位宽二值逻辑
byte //8位宽二值逻辑
shortint //16位宽二值逻辑
int //32位宽二值逻辑
longint //64位宽二值逻辑;
(3)使用注意点
缺省默认为四值逻辑;
二值逻辑一般会将前面的变量类型声明缺省;
4.符号
(1)说明
信号可以分为有符号数和无符号数;
(2)分类
无符号数:wire,reg,logic,bit
有符号数:byte,shortint,int,longint,integer
(3)符号转换
可以在无符号信号名前加signed关键字,将信号转换为有符号;
可以在有符号信号名前加unsigned关键字,将信号转换为无符号;
(4)注意点
二值逻辑可以直接赋值给四值逻辑,四值逻辑赋值给二值逻辑存在以下转化:
(5)例子
5.其他类型
(1)自定义类型(typedef)
i 说明
用来创建用户自定义类型;
通常会配合枚举类型(enum)和结构体类型(struct)联合使用;
ii 语法
typedef 类型 自定义类型名;
iii 注意
一般自定义类型名后面都加一个** _t **
iv 例子
结果:
(2)枚举类型(enum)
i 说明
定义一个抽象变量,并限定其取值范围;
ii 语法
enum 变量类型 {取值范围} 变量名;
iii 注意
枚举类型的变量类型可以缺省,默认是int类型;
枚举类型的取值范围,没有指定具体值时,会默认从0递增;
iv例子
v扩展1-联合typedef使用
联合typedef使用,将枚举类型指定为自定义类型使用;
语法:
//定义
typedef enum 变量类型 {取值范围} 类型名;
//声明
类型名 实例化变量名;
例子:
结果:
注意:
枚举类型声明的是一个变量,通过typedef声明后,才是一个类型;
vi 扩展2-枚举类型的赋值
同一枚举类型的变量之间,可以直接赋值;
枚举类型的变量,可以赋值给整形;
整形的变量,不可以赋值给枚举类型;
枚举类型不能作数学运算;
(3)结构体类型(struct)
i 说明
将相关联的信号,打包,放在一个组里面;
ii 语法
//定义
struct {
成员变量1;
...
成员变量n;
} 结构体名 ;
//索引
结构体名.成员变量名
iii 注意
结构体声明的是一个变量,通过typedef声明后,才是一个类型;
iv 结构体的赋值方式
方式一:结构体变量名.成员变量 = 值;
方式二:结构体变量名=‘{成员变量1取值,成员变量2取值,…,成员变量n取值};
方式三:结构体变量名=’{成员变量1名:成员变量1取值,成员变量2名:成员变量2取值,…,成员变量名n:成员变量n取值};
v 扩展
可以用typedef将结构体变为类型;
语法:
typedef struct {
成员变量;
} 结构体名;
vi 例子
结果:
(4)字符串类型(string)
i 说明
用来存储可变长度的字符串;
ii 语法
string 字符串变量名 = "值";
iii 注意
字符串存储单元为byte类型;
长度为N的字符串,索引为0~N-1;
不同于C语言,字符串末尾没有空字符;
iv 字符串常用的操作(内建方法)
str.len(); //返回字符串的长度
str.putc(i,c); //将第i个字符替换为c,等效为str[i] = "c";
str.get(c); //返回第i个字符
str.substr(i,j); //将第i个字符到第j个字符的字符串返回
str.{atoi(),atohex,atooct,atobin}; //将字符串转变为十进制,十六进制,八进制或者二进制数据
v 例子
结果:
说明:
由s2可以看出,字符串类似动态数组,长度会根据付得知动态调整;
由s3可以看出,字符串每个字符是按照ASCII码进行编码的,要得到每个字符的值需要索引到具体的字符;
由s4可以看出,字符串每个字符按照byte类型存储,当字符长度不匹配时,会存在截断;
i为内建方法的使用;