我正在尝试将一些模块迁移到DML 1.4,在银行内容迭代过程中遇到了一些问题。具体来说,我最初有下面的代码片段:
select reg in ($signals.unmapped_registers) where (reg.signal_number == signal) {
// some statements here
} else {
log "unimplemented", 1: "Power/Board: Signal %d is unimplemented", signal;
return;
}
然而,unmapped_registers在DML 1.4中无效,从而导致未知标识符编译错误。
我应该如何迭代DML 1.4中特定银行的所有未映射寄存器并根据一些特定标准(即signal_number参数)选择我想要的寄存器?
我已经尝试将select语句与foreach语句交换,但是没有成功。
我还尝试遍历实例化特定模板的所有银行寄存器,但仍然没有成功。
您需要在以signal_number
为类型成员的模板上使用foreach
。
当你使用foreach
进行迭代时,迭代变量是一个运行时模板引用,这意味着不是所有的模板声明都可以被访问:只有声明了显式类型的参数才属于模板类型(包括所有带shared
注释的方法声明,以及大多数session
和saved
声明)。因此,在您的情况下,您的问题可能是signal_number
没有声明的类型。
如果你像这样添加一个参数类型:
template register_with_signal is register {
param signal_number : int;
// default assignment must be a separate declaration
param signal_number default -1;
...
}
那么你可以这样实现循环:
method handle_signal(int signal) {
foreach reg in (each register_with_signal in (this)) {
if (reg.signal_number == signal) {
// some statements here
return;
}
}
log unimpl: "signal %d is unimplemented", signal;
}
我也面临过这个问题。以下是我找到的解决方案:
foreach reg in (this._each_register) {
if (reg.offset == unmapped_offset) { // constant unmapped_offset = 0xffff_ffff_ffff_ffff;
<some actions for UNMAPPED regs>
}
}