SystenVerilog:
- 加入了结构体类型。
- 加入了联合体类型。
- 在数据如何表示以及数组的操作方面,对Verilog的数组结构进行了拓展。
5.1 结构体
- 用struct关键字声明。结构体内的成员可以是任何数据类型,包括用户自定义类型和结构体类型。
例子:struct{ int a,b ; opcode_t opcode ; logic [23:0] address ; bot error ; }Instruction_word; - 与C语言结构体比较:SystemVerilog不允许使用C语言中的“标记(tag)”。
- 与数组比较:数组是用类型同位数的元素集合,而结构体是不同类型不同位数的变量或者常量的集合。
- 结构体提供了将相关数据集合在一个相同名称下的机制,数据的每一部分可以通过名称来单独引用,整个组也可以作为整体引用。
5.1.1 结构体的声明
- 变量(未指定则默认为变量)
var struct{ logic [31:0] a,b; logic [7:0] opcode; logic [23:0] address; } Instruction_word_var; - 线网
wire struct{ logic [31:0] a,b; logic [7:0] opcode; logic [23:0] address; } Instruction_word_net; - typedef
typedef struct{ logic [31:0] a,b; logic [7:0] opcode; logic [23:0] address; } Instruction_word_t; - 匿名结构体
struct{ logic [31:0] a,b; logic [7:0] opcode; logic [23:0] address; } Instruction_word; - 局部或者共享结构体
在模块或者接口内定义。
5.1.2 结构体的赋值
- 初始化
使用 '{} 内的一组值在实例化结构体时初始化。大括号内值的个数与成员的个数一致。Instruction_word_t IW = '{100, 3, 8, 8'hff, 0}; - 成员赋值
- 通过成员名称赋值
nstruction_word_t IW; ... IW.a = 100; IW.b = 3; - 将结构体表达式赋值给结构体
跟初始化格式一样按顺序赋值,或者指定名称赋值,但是不能混用。nstruction_word_t IW,IW1; ... IW = '{100, 3, 8, 8'hff, 0} ; //1. 按照顺序赋值 IW1 = '{a:100, address:0, b:3, opcode:8'hff}; //2. 按照名称赋值 - 结构体表达式的默认值
结构体的部分或者全部成员可以被赋一个默认值,default优先级最低。truct{ real [31:0] a,b ; logic [7:0] opcode ; logic [23:0] address; } Instruction_word; nstruction_word_t IW,IW1; ... IW = '{default:0} ; //设置IW所有成员为0。 IW1 = '{default:0, real:1.0}; //由于default优先级最低,设置IW所有real类型成员为1.0,其他为0。
- 通过成员名称赋值
5.1.3 压缩和非压缩结构体
| 非压缩结构体 | 压缩结构体 |
|---|---|
| 结构体内成员被当作独立的变量或常量 | 按照指定的顺序以相邻的为来存储结构体成员 |
| 成员可以是不同类型和位宽的变量或常数 | 只能包含压缩变量,结构体所有成员都可以用向量表示。 |
-
压缩结构体的声明
使用packed关键字。struct packed { logic valid; logic [ 7:0] tag ; logic [31:0] data ; }data_word;压缩结构体被当作向量存储,所以可以通过读写向量的方式访问结构体成员。
|valid-----|tag-----|data-----|
|40--------|39------|31------0| -
压缩结构体的操作
对向量的算术操作,逻辑操作以及任何其他操作都可以用于压缩结构体。 -
有符号的压缩结构体
- 压缩结构体可以用关键字signed或unsigned声明成有符号或者无符号的,这只影响到整个结构体在算术或者相关操作。
- 成员有符号还是无符号依赖于成员的类型声明。
- 对压缩结构体部分选择相当于对变量的部分操作,始终是无符号的。
5.1.4 通过端口传递结构体
结构体必须首先使用typedef定义为用户自定义数据类型,才允许将模块或接口的端口声明为结构体类型。
至于如何声明typede

本文详细介绍了SystemVerilog中的结构体(struct)、联合体(union)和数组的使用,包括它们的声明、赋值、压缩与非压缩形式,以及在端口传递和任务函数中的应用。重点讲解了结构体和联合体中的成员类型、初始化、赋值方法和综合指导,同时也涵盖了数组的多维操作、初始化、赋值和遍历。此外,还提到了$bit位宽系统函数和用于数组查询的系统函数。
最低0.47元/天 解锁文章
2683

被折叠的 条评论
为什么被折叠?



