-
结构体不同于数组,数组是同类型同尺寸的元素集合,而结构体是不同类型和尺寸的变量和常量的集合。数组元素是通过索引引用,而结构体成员通过成员名称引用。
-
结构体内部只能是变量,而不能是线网。可以将结构体整体声明为变量或线网,如果未指定,整个结构体将默认为是一个变量。
// 将结构体整体声明为一个变量
var struct {
logic [31:0] a,b;
...
} instruction_t;
// 将结构体整体声明为一个线网
wire struct {
logic [31:0] a,b;
...
} instruction_t;
// 未指定默认为变量
struct {
logic [31:0] a,b;
...
} instruction_t;
- 结构体在实例化的时候可以对其成员初始化。使用`{}的方式赋值,大括号里的值的个数必须与成员的个数一致。
typedef struct {
logic [31:0] a,b;
logic [7:0] opcode;
logic [23:0] address;
} instruction_t;
// 在定义结构体变量的时候,赋初始值的个数要一致
instruction_t IW = `{
100,3,8'hFF,0};
// 整个结构体可以使用结构体表达式进行赋值,跟赋初始值是一样的
instruction_t IW;
IW = `{
100,3,8'hFF,0};
// 也可以对单个成员赋值
IW.a = 100;
// 结构体表达式也可以指定被赋值的结构体成员名称,使用冒号隔开成员名称和要赋值的值
IW = `{
a:100, b:3, opcode:8'hFF, address:0};
// 在同一个结构体表达式中混合使用成员名称和成员顺序是不合法的
IW = `{
a:100, b:3, 8'hFF, 0}; // 这种是错误的写法
- 结构体的优先级:可以给所有成员指定为默认值,也可以使用数据类型的关键字给结构体中特定的数据类型指定默认值。成员赋值还有个优先级的问题,default关键字具有最低的优先级,指定数据类型的默认值又会被任意显性使用成员名称的赋值覆盖。
// 所有成员赋默认值
IW = `{
default:0};
// 使用数据类型关键字赋默认值
typedef struct {
real r0,r1;
int i0,i1;
} instruct_t;
instruct_t IW = `{
real:1.0, default

本文详细介绍了Verilog中的结构体与数组概念,包括结构体的声明与使用、数组的索引与初始化方法,以及结构体与数组之间的赋值规则。此外,还对比了结构体与联合体的区别。
最低0.47元/天 解锁文章
1225

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



