Wishbone B4 反馈时序:ACK/ERR/RTY 与 registered feedback 注册反馈
更新时间:2026-09-25。本篇是「集成电路大类 · 芯片设计 · 片上总线」序列里对 Wishbone B4 的时序深文。总线全貌建议先读 Wishbone 总线 B4:Classic 与 Pipelined 周期,握手思想对照 valid/ready 握手规则,两拍流水的 AHB 侧版本见 AHB-Lite 流水线与 HRESP。本篇只盯住一件事:master 把 CYC/STB 拉高之后,slave 的反馈信号在时钟上到底应该怎么回。
本文要回答的问题
- classic 经典周期里 CYC/STB/WE/SEL/ADR/DAT 各在哪一拍有效,谁必须保持、谁可以变?
- ACK/ERR/RTY 三种反馈语义上差在哪,能不能同时拉高?
- 组合反馈和 registered feedback(注册反馈)时序上差几拍,为什么规范建议后者?
- 一个带注册反馈的 slave 状态机该有哪些状态,ACK 脉冲在哪一拍发出?
- registered classic 和 pipelined 模式都会「晚回 ACK」,本质区别是什么?
一、先把 classic 周期的信号摆齐
Wishbone B4 是同步点对点接口,所有动作都发生在 CLK 的上升沿。先把 classic 单周期(classic single cycle)涉及的信号按「请求侧」和「反馈侧」分两组。
请求侧全部由 master 驱动:CYC 圈定整个总线周期,一次事务(乃至一段连续突发)期间保持高,仲裁器据此判定总线被谁占用;STB 是选通,只有它为高的那拍地址和控制才有效,语义最接近 valid;ADR 给地址,宽度和粒度(granule,通常按字节或按字)由实现自定;WE 区分读写,1 为写、0 为读;SEL 是字节 lane 选择,32 位总线上典型为 4 bit;DAT_O 放写数据(master 视角)。反馈侧由 slave 驱动:DAT_I 返回读数据,ACK/ERR/RTY 三选一给出本笔传输的结局。
classic 周期最核心的一条约束是「请求与反馈强绑定」:从 STB 拉高的那拍到 ACK/ERR/RTY 中任一个返回的那拍,ADR、WE、SEL、DAT_O 必须全部保持不变;反馈返回后,master 要么撤掉 STB 结束,要么在同一拍换上下一笔的地址和数据继续。这与 valid/ready 中「valid 拉高后数据必须稳定直到 handshake 发生」是同一条纪律,时序细节可对照 valid/ready 握手规则。
二、组合反馈:0 等待态单周期
最快的情况是 slave 的反馈完全由组合逻辑产生:master 在沿 T1 拉高 CYC/STB、放上地址,slave 的译码和读通路在同一拍内组合算出结果,当拍就把 ACK 和 DAT_I 驱动出来;master 在沿 T2 采样 ACK、锁存读数据,随后撤 STB。零等待态下一笔读只占一个时钟周期。

注意图中 STB 和 ACK 在 T1 这一段同时为高:ACK 是 slave 看到 STB 后未经寄存器直接组合输出的。这条路径在真实设计里有两个麻烦。其一,形成组合环路:master 的 STB 往往又取决于它有没有看到 ACK(看到就撤),于是 STB→译码→ACK→STB 构成环,综合工具报 combinational loop,时序无法收敛。其二,ACK 路径串着地址译码和存储读出,频率一高就成为关键路径。因此组合反馈只在极简单的 slave(比如一小片寄存器文件)里使用,绝大多数 IP 选择下一节的注册反馈。
三、registered feedback:反馈至少隔一拍
registered feedback(注册反馈)指 slave 先在时钟沿采样 master 的请求、打一拍寄存器,再从寄存器输出 ACK 和数据。它带来一条写 RTL 必须记住的时序规则:slave 不可以在采样到 STB 的同一个周期里回 ACK,反馈最早出现在下一个上升沿之后,也就是一笔传输最少带一个等待态。

