SystemVerilog中Packed Unions打印结果与预期不符疑问
问题原因解释
- Packed Union的本质特性
你定义的my_opcode_union_t是packed union,所有成员共享完全相同的物理内存空间,不同成员只是对同一段二进制数据的不同解读方式,不存在「写入了dword就读不到struct内容」的情况,二者的比特位是严格一一对应的:
- 你的packed struct总长度是16+16+16+16=64bit
- 你的dword成员是
logic[1:0][31:0],总长度也是2*32=64bit,二者内存布局完全对齐。
- 赋值的对应关系
你写入的两个dword值刚好对应struct各字段的合法枚举值,不是垃圾值:
cmd2.dword[1] = 32'h0001_0001:对应struct的高32位,高16位h0001匹配枚举SUB,低16位h0001匹配枚举MEMcmd2.dword[0] = 32'h0007_0008:对应struct的低32位,高16位h0007对应opA=h7,低16位h0008对应opB=h8
你看到的struct字段值完全是符合预期的正确输出。
- %p打印的默认行为
用%p打印union类型时,大多数SystemVerilog仿真器会默认使用union定义时第一个声明的成员的格式来输出内容。你在定义union时第一个成员是opcode_s,所以打印结果会自动把64位内存数据按struct的结构解析展示。如果你想要打印dword形式的内容,需要显式指定打印dword成员:
$display("cmd2.dword = %p", cmd2.dword);
内容的提问来源于stack exchange,提问作者newbie99
相关产品推荐
相关产品推荐

