DML 1.4中如何为寄存器数组单个寄存器添加指定字段?
正确实现寄存器数组的方案
针对你需要创建的寄存器数组,可通过寄存器类型继承+数组元素重载或单独为指定索引寄存器追加字段的方式实现,以下是两种可行方案:
方案一:使用寄存器类型重载
先定义基础寄存器类型和带特殊字段的寄存器类型,再用不同类型初始化数组元素:
// 定义通用的基础寄存器类型,无特殊字段 regtype base_feature_reg size 4 is unmapped; // 定义继承自基础类型的特殊寄存器,包含目标字段 regtype version_feature_reg extends base_feature_reg { field virtio_f_version_1 @ [0] { param init_val = 1; desc = "VIRTIO_F_VERSION_1"; } } // 初始化寄存器数组,默认使用基础类型 register feature_bits[i < N_FEATURE_SELECT_REGS] using base_feature_reg; // 重载索引1的寄存器,使用带字段的特殊类型 feature_bits[1] using version_feature_reg;
方案二:直接为指定索引寄存器添加字段
先定义完整的寄存器数组,再单独为索引1的寄存器追加字段:
// 初始化所有寄存器为无字段的通用类型 register feature_bits[i < N_FEATURE_SELECT_REGS] size 4 is unmapped; // 为索引1的寄存器第0位添加目标字段 add field virtio_f_version_1 @ feature_bits[1].[0] { param init_val = 1; desc = "VIRTIO_F_VERSION_1"; }
你之前两种方法失败的原因:
- 方法一:多数寄存器描述语言(如SystemRDL)不支持在数组寄存器的定义块内使用
#if针对索引做条件编译,预处理阶段无法感知数组的动态索引值,导致条件判断失效。 - 方法二:重复声明
feature_bits[1]属于符号重定义,编译器会抛出重复定义的错误,不允许对同一寄存器元素进行多次声明。
内容的提问来源于stack exchange,提问作者toffe
相关产品推荐
相关产品推荐

