如何指定依赖索引值的参数?DML1.2转1.4遇语法错误
DML 1.4 依赖索引的参数设置方案
在DML 1.4中,group的param要求是编译期可确定的常量表达式,你原代码里的i是group的索引变量,在单个group块中属于运行时可变值,因此i < 64无法被识别为常量,导致报错。
解决思路是将不同索引范围的队列拆分,分别实例化,让每个实例的参数都能在编译期确定:
方案1:使用模板复用公共代码
先定义一个包含公共逻辑的模板,再针对不同索引范围实例化:
// 定义公共模板,接收寄存器组和索引偏移作为参数 template rx_queue_base(reg_group, idx_offset) { <...> // 这里放队列的公共代码,比如队列的属性、方法等 param desctype = reg_group[idx_offset].DESCTYPE.val; <...> } // 实例化索引0~63的队列 group rx_queue [i < 64] extends rx_queue_base(regs.SRRCTL12, i); // 实例化索引64~NQUEUES-1的队列 group rx_queue [i >= 64 && i < NQUEUES] extends rx_queue_base(regs.SRRCTL2, i - 64);
方案2:拆分group+混入公共代码
如果不想用模板,也可以直接拆分group块,用mixin复用公共逻辑:
// 定义公共代码块 mixin rx_queue_common { <...> // 队列的公共属性、方法等 } // 处理索引0~63的队列 group rx_queue [i < 64] { mixin rx_queue_common; param desctype = regs.SRRCTL12[i].DESCTYPE.val; } // 处理索引64~NQUEUES-1的队列 group rx_queue [i >= 64 && i < NQUEUES] { mixin rx_queue_common; param desctype = regs.SRRCTL2[i - 64].DESCTYPE.val; }
这两种方式都能让每个rx_queue实例的desctype参数在编译期确定,符合DML 1.4的语法要求。
内容的提问来源于stack exchange,提问作者odenysex
相关产品推荐
相关产品推荐

