Wishbone 总线 B4:Classic 与 Pipelined 周期、STALL/RTY/ERR 握手
更新时间:2026-09-19。本篇对照 AMBA 选型 中开源总线一支,讲清 Wishbone 的时序模型,便于在 FPGA/开源项目里读用 Wishbone IP。它是点对点同步接口,靠互连拼成多主多从。
本文要回答的问题
- Wishbone 的 STB/CYC/ACK/STALL 各是什么,一次传输怎么握手?
- Classic 周期和 Pipelined 周期差在哪?
- SEL、ERR、RTY 怎么用,字节写和错误怎么表达?
- 它和 AXI-Lite/AHB 的复杂度、适用场景有何不同?
一、接口信号
Wishbone 主从之间一组线(命名以 _o 主出、_i 主入):
| 信号 | 方向(主) | 含义 |
|---|---|---|
| CLK / RST | 入 | 同步时钟/复位 |
| ADR | 出 | 地址(常以字/granule 为单位) |
| DAT_W / DAT_R | 出/入 | 写数据 / 读数据(分开两组) |
| WE | 出 | 写使能(1 写 0 读) |
| SEL | 出 | 字节选择(字节使能) |
| STB | 出 | 选通:本拍请求有效(类 valid/片选) |
| CYC | 出 | 总线周期有效(一次事务/突发期间一直高) |
| ACK | 入 | 从机确认:本拍完成一次传输 |
| STALL | 入 | 流水线模式下从机请主机保持/暂停发新请求 |
| ERR | 入 | 错误终止 |
| RTY | 入 | 重试(从机忙,请重发) |
| CAB/BTE/CTI | 出 | 突发类型指示(B4 burst 扩展) |
与 valid/ready 的近似对应:STB≈valid、ACK≈当拍完成,CYC 圈定整个总线周期(仲裁据此占用总线)。
二、Classic 单周期与等待态
最简单的传输:主机拉高 CYC、STB,给地址/WE/数据;从机准备好就回 ACK。
T1 T2 T3
STB/CYC ■─────────────■─────────────■
ACK ─────────────■ (T2 完成第一笔)
└─ 从机若没准备好,ACK 延后,地址/STB 保持 = 等待态 ─┘- ACK 在 STB 有效期间可当拍回(0 等待,单周期完成),也可延后 N 拍(插入等待态),期间 STB/ADR/WE/DAT_W 保持不变。
- 一次读:从机在回 ACK 那拍把数据放到 DAT_R,主机采样;写:主机在 STB 周期保持 DAT_W,从机在 ACK 拍写入。
三、Pipelined 周期与 STALL
Classic 要求「请求和确认强绑定」,吞吐受确认延迟限制。B4 的 Pipelined 模式允许地址先发、ACK 后到,多笔在途:
- 主机连续若干拍拉高 STB 发地址流;
- 从机用 STALL=1 表示「我跟不上,地址保持别前进」(类似反压),STALL=0 时接收新请求;
- ACK 在后面若干拍按(实现可保序)返回读数据,形成地址/数据错拍流水,吞吐可到 1 笔/拍。
这与 AHB 流水线、AXI outstanding 的思想一致,只是信号更少、顺序约束由实现决定(规范本身不强制乱序 ID 机制,多数实现保序)。
四、字节选择与响应
- SEL:按字节 lane 选择,类似 AXI 的 WSTRB;32 位总线 SEL[3:0],写字节/半字时只置相应位。非对齐访问由从机/桥处理,规范不强制。
- ERR:地址非法或访问被拒,事务立即失败(类 AXI DECERR/SLVERR、AHB ERROR)。
- RTY:从机暂时无法服务(忙),主机应稍后重试;与 ERR 的区别是「可恢复、非错误」。
- B4 burst:用 CTI(周期类型标识:经典/常量地址/递增/结束)+ BTE(burst 类型)描述线性/回绕突发,复杂度远低于 AXI AxBURST。
五、互连与生态
Wishbone 定义的是点对点接口,系统靠互连元件拼:
- 简单共享总线 + 仲裁器(SYSCON 提供时钟);
- Crossbar(conmax/wb_intercon 等开源互连)做多主多从;
- 地址 decoder 产片选,未命中挂默认从机回 ERR(否则 STB 高却无 ACK 会挂死,和 AHB 默认从机同理)。
典型生态:OpenCores 大量外设(UART/SPI/100M Eth/SRAM 控制器)、LatticeSemi/一些 FPGA 参考设计、教学 SoC。商用 IP 与 RISC-V 主流(Rocket/Chipyard)多用 AMBA / TileLink,混用要加桥。
六、Wishbone vs AXI-Lite / AHB
| Wishbone B4 | AXI4-Lite | AHB-Lite | |
|---|---|---|---|
| 读写数据线 | DAT_W/DAT_R 分开 | 共用 WDATA/RDATA,通道分离 | 共用 |
| 握手 | STB/ACK(+STALL) | 五通道 valid/ready | HREADY/HTRANS |
| 流水线/多笔 | Pipelined 可在途 | 原生 outstanding(Lite 单数据) | 地址/数据错拍 |
| 一致性/burst | 弱(burst 扩展简单) | ACE-Lite 可一致;full 才有强 burst | 无一致 |
| 规范/生态 | 开放宽松、开源 IP 多 | ARM 生态、商用 IP | ARM MCU 生态 |
| 面积/学习成本 | 低 | 中 | 小 |
七、常见的坑
- STB 高却没人拉 ACK:地址解码漏区间、从机死锁,整总线停摆——务必挂回 ERR 的默认从机。
- Classic 里提前撤 STB:ACK 未回就撤请求,从机可能已动作;等待态必须保持 STB/ADR/数据。
- STALL 与 ACK 语义混淆:STALL 管「暂停发新地址」,ACK 管「某笔完成」,流水线里要分别跟踪在途笔数。
- SEL 全 1 写字节:窄写没拉对应 SEL,污染相邻字节。
- 跨时钟直连:Wishbone 是同步总线,跨时钟域要加异步 FIFO/桥,见 异步 FIFO CDC。
相关与延伸
选型见 AMBA 总线选型;开源对照见 TileLink 与 AXI;时序思想对照见 AHB-Lite、valid/ready 握手。
总结
Wishbone B4 用 CYC 圈周期、STB 发请求、ACK 完成、STALL 反压:Classic 模式 STB/ACK 强绑定可插等待态,Pipelined 模式地址先发 ACK 后到、多笔在途跑满吞吐,SEL 做字节选、ERR/RTY 分错误与重试;它开放极简、开源 IP 丰富,最适合 FPGA 与教学,复杂一致/高性能场景再换 AXI/TileLink。