AXI 的 outstanding、ID 和乱序是怎么回事?
更新时间:2026-09-21。问题驱动短答页。机制细节见 AXI outstanding 与 ID 排序,总线基础见 AXI/AHB/APB 区别。
一句话回答
outstanding 指主设备不必等上一笔读/写的响应回来就可以连续发出多笔事务,让总线和从设备流水起来、用并发换带宽;AXI 给每笔事务打上 ID,规则是“不同 ID 的响应允许乱序返回,同一个 ID 的响应必须按发出顺序返回”。ID 让多个逻辑流(线程/端口)能复用同一接口而各自保序。设计互连和主从设备时必须按 ID 缓存和重排响应,若错误地假设所有响应严格按全局顺序、或 ID 位宽/跟踪表不够,就会数据错配或挂死。
三个概念
- outstanding(未完成事务深度):已发出未收齐响应的笔数;越大越能掩盖延迟,但要更多缓冲和更多存储读数据的空间。
- ID:每笔地址(ARID/AWID)和响应(RID/BID)、读数据(RID)携带的标识。AXI3 写数据还有 WID,AXI4 去掉 WID、要求同 ID 的写数据按 AW 顺序跟。
- 顺序规则:同 ID 保序(interconnect 不能把同 ID 的响应重排),不同 ID 可乱序;从设备还可通过相关信号声明自己是否支持乱序。
为什么能提速
单发射时一笔读的延迟(往返 + 从设备访问)期间总线空闲;多笔 outstanding 时,主设备连续填地址,从设备/互连并行处理,DDR 这类高延迟从设备收益尤其大。
设计注意
- 响应要按 ID 回填:维护“在途 ID/地址”表,把回来的 RID/BID 对应到正确的发起者或缓冲槽。
- 别做全局顺序假设:假设响应一定按地址发出顺序返回是常见 bug;只能依赖同 ID 保序。
- ID 位宽与在途深度匹配:多主设备经互连时 ID 还会被加上路由前缀(窄到宽扩展),主设备看到的 ID 位要预留。
- 死锁:缓冲只够 N 笔 outstanding 却放了更多、或依赖乱序响应才能腾位,可能挂死。
常见坑
- 发了多笔却只有一个响应缓冲,后面的覆盖前面的。
- 忽略 RID,按时间顺序把读数据错配给请求。
- AXI3/AXI4 的 WID 规则混用。
- 互连汇聚多个主设备时没扩展 ID 位宽,造成不同主设备同 ID 冲突。
总结
AXI 用 outstanding 允许主设备连发多笔事务以并发掩盖延迟、提升带宽,并用 ID 标识每笔事务,规定同一 ID 的响应必须按序、不同 ID 可以乱序;因此主设备和互连都要按 ID 建在途表、把响应正确回填,既不能假设全局严格顺序,也要让缓冲深度和 ID 位宽(含互连的路由扩展)与在途事务数匹配,否则会数据错配或挂死。