对照图读:沿 T1 master 发出 A0,slave 在该沿采样到 STB;T2 期间 slave 内部取数,ACK 仍为 0,master 按 classic 纪律把 STB/ADR 原样保持;到 T3,注册过的 ACK 和 D0 一起出现在总线上,master 在沿 T4 采样并结束。如果 slave 需要更长处理时间(比如等外部存储器),就继续保持 ACK 为低若干拍,T2 那样的等待段可以任意延长——这就是「插入等待态」,对 master 完全透明,它只负责保持。
注册反馈解决了组合反馈的两个毛病:ACK 来自寄存器输出,不存在 STB 到 ACK 的组合环路,且输出路径只有寄存器到芯片管脚级的短延迟,频率好收敛。代价是每笔固定多花至少一拍。这种「用一级寄存器打断组合路径」的手法与 AXI 里的 register slice 同构,可对照 AXI register slice 时序阅读。
还有一个 master 侧的细节值得写进验证计划:master 无法区分自己面对的是组合反馈还是注册反馈,它的合法实现只有「STB 保持、采样 ACK」这一种;那种假设 slave 必在 T2 回 ACK、T3 就提前撤 STB 的 master,遇到 0 等待 slave 会丢传输。SVA 里可以写死「ACK 为高的拍,其前一拍或当拍必存在 STB 与稳定的 ADR」,断言写法见 SVA 断言实践。
四、ACK/ERR/RTY:三种反馈,互斥收尾
slave 对一笔 classic 传输只能给三种结局,且同一拍最多只能有一个为高:
| 反馈 | 语义 | master 的典型反应 |
|---|---|---|
| ACK | 正常完成:读数据有效或写已落盘 | 结束本笔,推进下一笔 |
| ERR | 永久性失败:地址非法、访问被拒、总线错误 | 上报故障,不应原样重试 |
| RTY | 暂时无法服务:slave 忙、资源暂不可用 | 稍后重新发起同一请求 |
ERR 和 RTY 的分界是「值不值得重试」:访问一个不存在的地址、写只读寄存器,这类重试一万次也是错,回 ERR;仲裁输掉、内部管线暂时被占,下一拍可能就空了,回 RTY。这与 AXI 的 DECERR/SLVERR 划分思路一致,可对照 AXI RRESP/BRESP 解码。

图中三笔传输背靠背:master 在每个反馈脉冲后的下一拍直接换地址、STB 全程不撤,CYC 也可以一直保持高——这是 classic 周期合法的连续做法,省掉了重新仲裁。注意 ERR/RTY 返回时同样意味着「本笔到此为止」,slave 必须保证在反馈拍之前没有产生部分副作用(尤其写不能写半个字),这与 AHB5 错误响应的收尾纪律如出一辙,可对照 AHB5 传输协议。
工程上还有两条必查项。其一,地址译码必须兜底:未命中任何 slave 的 STB 要交给 default slave 回 ERR,否则 STB 高挂却永远等不到反馈,总线死锁。其二,RTY 不能被 master 无限重发:软件或 RTL 里要设重试上限,超限升级按 ERR 处理,否则 slave 一个持续忙状态就能把系统拖进活锁。
五、写周期与 SEL 字节选择
写周期的时序骨架与读完全相同,区别只在 WE=1、DAT_O 必须从 STB 拉高起保持到反馈拍,另外由 SEL 决定哪些字节 lane 真正写入。32 位总线、SEL 为 4 bit:写一个字时 SEL=1111;写最低字节(地址 0x0 或 0x4 的低位)时 SEL=0001;写半字时 SEL=0011 或 1100。语义等价于 AXI 的 WSTRB,典型模式见 AXI WSTRB 字节使能模式。

