DML中Sim_PE_Stall_Cpu内存事务异常的向上转发方案问询
如何转发Sim_PE_Stall_Cpu异常给寄存器操作调用方实现重试
核心问题
通过io_memory接口实现寄存器组读方法时,内存链路处理操作首次返回Sim_PE_Stall_Cpu异常,但无法将该stall异常向上传播给寄存器操作的调用方,导致调用方无法触发重试逻辑。
实现方案
设备2(异常源头设备)的实现
需要完成两个关键部分:
- 实现
before_read方法,让上游设备(设备1)能感知到自身的stall状态 - 在
read方法中捕获内存链路返回的Sim_PE_Stall_Cpu异常,并直接向上抛出该异常
代码示例:
device device2 { method before_read() { // 检查是否需要触发stall(比如内存链路繁忙状态) if (触发stall的条件) { throw SIM_PE_Stall_Cpu; } } method read() { exception ex; ex = $io_memory.operation(&mop, info); if (ex == SIM_PE_Stall_Cpu) { // 直接向上抛出异常,传递给调用方 throw ex; } // 正常处理读操作,返回读取结果 return 读取到的数据; } }
设备1(调用方设备)的实现
在read方法中调用设备2的读操作,捕获Sim_PE_Stall_Cpu异常后,同样向上抛出该异常,确保最终传递到寄存器操作的顶层调用方。
代码示例:
device device1 { device2 dev2; method read() { exception ex; try { return dev2.read(); } catch (ex) { if (ex == SIM_PE_Stall_Cpu) { // 转发stall异常给自身的调用方 throw ex; } // 处理其他类型异常 throw ex; } } }
关键说明
- DML语言中,异常可通过
throw关键字向上传播,只要调用链上的方法未捕获消化该异常,就会传递到顶层调用方 before_read方法中提前检查stall条件,能让上游设备更早感知stall状态,避免无效内存操作- 捕获
Sim_PE_Stall_Cpu异常后不能直接返回,必须通过throw重新抛出,才能触发调用方的重试逻辑
内容的提问来源于stack exchange,提问作者Juan Cruz
相关产品推荐
相关产品推荐

