如何在RegIf中正确使用SpinalEnum作为寄存器字段
报错原因
出现value C is not a member of object regiftest.SourceEnum报错,核心原因是SpinalEnum伴生对象上的C类型成员不会在枚举定义阶段自动生成:只有第一次实例化该枚举的硬件信号、或者定义枚举时手动指定默认编码规则时,SpinalHDL才会自动给伴生对象注入这个C类型别名。你之前能正常使用.C的场景,都是代码提前触发了枚举实例化流程,而当前RegIf.field调用时,访问SourceEnum.C的动作发生在枚举首次实例化之前,编译器自然找不到对应成员。
解决方法
不需要使用B(SourceEnum().getBitsWidth)配合assignFromBits的临时方案,以下两种标准写法可直接实现枚举类型作为RegIf字段的需求,返回的寄存器字段本身就是对应枚举类型,可直接连接、赋值:
- 方法1:定义枚举时指定默认编码,定义后即可直接调用
SourceEnum.C
// 定义枚举时传入默认编码规则,常用编码包括binarySequential、binaryOneHot等 object SourceEnum extends SpinalEnum(binarySequential) { val src1, src2, src3 = newElement() } // 寄存器定义逻辑无需修改 val busif = BusInterface(...) val ctrl = busif.newReg("Control register") val source = ctrl.field(SourceEnum.C, RW, doc = "Data source")
- 方法2:不指定全局默认编码,直接传入枚举实例作为字段类型参数
object SourceEnum extends SpinalEnum { val src1, src2, src3 = newElement() } val busif = BusInterface(...) val ctrl = busif.newReg("Control register") // 直接传入枚举实例,返回值自动推断为对应枚举类型 val source = ctrl.field(SourceEnum(), RW, doc = "Data source") // 若需要指定特定编码,可写成SourceEnum(C)
内容的提问来源于stack exchange,提问作者Marek Pikuła
相关产品推荐
相关产品推荐

