You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:04:58