DML 1.4中替代miss_bank实现set inquiry访问转发的方案咨询
DML 1.4 中实现未命中访问转发(含Inquiry操作)
DML 1.4依然支持将未命中的内存/Inquiry访问转发至其他bank的功能,你的问题根源在于默认io_memory_access方法对Inquiry操作的特殊处理逻辑:默认实现中,即使当前bank没有匹配的Inquiry处理逻辑,也会返回true,导致你无法进入转发分支。
解决思路
需要在重写的io_memory_access方法中,单独对Inquiry类型的操作做判断:先确认当前bank是否真的能处理该Inquiry偏移,若无法处理则强制转发至目标bank。
修改后的代码示例
method io_memory_access(generic_transaction_t *memop, uint64 offset, void *aux_p) -> (bool) { local bool success; // 单独处理Inquiry类型操作 if (memop->is_inquiry()) { // 先尝试默认处理 success = default(memop, offset, aux_p); // 关键:判断当前bank是否真的处理了该Inquiry(默认返回true但可能未实际处理) // 可替换为你自己的有效性检查逻辑,比如判断偏移是否在当前bank的Inquiry范围内 if (!this.is_valid_inquiry_offset(offset)) { log info,4:"Forwarding inquiry access to: %s", forward_bank.qname; success = forward_bank.io_memory_access(memop, offset, aux_p); } } else { // 普通读写操作保持原有转发逻辑 success = default(memop, offset, aux_p); if (!success) { log info,4:"Forwarding memory access to: %s", forward_bank.qname; success = forward_bank.io_memory_access(memop, offset, aux_p); } } return success; }
补充说明
is_valid_inquiry_offset是示例方法,你需要根据自己的bank逻辑实现:比如检查偏移是否落在当前bank已定义的Inquiry寄存器范围内,或者判断默认处理后是否真的完成了操作。- 若你的bank没有专门的Inquiry有效性判断逻辑,也可以直接跳过默认处理,先尝试转发,再回退到当前bank处理(根据你的业务需求调整顺序)。
内容的提问来源于stack exchange,提问作者JesusCoyotzi
相关产品推荐
相关产品推荐

