目录
数据类型
基本数据类型
time 64位整数,默认单位为秒
real 来自Verilog,就如C的double类型,64位
shortreal 来自C的float类型,32位
string 可变长度的字符数组
void 空返回,用于函数
整数数据类型
shortint 16位整型
int 32位整型
longint 64位整型
byte 8位整型(ASCII字符)
integer 32位整型(四态)
**以上五种数据类型默认是有符号数,如果想用无符号数定义时如下改动:
int unsigned using_int;
bit 0或1
reg 来自Verilog(四态)
logic 基本等同于reg
**以上三种数据类型默认是有符号数,如果想用无符号数定义时如下改动:
reg signed sig_reg;
SystemVerilog对reg的数据类型作了改进, 可以被连续赋值语句、 门逻辑和模块直接驱动。 另外, SystemVerilog还引入了一个新的四态数据类型logic, 可以代替reg; 但是不能用在双向总线和多驱动的情况下, 此时只能使用wire。
虽然SystemVerilog支持被连续赋值的reg类型,但是在做设计时用的还是Verilog,Verilog不支持这种类型,所以建议仿真时用logic。
枚举类型
通俗的讲,枚举类型定义了一组具有名字的值。可以看做整合的宏定义;
枚举类型可以如下定义:
enum [data_type] {name1=value1,name2=value2,...,nameN=valueN} var_name;
当没有指定数据类型的时候,缺省的数据类型是int。 在枚举类型中使用的任何其他数据类型都要求显式地声明。
无论是枚举名 还是它们的数值都必须是唯一的。 它们的值可以被设置为任意整型常量值, 或者从初始值0开始递增 ( 默认情况) 。
枚举变量不能被在枚举集合范围以外的数值直接赋值, 除非使用强制类型转换或者该枚举变量是一个联合体的成员。
SystemVerilog为枚举类型提供了如下内置方法:
- first:返回枚举类型中第一个成员的值。
- last:返回枚举类型中最后一个成员的值。
- next (int unsigned N=1):以当前成员为起点,返回后续第 N 个成员的值,默认是下一个成员的值;若起点为最后一个成员,则默认返回第一个成员的值。
- prev (int unsigned N=1):以当前成员为起点,返回前面第 N 个成员的值,默认是前面一个成员;若起点为第一个成员,则默认返回最后一个成员的值。
- num:返回该枚举类型的成员数目。
- name:以字符串的形式返回该成员名字。
enum {red,yello,green,blue} Colors;
initial begin
Colors=Colors.next; //默认当前成员是第一个;
$display("%s : %d",Colors.name,Colors);
Colors=red;
$display("%s : %d",Colors.name,Colors);
Colors=Colors.last;
$display("%s : %d",Colors.name,Colors);
Colors=Colors.next; //当前成员是最后一个;
$display("%s : %d",Colors.name,Colors);
end
打印结果:
# yello : 1
# red : 0
# blue : 3
# red : 0
用户自定义类型
定义如下:
typedef int my_type;
例如:
parameter width = 8;
typedef reg [width-1:0] temp;
temp a,b; //a,b为长度为8的数组;
其实你并未创建一个新的数据类型,而只是在做文本替换;
typedef enum {red,green,blue,yello} colors;
colors mycolors;
initial begin
$display("mycolors' default value is %s",mycolors);
mycolors=green;
mycolors=colors'(2); //类型转换;
$display("mycolors is %s", mycolors.name);
end
modelsim打印如下:
# mycolors'