system verilog中增加了类似C语言中的结构体类型,可以表示相关的信号的组合。
结构体声明:
1、变量声明:
var struct { // 通过var进行结构体变量声明
logic [31:0] a, b;
logic [ 7:0] opcode;
} Instruction_Word_var;
2、wire类型结构体声明
//结构体线网声明,定义为线网类型时,结构体的所有成员必须都是四态类型的
wire struct {
logic [31:0] a, b;
logic [ 7:0] opcode;
} Instruction_Word_net;
3、Point:结构体内不能使用线网类型。多个线网可以用SV接口打包成一个组。
4、自定义结构体:
typedef struct { //结构体定义,不分配存储器
logic [31:0] a, b;
logic [ 7:0] opcode;
logic [23:0] address;
} instruction_word_t;
instruction_word_t IW; // 结构体实例化时分配存储区
结构体赋值:
1、结构体在实例化的时候可以对其成员初始化:
instruction_word_t IW = ’{100, 3, 8’hFF, 0}; //赋值a=100 b=3 opcode=FF address=0
2、结构体成员赋值:
IW.a = 100; //引用结构体成员的名称对成员进行赋值
3、结构体表达式的默认值:
W = ’{ real:1.0, default:0, r1:3.1415 };
//r1=3.1415 其他real成员=1.0 其他成员=0 (precedence:显性成员名赋值>指定数据类型赋值>default)
RISCV_CS_Register的结构体实例:
typedef struct packed {
logic uie;
// logic sie; - unimplemented, hardwired to '0
// logic hie; - unimplemented, hardwired to '0
logic mie;
logic upie;
// logic spie; - unimplemented, hardwired to '0
// logic hpie; - unimplemented, hardwired to '0
logic mpie;
// logic spp; - unimplemented, hardwired to '0
// logic[1:0] hpp; - unimplemented, hardwired to '0
PrivLvl_t mpp;
} Status_t;
该片段为自定义的压缩结构体:压缩结构体按照指定的顺序以相邻的位来存储结构体成员。压缩结构体被当做一个向量存储,结构体的第一个成员在向量的最左边。向量的最低位是结构体最后一个成员最低位,其位编号为bit 0。
结构体实例化:
Status_t mstatus_q, mstatus_n;
赋值:
mstatus_n = '{
uie: csr_wdata_int[`MSTATUS_UIE_BITS],
mie: csr_wdata_int[`MSTATUS_MIE_BITS],
upie: csr_wdata_int[`MSTATUS_UPIE_BITS],
mpie: csr_wdata_int[`MSTATUS_MPIE_BITS],
mpp: PrivLvl_t'(csr_wdata_int[`MSTATUS_MPP_BITS])
};
mstatus_q <= '{
uie: 1'b0,
mie: 1'b0,
upie: 1'b0,
mpie: 1'b0,
mpp: PRIV_LVL_M
};
对结构体成员单独赋值:
mstatus_n.mpie = mstatus_q.uie;
mstatus_n.mie = 1'b0;
mstatus_n.mpp = PRIV_LVL_U;