DML混合版本设备中in each语句为何无法正常工作?
问题
我有一段基于DML 1.4的通用代码,希望通过in each语句验证所有寄存器的所有字段是否正确设置了参数,代码如下:
dml 1.4; //import "each-bank.dml"; template stop_template { param stop default true; } template dont_stop is stop_template{ param stop = false; } in each bank { in each register { in each field { is stop_template; #if (this.stop) { error "Stop here"; } } } }
但在DML 1.2的设备中,即使手动为寄存器添加模板或参数,错误语句仍会在d.o寄存器上触发,相关设备代码及报错信息如下:
设备代码:
dml 1.2; device each_device; import "each-import.dml" bank a { register x size 4 @0x0 { field alpha @[2:0] { is dont_stop; } } } bank d { register o size 4 @0x0 is stop_template; }
报错信息:
DML-DEP each-device.dmldep DEP each-device-dml.d DMLC each-device-dml.c Using the Simics 5 API for test-device module /modules/test-device/each-device.dml:15:5: In d.o /modules/test-device/each-import.dml:18:17: error: Stop here ... gmake: *** [test-device] Error 2
相同代码在DML 1.4设备中可正常工作,请问in each语句是否不支持混合版本的DML设备?
解答
是的,in each语句在跨DML版本(如DML 1.4通用代码导入到DML 1.2设备)的场景下存在兼容性问题,核心原因是两个版本在特性实现上的差异:
- 隐式字段处理不同:DML 1.2中,未显式定义字段的寄存器会自动生成一个覆盖整个寄存器的隐式字段;而DML 1.4无此自动行为。你代码中的
d.o寄存器没有定义字段,DML 1.2生成的隐式字段并未继承stop_template模板,因此stop参数使用默认值true,触发了错误。 - 模板与遍历逻辑的跨版本兼容问题:DML 1.4的模板特性和
in each遍历逻辑,在作用于DML 1.2的隐式字段时,无法正确识别给寄存器添加的模板参数,导致判断逻辑失效。
可行的解决方式:
- 针对DML 1.2设备,为所有寄存器显式定义字段,并给每个字段添加对应的模板(
dont_stop或stop_template),避免隐式字段触发错误; - 统一代码的DML版本,将DML 1.2设备升级到DML 1.4,即可完全兼容原有通用代码的验证逻辑。
内容的提问来源于stack exchange,提问作者JesusCoyotzi
相关产品推荐
相关产品推荐

