3、常见总线协议概览:APB、AHB、AXI、Wishbone、OCP 的基本特征对比
做网表逆向这么多年,我见过最多的就是这五种总线。说实话,它们就像芯片界的「方言」—— 虽然都在说「数据搬运」这件事,但语法和习惯完全不同。今天我就带你逐个过一遍,顺便聊聊我在逆向中遇到的坑。
3.1 APB:最省资源的「慢速通道」
APB(Advanced Peripheral Bus)是 ARM 公司推出的低速总线。我个人习惯把它叫做「小推车」—— 运力不大,但胜在简单可靠。
核心特征:
- 只有 1 个主设备(通常是总线桥)
- 状态机只有 3 个状态:IDLE、SETUP、ACCESS
- 所有传输需要 2 个时钟周期
- 无流水线,无突发传输
逆向识别技巧: 在网表中找 PADDR、PWDATA、PRDATA、PENABLE、PSEL 这五个信号。如果看到 PSEL 和 PENABLE 交替拉高,基本就是 APB 没跑了。
💡 我在项目中遇到过:某次逆向一个低功耗 IoT 芯片,发现所有外设寄存器都挂在 APB 上。当时我还在想「怎么这么慢」,后来才意识到——人家根本不需要快,省电才是王道。
3.2 AHB:高性能的「单车道高速路」
AHB(Advanced High-performance Bus)是 ARM 的中间方案。你想想看,APB 太慢,AXI 又太复杂,AHB 正好卡在中间。我经常跟新人说:如果你不确定用啥,先试试 AHB。
核心特征:
- 支持多个主设备(通过仲裁器)
- 流水线传输:地址阶段和数据阶段重叠
- 支持突发传输(4、8、16 拍)
- 单周期数据传输(无等待时)
| 信号 | 方向 | 说明 |
|---|---|---|
| HADDR | 主→从 | 地址总线 |
| HWDATA | 主→从 | 写数据总线 |
| HRDATA | 从→主 | 读数据总线 |
| HTRANS | 主→从 | 传输类型(IDLE/BUSY/NONSEQ/SEQ) |
| HREADY | 从→主 | 从设备就绪信号 |
⚠️ 我曾经在逆向一个 AHB 总线矩阵时,被 HREADY 信号坑惨了。当时以为 HREADY 拉低就是传输结束,结果发现它只是「暂停」—— 数据还在总线上悬着。嗯,这里要注意:HREADY 低电平时,地址和数据必须保持稳定。
3.3 AXI:复杂但强大的「多车道立交桥」
AXI(Advanced eXtensible Interface)是 ARM 的旗舰总线。说白了,它就是为高性能 SoC 量身定做的。为什么?因为它有 5 个独立的通道,可以同时读写。
核心特征:
- 5 个独立通道:读地址、读数据、写地址、写数据、写响应
- 支持乱序传输(通过 ID 标签)
- 支持非对齐传输
- 支持独占访问(Exclusive Access)
- 支持原子操作
逆向识别技巧: 在网表中找 AWADDR、ARADDR、WDATA、RDATA、BVALID 这些信号。如果看到 AWVALID 和 AWREADY 的握手逻辑,基本就是 AXI。
我记得有一次逆向一个 AI 加速芯片,发现它的内存控制器用的是 AXI4。当时我还在想「为什么不用 AHB?」,后来一看带宽需求—— 256 位数据总线,每秒几十 GB 的吞吐量。嗯,AHB 确实扛不住。
3.4 Wishbone:开源界的「瑞士军刀」
Wishbone 是 Silicore 公司(后来被 OpenCores 采用)推出的开源总线。我个人很喜欢它—— 因为它简单、灵活,而且完全免费。你想想看,ARM 的总线要授权费,Wishbone 不用。
核心特征:
- 支持点对点、共享总线、交叉开关等多种拓扑
- 两种操作模式:标准模式和流水线模式
- 支持字节、半字、字等多种数据宽度
- 信号命名灵活(不同实现可能不同)
💡 我在项目中遇到过:某次逆向一个开源 RISC-V 芯片,发现它的外设总线全是 Wishbone。当时我还在想「这信号命名怎么这么乱」,后来才发现—— Wishbone 允许用户自定义信号名,只要符合协议规范就行。
3.5 OCP:接口标准化的「通用插座」
OCP(Open Core Protocol)是 OCP-IP 组织推出的标准。说白了,它不定义总线结构,只定义接口协议。你可以把它想象成一个「通用插座」—— 不管后面接的是什么总线,接口都是一样的。
核心特征:
- 完全可配置:数据宽度、地址宽度、突发长度都可调
- 支持多种传输模式:单次、突发、流水线、乱序
- 支持线程和标签(用于乱序传输)
- 支持 sideband 信号(带外控制)
⚠️ 我曾经在逆向一个 OCP 接口时,被它的可配置性搞晕了。同一个 IP 核,在不同 SoC 中可能配置完全不同。所以我的建议是:先找到配置寄存器,搞清楚数据宽度和地址宽度,再开始分析协议。
3.6 五种总线对比总结
下面这张表是我自己整理的,每次做逆向时都会拿出来对照一下:
| 特性 | APB | AHB | AXI | Wishbone | OCP |
|---|---|---|---|---|---|
| 复杂度 | 极低 | 中等 | 高 | 低-中 | 可配置 |
| 流水线 | 无 | 地址/数据 | 5通道独立 | 可选 | 可选 |
| 突发传输 | 无 | 支持 | 支持 | 支持 | 支持 |
| 乱序传输 | 无 | 无 | 支持 | 无 | 支持 |
| 典型应用 | 外设寄存器 | 片上内存 | DDR控制器 | 开源SoC | IP复用 |
| 逆向难度 | ★☆☆☆☆ | ★★★☆☆ | ★★★★★ | ★★☆☆☆ | ★★★★☆ |
3.7 总线协议选择逻辑图
下面这张 SVG 图是我根据多年逆向经验总结的「总线选择决策树」。当你拿到一个芯片网表时,可以按这个逻辑快速判断它用的是哪种总线:
💡 我个人习惯:拿到网表后,先看有没有 AXI 的五组信号。如果没有,再看 AHB 的 HADDR/HWDATA。如果也没有,大概率是 APB 或 Wishbone。至于 OCP,说实话我遇到的比较少,但一旦遇到,就得花时间慢慢啃配置寄存器。
好了,这五种总线的基本特征就讲到这里。每种总线都有自己的「脾气」,逆向时多留个心眼,别被信号命名给骗了。下一节我们会深入 AHB 的协议细节,到时候我会拿一个真实的网表案例来拆解。
公众号:蓝海资料掘金营,微信deep3321