Verilog结构体struct内使用const关键字编译报错咨询
SystemVerilog结构体中使用const的问题
首先明确:SystemVerilog的结构体不能直接在成员声明时用const关键字并初始化,这就是你编译报错“expecting a symbol that could start a datatype”的原因——编译器在结构体成员的声明位置,不认可const作为合法的类型修饰符。
正确实现方式
方式1:结构体实例化时用const修饰并初始化固定成员
先定义不带const的结构体类型,然后在创建实例时,用const修饰整个实例,同时初始化那些需要固定值的成员:
typedef struct { bit SOF; // 帧起始位 bit [10:0] MSG_ID; // 唯一消息ID bit ID_XTND; // 基格式固定为1'b0 bit [3:0] CTRL; // 数据长度码 bit [15:0] DATA; // 简化负载数据 bit [15:0] CRC; // 循环冗余校验 bit CRC_EOF; // CRC结束分隔位 bit [6:0] EOF; // 帧结束字段 } CAN_FRAME_t; // 创建常量实例,固定值成员初始化后无法修改 const CAN_FRAME_t can_frame_default = '{ SOF: 1'b0, ID_XTND: 1'b0, CRC_EOF: 1'b0, EOF: 7'b1111111, // 可变成员赋默认值 MSG_ID: '0, CTRL: '0, DATA: '0, CRC: '0 };
后续可以基于这个常量实例,通过复制并修改可变成员来生成新的帧数据。
方式2:改用类实现带常量成员的结构
如果你的场景允许使用面向对象语法,类支持直接在成员声明时用const修饰并初始化:
class CAN_FRAME; const bit SOF = 1'b0; // 帧起始位 bit [10:0] MSG_ID; // 唯一消息ID const bit ID_XTND = 1'b0; // 基格式固定为1'b0 bit [3:0] CTRL; // 数据长度码 bit [15:0] DATA; // 简化负载数据 bit [15:0] CRC; // 循环冗余校验 const bit CRC_EOF = 1'b0; // CRC结束分隔位 const bit [6:0] EOF = 7'b1111111; // 帧结束字段 endclass
类的const成员会在对象构造时完成初始化,之后无法被修改,完全符合你对常量成员的需求。
内容的提问来源于stack exchange,提问作者SG9
相关产品推荐
相关产品推荐

