DML条件内嵌套in each语句出现未知标识符错误的原因与解决方法
DML条件编译自定义参数报错的原因与解决办法
问题场景
以下DML代码编译时触发未知标识符错误:
dml 1.4; param MACRO = true; #if (MACRO){ in each bank { in each register { param something = 1; } } }
报错信息:
/modules/test-device/test-device.dml:179:6: error: unknown identifier: 'MACRO'
但使用内置预定义宏的代码可正常运行:
dml 1.4; #if (dml_1_2){ in each bank { in each register { param something = 1; } } }
原因分析
- DML的
#if条件编译属于预处理阶段操作,该阶段执行时间早于文件内自定义param的解析流程。自定义的MACRO参数要到后续语法解析阶段才会被处理,因此预处理时无法识别该标识符,直接抛出错误。 dml_1_2是DML内置的预定义宏,属于预处理阶段就存在的全局标识符,因此能被#if正常识别。- 你提到的
ECONDINEACH错误是语法检查阶段的报错,但本次因为预处理阶段就出现标识符未找到的问题,流程提前终止,所以没触发后续的条件内in each检查。
解决办法
要在条件编译中使用自定义开关,需通过编译命令行参数传递宏定义,具体步骤:
- 删除文件内的
param MACRO = true;语句 - 编译时通过
-D参数传入宏:
dmlc test-device.dml -D MACRO=true
通过这种方式,MACRO会在预处理阶段被加载识别,可正常用于#if判断。
注:若尝试用DML静态条件判断替代预处理#if,由于in each语句本身不允许放在条件块内,这种场景下命令行传参是唯一可行的方案。
内容的提问来源于stack exchange,提问作者JesusCoyotzi
相关产品推荐
相关产品推荐

