为何打包结构体(packed struct)不能包含数组?报错原因咨询
SystemVerilog打包结构体数组字段报错解析
代码与报错信息
用户编写的SystemVerilog代码:
typedef struct packed { logic [7:0] marker [2]; // BYTE marker[2] -> Array of 2 bytes logic [15:0] length; // WORD length -> 2 bytes (16 bits) logic [7:0] jfif [5]; // BYTE jfif[5] -> Array of 5 bytes logic [7:0] major_vid; // BYTE major_vid -> 1 byte (8 bits) logic [7:0] minor_vid; // BYTE minor_vid -> 1 byte (8 bits) logic [7:0] pixel_density_unit; // BYTE pixel_density_unit -> 1 byte (8 bits) logic [15:0] x_density; // WORD x_density -> 2 bytes (16 bits) logic [15:0] y_density; // WORD y_density -> 2 bytes (16 bits) logic [7:0] x_thumbnail; // BYTE x_thumbnail -> 1 byte (8 bits) logic [7:0] y_thumbnail; // BYTE y_thumbnail -> 1 byte (8 bits) } jm_app0_t;
运行后报错:
Field 'marker' in packed struct is not packed. Field 'jfif' in packed struct is not packed.
问题解答
1. “字段未打包”的含义
SystemVerilog的packed struct要求所有成员字段都是打包类型,即字段的所有比特能被无间隙地连续映射成单一的比特流,不存在额外的内存对齐或填充空间。报错中的“字段未打包”,指marker和jfif属于非打包类型,无法满足打包结构体的连续布局要求。
2. 固定大小数组不符合要求的原因
你声明的logic [7:0] marker [2]属于非打包数组(unpacked array)——这是SystemVerilog数组的默认类型,哪怕是固定大小的。非打包数组的每个元素独立存储,元素之间可能存在对齐填充,无法合并成连续的比特序列,而打包结构体要求整个结构体的比特连续无间隙,因此这类数组不能直接放在packed struct中。
修正方案
要在打包结构体中使用数组,需将其声明为打包数组(packed array),把数组维度放在数据位宽的前面,让数组所有元素连续布局:
typedef struct packed { logic [1:0][7:0] marker; // 打包数组:2个字节连续排列 logic [15:0] length; logic [4:0][7:0] jfif; // 打包数组:5个字节连续排列 logic [7:0] major_vid; logic [7:0] minor_vid; logic [7:0] pixel_density_unit; logic [15:0] x_density; logic [15:0] y_density; logic [7:0] x_thumbnail; logic [7:0] y_thumbnail; } jm_app0_t;
修改后,marker和jfif会作为连续比特序列嵌入打包结构体,符合语法要求。
内容的提问来源于stack exchange,提问作者gyuunyuu
相关产品推荐
相关产品推荐

