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}; //注意里面是冒号:,而不是 =