文章目录
- 1. 内建数据类型
- 2. 用户自定义
- 3. 枚举类型
1. 内建数据类型
SV中引入新的数据类型logic,SV作为侧重于验证的语言,并不十分关切logic对应的逻辑应该被综合位寄存器还是线网,因为logic被使用的场景如果是验证环境,那么它只会作为单纯的变量进行赋值操作。
 引入的一个新的四态数据类型logic,可以代替reg;但是不能用在双总线和多驱动的情况下,此时只能使用网线类型,例如wire。
logic虽然只是表示数据类型,而在声明时,它默认会表示变量类型(variable),用户也可以显式声明其类型;
var		logic	[63: 0]	addr;	// a 64-bit wide variable
wire	logic	[63: 0]	data;	// a 64-bit wide net
与logic相对应的是bit类型,他们均可以构建矢量类型(vector),区别:
- logic为四值逻辑,0、1、Z、X
- bit为二值逻辑,0、1
  
bit					a	;		// 两态,单比特
bit	[31: 0]			b32	;		// 两态,32比特无符号
int					c32	;		// 两态,32比特有符号
byte				d8	;		// 两态,8比特有符号
shortint			e16	;		// 两态,16比特有符号
longint				f64	;		// 两态,64比特有符号
2. 用户自定义
在SV使用typedef关键字进行用户自定义类型的扩展。定义新的数据类型可以提高代码的可读性,复杂的数据类型(结构体、联合体)和特定的数组可以通过使用一个简单易懂的名字(别名)被定义为一个新的数据类型,这个新的类型就可以定义对应的变量:
typedef int my_favorite_type;
my_favorite_type	a, b;
这样的方法不是创建新的数据类型,只是在做文本替换;将一个特定的数组定义为新的数据类型:
parameter	OPSIZE = 8;
typedef reg	[OPSIZE-1: 0]	opreg_t;
opreg_t	op_a, op_b;
如果使用空的typedef事先对一个数据类型作出标识,那么它就可以在其定义之前使用:
typedef foo;
foo	f = 1;
typedef	int	foo;
一个用户自定义类型需要在类型的内容被定义之前声明。这对于由enum、sturct、union、class派生出的用户自定义类型很有用处:
typedef	enum	type_declaration_identifier;
typedef	struct	type_declaration_identifier;
typedef	union	type_declaration_identifier;
typedef	class	type_declaration_identifier;
typedef	type_declaration_identifier;
某些情况下,定义一个新的数据类型是必须的,因为在SV中要用过数据类型的标识符才可以做类型转换:
// typedef_examplemodule test_typedef ();typedef enum {red, green, blue, yellow, white, black} colors;colors my_colors;initial	begin$display ("my_colors's defaut value is %s", my_colors);my_colors = green;// my_colors = 1;			// err 需要做数据类型转换my_colors = colors'(3);		// 通过colors数据类型标识符做类型转换$display ("my_colors is %s", my_colors.name);endendmodule

3. 枚举类型
规范的操作吗和指令例如ADD、WRITE、IDLE等有利于代码的编写和维护,它比直接使用 'h01 这样的常量使用起来可读性和可维护性更好;
 枚举类型enum经常和typedef搭配使用,由此便于用户自定义枚举类型的共享使用;
 枚举类型的出现保证了一些非期望值的出现,降低来了设计风险;
enum [data_type] {name1 = value, name2 = value2, ..., nameN = valueN} var_name;enum {red, yellow, green} light1, light2;
无论是枚举名(red/yellow/…)还是他们的(整型)数值都必须是唯一的。他们的值可以被设置为任意整型常量值,或者从初始值0开始递增(默认情况)。
代码示例:
// enum_examplemodule test_enum ();// 默认值:red = 0, yellow = 1, green = 2;enum {red, yellow, green} light1, light2;	// 未命名的枚举类型(int类型)// 正确使用方法:IDLE = 0, S0 = 2, S1 = 3, S2 = xenum integer {IDLE, S0 = 'b10, S1 = 'b11, S2 = 'x} state, next;// 正确定义方法:silver和glod都没有指定大小enum {bronze = 3, silver, gold} medal;	// silver = 4, gold = 5// c被自动地指定为8enum {a = 3, b = 7, c} alphabet1;// d = 0, e = 7, f = 8enum {d, e = 7, f} alphabet2;initial	beginlight1	=	red		;light2	=	green	;// light1	=	gold;		// err$display ("light1 is %0d or %s", light1, light1);$display ("light2 is %0d or %s", light2, light2);state	=	S1;next	=	S2;$display ("state is %0d or %s", state, state);$display ("next is %0d or %s", next,next);medal	=	silver	;$display ("medal is %0d or %s", medal, medal);alphabet1	=	c	;$display ("alphabet1 is %0d or %s", alphabet1, alphabet1);alphabet2	=	d	;$display ("alphabet2 is %0d or %s", alphabet2, alphabet2);end// try something elsereg	[ 3: 0]	err;initial	beginerr	=	a;$display ("err is %0d or %s", err, err);endendmodule

typedef enum {INIT, DECODE, IDLE} fsmstate_e;
fsmstate_e	pstate, nstate;	// 声明自定义类型变量
case (pstate)IDLE: nstate = INIT;	// 数据赋值INIT: nstate = DECODE;default: nstate = IDLE;
endcase
$display ("Next state is %s", nstate.name());

**枚举类型可以直接赋值给整型,整型不能直接赋值给枚举类型,需要做一个枚举类型的类型转换,这样在仿真的时候更安全。
INT = enum;
enum = ENUM'(INT);// enum_testmodule enum_test ;// 默认值:red = 0, green = 1, blue = 2;typedef enum {red, green, blue} Colors;Colors	my_color;initial	beginmy_color	=	red;$display ("@0 my_color is %d or %s", my_color, my_color);my_color	=	blue;$display ("@1 my_color is %d or %s", my_color, my_color);//		my_color	=	int'(2);		// err
//		// An enum variable 'my_color' of type 'Colors' may only be assigned 
//		// the same enum typed variable or one of its values. 
//		// Value '2' requires an explicit cast.
//		$display ("@2 my_color is %d or %s", my_color, my_color);my_color	=	Colors'(1);$display ("@2 my_color is %d or %s", my_color, my_color);endendmodule

版权声明:本文为CSDN博主「Bunny9__」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
 原文链接:https://blog.csdn.net/Bunny9__/article/details/122494130