图中 SEL=0010 表示只写第二字节,slave 在 ACK 返回的 T3 这一拍才真正提交写操作。把「提交点」放在反馈拍有两个好处:等待态期间 master 随时可能因 ERR/RTY 终止,提前写入会产生无法撤回的副作用;RTY 时 slave 根本没动过存储,master 原样重发即可。新手常犯的错是 SEL 与地址脱节——地址按字给、SEL 却忘了随窄传输拉成对应模式,结果单字节写污染了相邻三个字节,这类故障在字节流数据里极难定位。
六、slave 状态机怎么落地
把上面的时序收束成一个可综合的注册反馈 slave,状态机只需要四个状态。
落地时有几个细节决定状态机是否「协议合规」。第一,只在 S_IDLE/S_RESP 的出口采样 STB:S_WAIT 期间总线被当前这笔占住,重复采样会把同一请求当两笔。第二,反馈信号必须由寄存器在 S_RESP 统一发出、只维持一拍,ACK/ERR/RTY 共用同一段输出逻辑、按执行结果三选一,从结构上杜绝两个同时为高。第三,进入 S_RESP 后若发现 STB 仍高且地址已换,下一拍直接进 S_SAMPLE 接收新请求,这就实现了第四节图中的背靠背连续传输。第四,复位后默认进 S_IDLE 且反馈全 0,绝不能复位出 ACK 毛刺。更一般的状态机健壮性写法(默认状态、非法态恢复)见 健壮 FSM 与故障恢复。
七、registered classic 与 pipelined 模式对照
registered classic 和 pipelined 模式都会出现「STB 先发、ACK 隔几拍才到」,但二者的本质不同在于在途笔数,这也是选型时最容易混淆的地方。
| 维度 | registered classic | pipelined |
|---|---|---|
| STB 与 ACK 的关系 | 强绑定:ACK 不回,地址不准换 | 解耦:地址可连续先发 |
| 同一时刻在途笔数 | 恰好 1 笔 | 可多笔(outstanding) |
| 反压信号 | 不需要,靠「不回 ACK」 | 需要 STALL,slave 喊停新地址 |
| ACK 晚到的含义 | 当前这一笔还没做完 | 在给更早的某一笔收尾 |
| 稳态吞吐 | ≤ 1 笔/(等待拍+1) | 可跑满 1 笔/拍 |
| slave 复杂度 | 四状态 FSM 即可 | 要维护在途队列与保序 |
| 典型场景 | 外设寄存器、慢速存储 | SRAM 控制器、高速 DMA |
读这张表的诀窍:classic 里 ACK 晚回,master 是「站在原地等」;pipelined 里 ACK 晚回,master 是「继续往前走、回头收数」。STALL 与 ACK 的分工、CTI/BTE 突发扩展在 Wishbone 总线 B4:Classic 与 Pipelined 周期里有完整展开。跨时钟域使用 Wishbone 时,无论是哪种模式都不能直接对接,要插异步 FIFO,见 异步 FIFO 与 CDC。
这一篇在知识体系里的位置
总线全景与开源/商用取舍见 AMBA 总线选型;Wishbone 的 pipelined、STALL 与突发扩展读 Wishbone Classic 与 Pipelined;两拍流水的 AHB 侧机制对照 AHB-Lite 流水线与 HRESP 和 AHB5 传输协议;验证这些时序性质的 SVA 写法见 SVA 断言实践。
总结
Wishbone B4 classic 周期由 master 拉高 CYC/STB 并保持 ADR/WE/SEL/DAT,slave 以 ACK/ERR/RTY 三选一互斥反馈收尾:组合反馈能 0 等待但构成环路、只适合极简 slave;registered feedback 先采样注册再输出,反馈最早隔一拍、等待态可任意延长,是工程主流。写 slave 用「IDLE→SAMPLE→WAIT→RESP」四状态机,写提交点和反馈都放在 RESP 拍;它与 pipelined 的分界不是 ACK 晚回几拍,而是在途笔数——classic 始终只有一笔、站着等,pipelined 多笔在途、靠 STALL 反压跑满吞吐。