AXI4 RESP 响应码:RRESP/BRESP 两 bit 四种编码的精确语义、产生者与主机处置策略
更新时间:2026-09-25。本文是「集成电路大类 · 芯片设计」接口主题簇里的一篇长尾文。AXI4 完整协议 给出五通道握手,而一笔事务最终「成没成、为什么没成」全部压缩在返回通道的两 bit 里。这两 bit 的编码本身不复杂,真正容易出错的是三个细节:谁有资格产生哪种响应、独占访问失败为什么不算错误、主机收到错误后该不该重试。
本文要回答的问题
RRESP[1:0]/BRESP[1:0]四种编码的精确语义是什么,高位低位分别怎么解释?- OKAY/EXOKAY/SLVERR/DECERR 各自由 slave 还是 interconnect 产生?
- 一次多拍 burst 中途出错,响应怎么给、主机怎么收?
- 主机对四类响应分别该重试、上报还是记日志?AXI3 与 AXI4 在响应上有什么差异?
一、两 bit 四种编码:先看高位,再看低位
读数据通道的 RRESP[1:0] 逐 beat 给出,写响应通道的 BRESP[1:0] 每笔写事务给出一个,编码完全相同。最高位 RESP[1] 是「有错」标志:置 1 即为错误类响应;RESP[0] 则在正常类里区分普通访问与独占访问成功。
编码 [1:0] | 响应 | 类别 | 精确语义 |
|---|---|---|---|
2'b00 | OKAY | 正常 | 普通访问成功;独占访问失败也返回 OKAY,不是错误 |
2'b01 | EXOKAY | 正常 | 独占访问成功(exclusive okay),从机的 exclusive monitor 确认了地址匹配 |
2'b10 | SLVERR | 错误 | 从机错误:事务已到达从机、地址也合法,但从机无法或拒绝服务 |
2'b11 | DECERR | 错误 | 解码错误:事务没有到达任何已实现的从机 |
SLVERR 的典型场景是写只读寄存器、FIFO 空读或满写、非法 burst 参数、从机内部 ECC 错误或状态机异常——事务本身合法,是从机这一侧出了问题。DECERR 则与从机无关:地址落在译码表里没有任何区间认领的空洞上。注意一个反直觉点:独占写(exclusive write)失败时返回的是 OKAY 而非错误,软件靠「不是 EXOKAY」来判断需要重新执行 LDREX/STREX 序列,详见 AXI4 独占与原子访问。
二、响应由谁产生:从机、互连与默认从机
RESP 的产生者身份比编码本身更值得厘清,因为它直接决定错误的归因方向。
三条产生路径分别对应:
- 目标从机产生 OKAY、EXOKAY(需内置 exclusive monitor)和 SLVERR。
- **互连或默认从机(default slave)**产生 DECERR。规约要求互连必须挂一个默认从机,专门接住未被任何地址区间认领的事务并回 DECERR;否则该笔事务无主可响应,主机将永久等待——挂死与看门狗恢复的完整讨论见 AXI 错误响应与总线超时。
- 系统级的超时错误响应器在从机失联时代为补一个 SLVERR,让事务走完协议、释放 outstanding 表项。
通道位置也要记牢:读响应只在 R 通道、随每个 beat 给出;写事务的错误统一在 B 通道返回,W 通道本身不带任何错误指示。所以主机侧逐 beat 检查 RRESP、写侧检查 BRESP,二者缺一不可。
三、burst 内的响应:逐拍有效,出错也要走完
R 通道的响应是逐 beat 的,不存在「整笔 burst 一个响应」的说法。规约对 burst 内错误的规则可以归纳为:
- 某个 beat 一旦报错,后续 beat 仍必须全部发完并维持同一 RID、正确给出 RLAST;错误可以只在出错拍及之后出现,也可以在末拍汇总。
- 主机不能因为中途收到 SLVERR 就提前撤销这笔事务、停止接收,否则 outstanding 与 ID 保序 的记分板立刻错乱。
- 主机必须逐拍检查 RRESP,只看第一拍是经典漏错方式——中段 beat 的 SLVERR 会被静默吞掉。
- 写 burst 只有一个 BRESP,它代表整笔写的最终结论。
四、主机处置策略:四种响应四套动作
「收到错误后重试」是最常见的错误直觉,需要按响应类型纠正:
| 响应 | 硬件/主机动作 | 软件处置 | 是否重试 | 日志内容 |
|---|---|---|---|---|
| OKAY | 正常消费数据、释放表项 | 普通完成 | — | 一般不记 |
| EXOKAY | 独占成功,放行临界区 | 独占写成功,继续 | — | 一般不记 |
| OKAY(独占失败) | 正常完成但标记未获得锁 | 判定冲突,重做 load/store 独占序列 | 有限次重试,次数超限则上报 | 可统计冲突计数 |
| SLVERR | 收齐 beat、释放表项,可中断上报 | 中止事务、驱动报错,必要时复位设备 | 默认不重试;幂等读可谨慎重试一次 | 地址、ID、读写、beat 位置、时间戳 |
| DECERR | 释放表项,上报总线错误/fault | 多为指针或地址映射 bug,终止访问 | 不重试 | 错误地址、发起端口、ID |
判据很清楚:DECERR 重试一百次结果也不会变——地址空洞不会因为重试长出从机,它通常指向软件 bug(野指针、地址映射错)或硬件未例化;SLVERR 是设备级故障,盲目重试可能持续写入一台状态已坏的设备,正确动作是上报、隔离、复位后再恢复;唯一需要重试的是独占失败返回的 OKAY,且必须是有界重试,防止某个核长期占锁导致其他核饿死。无论哪类错误,日志至少锁存地址、事务 ID、读写方向和出错 beat,这些信息是事后归因到具体从机的依据。
五、AXI3 与 AXI4 的响应差异
两 bit 四种编码从 AXI3(IHI 0022 早期版本)起就没有变过,AXI4 完全沿用,差异在编码之外:
| 对比项 | AXI3 | AXI4 |
|---|---|---|
| RESP 编码 | OKAY/EXOKAY/SLVERR/DECERR,2 bit | 完全相同 |
| locked 传输 | 支持 AxLOCK 指示 locked,配合 EXOKAY 语义 | 取消 locked,只保留 exclusive 独占访问 |
| DECERR 产生时机 | 一般由被寻址路径上的默认从机返回 | 允许互连提前返回 DECERR:写事务可在收齐全部 W beat 之前给出,但互连必须继续收完并丢弃剩余 beat |
| 写数据交织 | 允许不同 ID 的 W beat 交织,BRESP 按 BID 匹配 | 取消写交织,BRESP 与 AW 的对应更简单 |
| AXI4-Lite 子集 | — | 不支持独占,只允许 OKAY/SLVERR/DECERR,EXOKAY 不出现,见 AXI4-Lite 从机 |
工程含义有两点:一是 AXI3 到 AXI4 的桥不需要改动 RESP 译码逻辑本身,但必须妥善处理 locked 序列的退化与重映射;二是设计主机接收逻辑时要接受「DECERR 比最后一笔写数据更早到」这种在 AXI4 下完全合法的情形,不能假设 BRESP 一定在 WLAST 之后,同时剩余 W beat 仍要照常发出并被对端丢弃。
六、常见的坑
- 把独占失败当错误:看到 OKAY 就认为 STREX 成功,临界区实际未获得锁,软件出现竞态。
- 只看首拍 RRESP:burst 中段的 SLVERR 被漏掉,主机把坏数据当好数据消费。
- 中途停收 beat:收到错误后不再接收剩余 beat,RID 序列和 RLAST 对不上,表项泄漏。
- 对 DECERR/SLVERR 无限重试:故障不会自愈,反而刷屏日志、持续访问坏设备。
- 假设 BRESP 必在 WLAST 之后:AXI4 互连提前回 DECERR 时主机状态机挂住。
- 默认从机返回值接错:把未命中访问接成 OKAY,软件完全感知不到地址 bug。
- SLVERR 与 DECERR 混报:归因方向相反——前者查从机,后者查地址译码和软件,混报会让排查走弯路。
这一篇在知识体系里的位置
五通道握手与信号基础见 AXI4 完整协议,EXOKAY 的独占语义见 AXI4 独占与原子访问,DECERR 的产生位置见 AXI Crossbar 与 Interconnect,无响应挂死、超时补响应见 AXI 错误响应与总线超时,burst 边界与非法参数见 AXI4 burst 类型与边界。
总结
AXI4 RESP 响应码是 RRESP/BRESP 上两 bit 的四种编码:高位为 0 时 00=OKAY(含独占失败)、01=EXOKAY(独占成功),高位为 1 时 10=SLVERR(从机故障)、11=DECERR(地址未命中,由互连或默认从机产生);burst 内响应逐 beat 有效、出错也必须按 ID 走完所有 beat 和 RLAST;主机侧只对独占失败做有限重试,SLVERR 应中止上报并隔离设备、DECERR 终止访问且不重试,并锁存地址、ID、读写和 beat 位置备查;AXI3 与 AXI4 的编码完全一致,差异在于 AXI4 取消 locked、允许互连提前回 DECERR、取消写交织,而 AXI4-Lite 中不会出现 EXOKAY。