如何生成参数数组?DMLC模板参数赋值报错求助
解决DMLC中Control-FSM管控IP组的参数数组与类型匹配问题
问题背景
你需要实现Control-FSM分组管控IP的逻辑,最初的代码尝试直接用组名数组赋值给ip_list报错,后续通过子模板分组又遇到类型不匹配问题,以下是具体错误原因和解决方法:
错误1:not a value: [ip_1, ip_2]
直接使用[ip_1, ip_2]这种字面量数组赋值给ip_list不符合DMLC的语法规则——DMLC不允许直接将组实例以字面量序列的形式作为参数值,必须通过each遍历语法来构造符合要求的序列。
错误2:类型不匹配(list of trait ip_group1_template vs list of trait ip_template)
虽然ip_group1_template继承自ip_template,但DMLC的类型系统不会自动将子模板的序列向上转型为父模板的序列,因此直接赋值会触发类型检查错误。
解决方案
方案1:使用标签(Tag)分组IP,无需新增子模板
通过给IP组添加标签,然后在Control-FSM中通过each语法筛选对应标签的IP,既避免子模板的类型问题,又能正确构造序列:
template control_fsm_template { param ip_list : sequence (ip_template); param ip_list default undefined; method gm1() { foreach ip in ip_list { if (ip.p1) ip.m1(); } } } template ip_template { param p1; param p2; connect c1; port c2; method m1() {} method m2() {} } // 给IP组添加标签区分分组 group ip_1 is (ip_template) tagged "group1"; group ip_2 is (ip_template) tagged "group1"; group control_fsm1 is (control_fsm_template) { // 筛选带"group1"标签的ip_template实例 param ip_list = each ip_template tagged "group1" in (dev); } group ip_3 is (ip_template) tagged "group2"; group ip_4 is (ip_template) tagged "group2"; group control_fsm2 is (control_fsm_template) { param ip_list = each ip_template tagged "group2" in (dev); }
方案2:显式类型转换或调整模板参数约束
如果必须使用子模板分组,有两种方式解决类型问题:
方式A:使用as关键字显式转换类型
在赋值时将子模板序列转换为父模板类型:
template ip_group1_template is (ip_template); template ip_group2_template is (ip_template); group ip_1 is (ip_group1_template); group ip_2 is (ip_group1_template); group control_fsm1 is (control_fsm_template) { // 显式将子模板序列转换为ip_template类型 param ip_list = each ip_group1_template in (dev) as ip_template; } group ip_3 is (ip_group2_template); group ip_4 is (ip_group2_template); group control_fsm2 is (control_fsm_template) { param ip_list = each ip_group2_template in (dev) as ip_template; }
方式B:放宽Control-FSM的参数类型约束
将ip_list的类型改为接受任意ip_template的子类型序列,通过trait约束实现:
// 修改control_fsm_template的参数类型为trait约束 template control_fsm_template { // 约束ip_list的元素是ip_template的子类型 param ip_list : sequence (trait T: ip_template); param ip_list default undefined; method gm1() { foreach ip in ip_list { if (ip.p1) ip.m1(); } } } template ip_group1_template is (ip_template); template ip_group2_template is (ip_template); group ip_1 is (ip_group1_template); group ip_2 is (ip_group1_template); group control_fsm1 is (control_fsm_template) { param ip_list = each ip_group1_template in (dev); } group ip_3 is (ip_group2_template); group ip_4 is (ip_group2_template); group control_fsm2 is (control_fsm_template) { param ip_list = each ip_group2_template in (dev); }
内容的提问来源于stack exchange,提问作者user20973675
相关产品推荐
相关产品推荐

