AXI 错误响应与总线超时:SLVERR/DECERR、挂死定位与看门狗恢复
更新时间:2026-09-19。本文处理总线「出错」和「没反应」两类故障。响应在 AXI4-Lite 从机 已露面,多笔在途下的错误传播与表项释放见 outstanding 与 ID 保序,互连结构见 AXI Crossbar。
本文要回答的问题
- OKAY/EXOKAY/SLVERR/DECERR 各代表什么,软件怎么处理?
- burst 中某一拍报错,其余拍还传不传?
- 如果从机/互连根本不回响应会怎样,为什么能挂死整条通路?
- 总线超时看门狗加在哪、检测什么、怎么安全恢复 outstanding?
一、四类响应(RRESP/BRESP,2 bit)
| 编码 | 响应 | 含义 | 典型来源 |
|---|---|---|---|
| 00 | OKAY | 正常访问;或独占访问失败(exclusive access fail)也用 OKAY 表示 | 正常从机 |
| 01 | EXOKAY | 独占访问成功(exclusive okay) | 支持 exclusive monitor 的从机 |
| 10 | SLVERR | 从机错误:地址合法但访问被拒/服务失败 | 从机内部 |
| 11 | DECERR | 解码错误:访问了没有任何从机的地址 | 互连/默认从机 |
- SLVERR 场景:写只读寄存器、FIFO 空读/满写、未初始化、ECC/总线错误、从机状态机异常、非法 burst(非对齐/跨 4KB,见 burst 边界)。
- DECERR 场景:地址译码未命中任何从机区间。互连必须挂一个**默认从机(default slave)**接住这些访问并回 DECERR,否则该笔事务无主可响应(见第三节挂死)。
- EXOKAY/OKAY 与独占:LDREX/STREX 类独占读成功时读响应 EXOKAY;若监控失败,独占写返回 OKAY(而非错误),软件据「不是 EXOKAY」判断需重试。AXI4 已取消 locked,独占是无锁同步的手段。
软件处理一般原则:DECERR 多是软件 bug(指针/地址映射错)或硬件未例化;SLVERR 是设备级故障,驱动应中止该事务、上报并可能复位设备,而不是无限重试。
二、burst 内错误的传播规则
一次多拍 burst 只有一个 RRESP/BRESP 通道按拍给出响应(读时 RRESP 跟每 beat)。协议要求:
- 一旦某个 beat 报错,后续 beat 仍需走完(从机仍要把该事务的 beat 数发完、维持 RID),错误响应可以只在出错拍及之后给出,或在最后一拍汇总;主机不能因为报错就提前撤销 outstanding 计数。
- 写事务的错误统一在 B 通道响应(写数据 W 通道本身不带错误)。
- 主机接收端必须逐拍检查 RRESP,而不能只看第一拍;只看首拍会漏掉 burst 中段的 SLVERR。
三、真正危险:从机不响应(无响应挂死)
RESP 只在「从机愿意完成事务」时才出现。AXI 协议没有内置超时:如果出现
- 地址没命中任何从机、又没有默认从机回 DECERR;
- 从机状态机死锁、时钟被关、跨时钟桥卡住;
- 下游反压永不解除(valid 举着、ready 恒 0);
那么主机的这笔事务会永久在途:AW/AR 已被接受,但 B/R 永远不回来。连锁后果:
- 主机的 outstanding 表项被占住不释放,深度有限时几次之后再也发不出新事务(见 outstanding 表项泄漏);
- CPU 发起的该次 load/store 卡住,若在内核/取指通路,可能吊死整个核;
- DMA 停摆、描述符环不再推进(见 DMA 描述符环)。
这是 AXI 系统最典型的「总线挂死(bus hang)」,且仿真不一定复现,多在低功耗关时钟、复位不完整、跨域异常时出现。
四、AXI 超时看门狗(Interconnect Timeout)
业界标准做法是在互连/桥的每笔事务上加可配置超时:
- 监测点:一笔 AW/AR 被接受(地址握手完成)即启动/挂到该事务的计时器;正常在 B/RLAST 返回时清除。
- 超时判定:若在设定拍数(按最坏合法延迟,如 DDR 刷新 + 仲裁 + 桥,预留余量)内未完成,则判超时。
- 合成错误响应:超时逻辑以默认从机/错误响应器身份,替失联从机补一个 SLVERR(或专用 DECERR)响应给主机,对读要按原 ID、原 beat 数补齐 R beat + RLAST,对写补 BRESP,让主机的这笔事务正常走完协议、释放 outstanding。
- 记录与中断:置错误状态寄存器(超时地址、ID、读写、端口),拉中断/告警给系统管理(RAS),必要时联动电源/复位控制器对故障从机做局部复位。
- 未命中地址:decoder 直连默认从机,立即/按延迟回 DECERR,不必等超时。
AW/AR 握手 ──▶ 启动 per-transaction timer
│
正常 B/RLAST ─┴─▶ 清 timer
timer 到期 ─────▶ 错误响应器补发 RESP(+补齐beat/RLAST)
├─ 释放主机 outstanding
├─ 锁存 {addr,id,rw,port} + 中断
└─ 触发故障从机隔离/复位流程超时只解决「让总线活下来、事务有定论」,不保证失联从机内部数据正确——补完响应后通常要复位/重新初始化该从机,并避免继续向其发事务。
五、RTL/系统侧防御清单
- 必挂默认从机:任何未解码访问回 DECERR,杜绝无主事务。
- 每端口超时使能与阈值可配:低速外设阈值可大,高性能口小一些;超时不要误杀合法长延迟(如低功耗退出、大 burst)。
- 错误响应器保证 ID/长度匹配:补发的 RID/BID 必须等于原请求,beat 数与 AxLEN 一致并正确拉 RLAST,否则主机记分板对不上、照样泄漏。
- 表项所有退出路径都释放:正常完成、SLVERR、DECERR、超时、局部复位都要归还 outstanding/slot,见 outstanding 死锁与表项泄漏。
- 低功耗/时钟门控联动:关从机时钟前确保无在途事务,或桥/超时器在从机时钟恢复前代答,避免「时钟关了 valid 还举着」。
- 跨时钟桥要有自己的下溢/卡死检测:异步 FIFO 不应成为永久反压点,见 异步 FIFO CDC。
- 软件侧:驱动对 DECERR/SLVERR 不无限重试;内核总线驱动可带访问超时(watchdog)而不是永久挂起;把超时中断计入 RAS/故障日志。
六、常见的坑
- 没挂默认从机:空地址访问直接挂死,且没有任何错误标志;这是最常见总线 hang 根因。
- 超时只发一拍 RESP:读 burst 没补齐 beat/RLAST,主机仍在等剩余拍,没真正解锁。
- 补发 ID 不匹配:用固定 ID 0 回答多 ID 主机,记分板错乱。
- 只检测地址通道:地址已收、数据/响应通道卡死(如 W 通道反压永不解)也要能超时,监测应覆盖事务全生命周期。
- 超时阈值定太小:把合法的 DDR 刷新/仲裁/唤醒延迟误判成故障;按最坏情况留裕量。
- 超时后继续信任故障从机:总线虽解锁,但从机内部状态可能已坏,应隔离复位再恢复。
- 复位不释放表项:局部复位从机时,互连侧对应 outstanding 未清,恢复后仍挂死;复位流程要联动清表。
- 主机只看首拍 RRESP:漏掉 burst 中段错误。
相关与延伸
协议与响应基础见 AXI4-Lite 从机、AXI4 完整协议;在途表项见 outstanding 与 ID 保序;默认从机/解码见 AXI Crossbar;burst 约束见 burst 类型与边界;跨域卡死见 异步 FIFO CDC;DMA 故障见 DMA 描述符环。
总结
AXI 用 RRESP/BRESP 区分 OKAY/EXOKAY/SLVERR/DECERR,burst 出错也要按 ID 把所有 beat 和 RLAST 走完;但协议没有超时,未命中地址或从机死锁会让事务永久在途、占满 outstanding 挂死总线——防御靠默认从机回 DECERR 加每笔事务的超时看门狗:到期后错误响应器按原 ID/长度补齐响应释放表项、记录地址并中断、再隔离复位故障从机。