SV芯片验证之自定义类型

verilog语言没有类似于typedef的方法可以让用户扩展变量类型和线网类型。

一、用typedef来创建用户自定义的类型

二、用enum来创建枚举类型

1、它被用来描述抽象变量的合法值范围,而每一个合法值(成员)都需要用户自己定义一个名字。

enum {red, green, blue} RGB;

RGB是一个枚举类型声明的变量,它有三个合法值:red、green、blue

2、它默认的数据类型是int,即32位的二值逻辑数据类型。也可以自己声明它的数据类型。

enum bit {TRUE, FALSE} Boolean;//默认值:TRUE是0,FALSE是1

enum logic  [1:0] {WAITE, LOAD, READY} state; 

默认值:WAITE是00,LOAD是01,READY是11。int sum = WAITE + LOAD + READY = 3

3、枚举类型里的成员也可以被赋值,但所赋的值必须满足所声明的数据类型要求

enum logic [2:0] {WAITE = 3'b001, LOAD = 3'b010, READY = 3'b100} state;

4、如果枚举类型被声明的数据类型是四值逻辑的话,也可以对其成员赋值X或者Z。

enum logic {ON = 1‘b1, OFF = 1'bz} out;

5、可以将枚举类型声明为自定义类型。

typedef enum {WAITE, LOAD,READY} states_t;

用states_t来指代或者表示enum {WAITE, LOAD, READY}这个枚举类型。

注:此处的states_t不是变量,而是枚举类型

states_t state, next_state;

此句代码中(结合上一句看),states_t就表示枚举类型,state和next_state则是枚举类型声明的两个变量,它们的类型是枚举类型。

enum {WAITE, LOAD,READY} states_t;

此句代码中,enum {WAITE, LOAD,READY}表示枚举类型,而states_t则是枚举类型声明的一个变量。

6、枚举类型赋值规则讲解。

//***枚举类型赋值规则讲解***
typedef enum {WAITE, LOAD, READY} states_t;
state_t state, next_state;
int foo;

//合法赋值操作,因为state和next_state都是枚举类型
state = next_state; 

//合法赋值操作,state虽是枚举类型,但1是整型,两者在做加法时,state会隐士转换为整型
foo = state + 1; 

//error:illegal assignment,非法赋值。foo是整型,等号右边相加是整型,整型不能赋值给枚举类型
state = foo + 1; 

// 非法赋值操作。等号右边state隐士转换成了整型,相加后为整型,无法赋值给枚举类型。
state = state + 1; 

//非法赋值操作。++表示state先转换为整型自加,然后赋值给枚举类型state。
state++; 

next_state += state; //非法赋值操作。同上一个理。

三、用struct来创建结构体类型 

1、结构体的成员可以是任何变量类型,包括自定义类型或者其他常理类型。

struct {

int a, b; //32-bit的变量

opcode_t opcode; //用户自定义类型

logic [23:0] address; //24-bit的变量

bit error; //1-bit的两值变量

} Instruction_Word;

上述代码中的Instruction_Word是结构体类型struct {...}声明的一个变量

结构体类型里成员的索引方式:结构体变量.成员名

如:Instruction_Word.address = 32'hF000001E;

表示对变量Instruction_Word里面的address成员进行赋值操作

结构体类型的类型默认也是变量类型,也可以显式地声明为var(变量类型)或者wire(线网类型)。

2、结构体类型也可以用typedef来自定义结构体类型。

typedef struct {

logic [31:0] a, b;

logic [7:0] opcode;

logic [23:0] address;

} instruction_word_t; 

上述代码表示把struct {...}这个结构体类型自定义为instruction_word_t,相当于用instruction_word_t来指代或者表示struct {...},所以此处的instruction_word_t是一个结构体类型,而不是一个变量

typedef A as B,如果在A和B之间加一个as,就能更好地理解typedef的作用了,把A定义成B。

instruction_word_t IW;

此句代码中的IW就是instruction_word_t这个结构体类型声明的一个变量

3、对结构体类型里的各个成员的赋值方法。

1)通过结构体声明的变量索引各个成员来赋值:

IW.a = 100;

IW.b = 50;

IW.opcode = 8'hFF;

IW.address = 0;

2) 通过单引号'和花括号{}来给结构体声明的变量整体赋值:

IW = '{100, 50, 8'hFF, 0};

IW = '{address:0, opcode:8'hFF, a:100, b:50}; //注意里面是冒号:,而不是 =

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值