APB3 APB4 APB5 区别:PSLVERR/PREADY 引入史、PPROT/PSTRB 与 wakeup/parity 演进
更新时间:2026-09-28。本文是「集成电路大类 · 芯片设计」总线主题簇里的一篇长尾文。APB 等待态与 PENABLE 讲清了 APB 的两拍握手时序,APB 外设子系统 讲了子系统级集成,但都没有回答一个集成第三方 IP 时必问的问题:这个 slave 到底是 APB3、APB4 还是 APB5,接口信号差在哪?本篇按版本把差异一次讲透。
本文要回答的问题
- APB2 到 APB3 加了什么,为什么
PREADY/PSLVERR是分水岭? - APB4 的
PPROT和PSTRB各自解决什么问题? - APB5 的 wakeup 信号和 parity 校验在什么场景必须上?
- 不同版本的 master/slave 对接时,缺省值怎么接才安全?
- 把 APB3 外设迁到 APB4/APB5 环境,验证用例要补什么?
一、版本演进总览:每个版本只加一小步
APB(Advanced Peripheral Bus,高级外设总线)是 AMBA 家族里最低功耗、最简单的一员,专门服务寄存器读写类低速外设。它的版本演进非常克制——每一代只补一类能力,不搞大改:
| 版本 | 新增信号 | 解决的核心问题 |
|---|---|---|
| APB2 | (基础集)PSEL/PENABLE/PWRITE/PADDR/PWDATA/PRDATA | 两拍定序传输,无等待、无错误 |
| APB3 | PREADY、PSLVERR | slave 可以插等待态、可以报告错误 |
| APB4 | PPROT[2:0]、PSTRB[3:0] | 访问保护属性、稀疏字节写 |
| APB5 | PWAKEUP、PARITY 类校验(PADDRCHK 等) | 低功耗唤醒、安全攸关场景的传输完整性 |
这张图是理解全篇的骨架:APB3 补「流控」,APB4 补「属性」,APB5 补「功耗与安全」。记住这个递进关系,任何一个信号你都能推断出它是哪个版本引入的。下面逐代展开。
二、APB3:PREADY 与 PSLVERR 的引入史
APB2 时代的传输是两拍定死的:SETUP 拍(PSEL=1、PENABLE=0)之后紧跟 ACCESS 拍(PENABLE=1),slave 必须在 ACCESS 拍完成读写,没有商量的余地。这对真正的寄存器堆没问题,但一旦 slave 内部要访问 SRAM、要跨时钟域、或者本身是个状态机,一拍之内完不成就只能把时序压力转嫁到 master——很多设计靠降低 APB 时钟频率来迁就最慢的外设,整个外设总线被拖慢。
APB3 的答案是 PREADY:ACCESS 拍里 slave 可以拉低它插入等待态,master 保持所有控制信号不变,直到 PREADY=1 才完成传输。等待态期间 PSEL、PENABLE、PADDR、PWRITE 都必须冻结,这一点和 AHB 的 HREADY 语义一致,详细时序见 APB 等待态与 PENABLE。有了 PREADY,慢外设自己消化时序,快外设零等待通过,总线时钟可以按快外设定。
同代引入的 PSLVERR 让 slave 第一次有了「报错」的能力:访问保留地址、写只读寄存器、权限不足,都可以在完成的那个 ACCESS 拍把 PSLVERR 拉高。注意它的有效窗口很窄——只在 PSEL、PENABLE、PREADY 同时为 1 的最后一拍有效,其余时刻的值没有意义,采样时刻错一拍就会误报或漏报,这是 APB 协议检查器里最常见的断言之一。
一个历史遗留细节:APB2 slave 没有这两个信号,APB3 master 接 APB2 slave 时要把 PREADY 绑 1、PSLVERR 绑 0。反过来 APB3 slave 挂 APB2 master 则完全兼容,因为 master 本来就会在 ACCESS 拍完成传输,slave 只要始终拉高 PREADY 即可。写 RTL 时建议把 PREADY 的缺省值直接设为 1,只在真正需要等待的状态里拉低,这样即使后续该外设被挂到更老的环境也不容易出错;验证侧则要把「PREADY 拉低期间控制信号冻结」做成断言,防止 master 在等待拍偷偷改地址——这类 bug 单拍访问测不出来,只有背靠背访问加随机等待才暴露。
三、APB4:PPROT 保护属性与 PSTRB 字节选通
APB4 加的两组信号指向两个完全不同的方向。
PPROT[2:0] 是把 AHB 的 HPROT 思想下放到外设总线:bit0 区分普通/特权访问(normal/privileged),bit1 区分安全/非安全(secure/non-secure),bit2 区分数据/指令(data/instruction)。它的典型用途是配合 APB5 PPB 与 xcheck/prot 检查 里讲的外设保护单元——比如 TrustZone 系统里,非安全世界的软件访问安全外设时,互连或保护单元按 PPROT 拦截并返回 PSLVERR。slave 如果不需要区分,可以直接忽略 PPROT,规约明确允许。
PSTRB[3:0] 是写字节使能,解决「稀疏写」问题:APB2/3 时代想改一个 32 位寄存器里的 8 位域,只能软件读-改-写,或者硬件把寄存器拆成多个按字节寻址的寄存器。有了 PSTRB,master 一次写只更新选中的字节,其余字节保持原值。两条硬约束要记住:PSTRB 只在写传输有效,读传输时必须全 0;每一根 PSTRB 位对应 PWDATA 上固定的 8 位车道,位序一一对应不可调换。slave 侧实现时,写使能就是 PSTRB 按位展开的四个字节写门。
四、APB5:wakeup 信号与 parity 校验
APB5 的两个增强都面向 SoC 级的新需求。
PWAKEUP 是低功耗场景的配套信号,和 AMBA 低压差接口家族(Wakeup Signaling)配合:APB 外设通常挂在可被时钟门控甚至电源门控的域里,master 发起访问前先抬 PWAKEUP,电源控制器据此提前给外设域上电开钟,等域就绪后再真正发起传输。关键时序约束是 PWAKEUP 必须先于 PSEL 断言、且传输完成后才能撤销;如果和 PSEL 同拍拉起,外设域还没醒,SETUP 拍就丢了。引入了 PWAKEUP 的系统里,APB 桥(见 AHB/APB 桥)和电源控制器的交互顺序必须作为集成验证项。
parity 校验则是安全攸关场景(车载 ISO 26262、工业)的需求:给关键信号配奇偶校验位,检测总线互连上的单比特翻转。APB5 的校验信号族包括 PADDRCHK(地址+控制)、PCTRLCHK、PDATACHK(数据)、PREADYCHK、PSLVERRCHK 等,本质是把接口包进一个「端到端校验」框架,master 生成、slave 检查(或反向),发现校验错误按实现定义方式上报警。不做功能安全的产品可以完全不带这组信号;要做的产品从架构阶段就要定好生成方/检查方分工,事后补接非常痛苦。
上图把 APB5 两条增强放在一次完整访问里:先唤醒、再传输、校验随行。注意图中第 1 步与第 3 步之间的间隔是实现相关的——规约不规定唤醒需要多少拍,只规定信号先后顺序。
五、迁移与对接注意点
把不同版本的组件拼在一起时,按这张清单走一遍能避开绝大多数坑:
- APB3 master 接 APB2 slave:
PREADY绑 1、PSLVERR绑 0,功能零损失,但 slave 内部慢路径的时序压力照旧存在。 - APB4 master 接 APB3 slave:slave 没有 PPROT/PSTRB 输入。PPROT 丢弃无妨;PSTRB 必须保证 master 侧永远全 1(全字节写),否则字节写语义会在 slave 侧静默变成整字写,数据被悄悄覆盖——这是最危险的一种错接。
- APB5 系统接 APB4 slave:PWAKEUP 由互连代为管理即可;parity 信号 slave 侧没有对应检查逻辑,要么互连吸收校验职责,要么明确该外设不在安全路径上,写进安全手册。
- 验证用例要补的方向:升 APB3 补等待态随机(PREADY 拉低 0~N 拍)与 PSLVERR 触发用例;升 APB4 补 PPROT 组合遍历(特权/安全/数据 8 种)和 PSTRB 逐字节写后读回;升 APB5 补 PWAKEUP 与 PSEL 的先后顺序断言、parity 单比特注入故障测试。
- 协议检查器:APB 各版本 OVL/SVA 断言集不一样,迁移时检查器版本要和 RTL 声明的版本对齐,混用会出一堆假失败。
和 AHB 侧的版本演进对照着看会更有体感:AHB2 到 AHB5 迁移差异 走的是类似的「小步加能力」路线,两篇对照读,AMBA 家族的演进逻辑就齐了。
这一篇在知识体系里的位置
协议全貌见 AMBA 入门;两拍时序与等待态细节见 APB 等待态与 PENABLE;PPROT 在保护单元里的落地见 APB5 PPB 与 xcheck/prot 检查;子系统集成见 APB 外设子系统 与 AHB/APB 桥;同族演进对照见 AHB2 到 AHB5 迁移差异。
总结
APB3 APB4 APB5 区别可以浓缩成三代各加一类能力:APB3 引入 PREADY/PSLVERR 让 slave 能插等待、能报错,APB4 引入 PPROT/PSTRB 补齐访问保护属性与字节级稀疏写,APB5 再加 PWAKEUP 低功耗唤醒和 parity 端到端校验;迁移对接时最危险的是 APB4 的字节写语义错接到无 PSTRB 的 APB3 slave 上造成静默整字覆盖,验证要按版本逐代补等待态、属性遍历、字节写回读、唤醒时序和故障注入用例。