APB AXI-Lite 桥映射:五通道到 Setup/Access 相位、PSLVERR 到 SLVERR/DECERR 的信号级翻译
更新时间:2026-09-28。本文是「集成电路大类 · 芯片设计」接口主题簇里的一篇长尾文。同簇的 AHB/APB 与桥接 讲的是 AHB 一侧的跨桥故事,AXI4-Lite slave 设计 讲的是 AXI-Lite 端口的内部实现,本篇补上它们之间的那块拼图:把 AXI4-Lite 挂在 APB 外设子系统上时,桥(bridge)内部到底做了哪些信号翻译。
本文要回答的问题
- AXI4-Lite 有五个独立通道,APB 只有 Setup/Access 两相位,通道怎么折叠成相位?
- 写地址(AW)和写数据(W)到达顺序不固定,桥该等谁、锁存谁?
- APB 的
PSLVERR在 AXI 侧应该报成SLVERR还是DECERR? PREADY等待态怎么反压回 AXI 的BVALID/RVALID?- 一笔 AXI 事务在桥上对应几个 APB 周期,吞吐上限是多少?
一、先看两边各自长什么样
APB AXI-Lite 桥映射之所以值得单独写,是因为两边的「事务」颗粒度完全不同。AXI4-Lite 把一笔访问拆成最多五个通道:写地址 AW、写数据 W、写响应 B、读地址 AR、读数据 R,每个通道独立 VALID/READY 握手,地址和数据可以乱序到达,响应可以滞后任意拍。APB 则是教科书式的两相位状态机:主机驱动 PSEL/PADDR/PWRITE 进入 Setup 相位,下一拍拉起 PENABLE 进入 Access 相位,等 PREADY=1 完成,地址、数据、控制从头到尾焊在一起,没有通道的概念。
所以桥的本质工作就两件:把五个通道的到达事件折叠成 APB 的两相位串行时序,以及把 APB 的单一完成事件展开回 AXI 的响应通道。前者是仲裁与锁存问题,后者是响应生成问题。
| AXI4-Lite 侧 | APB 侧 | 桥要做的翻译 |
|---|---|---|
| AWVALID/AWREADY + AWADDR | Setup 相位驱动 PADDR/PWRITE=1 | 锁存 AWADDR,作为 PADDR 来源 |
| WVALID/WREADY + WDATA/WSTRB | Setup 相位驱动 PWDATA;PSTRB(APB4) | 锁存 WDATA/WSTRB,WSTRB 直通 PSTRB |
| BVALID/BREADY + BRESP | Access 完成后采样 PSLVERR | 完成事件触发 BVALID,PSLVERR→BRESP |
| ARVALID/ARREADY + ARADDR | Setup 相位驱动 PADDR/PWRITE=0 | 锁存 ARADDR |
| RVALID/RREADY + RDATA/RRESP | Access 相位采样 PRDATA/PSLVERR | 完成时寄存 PRDATA 并拉起 RVALID |
二、写路径:等齐 AW 和 W,再进 Setup
AXI 规约明确不保证 AW 先于 W 到达(虽然 AXI-Lite 大多数主机会同时发),所以桥的写路径入口必须是一个「等齐」逻辑:AW 握手成功则锁存 AWADDR、W 握手成功则锁存 WDATA/WSTRB,两者都到手才允许拉起 PSEL。谁先到就给谁先回 READY 锁存掉,另一侧通道的 READY 保持拉低,直到数据齐套。这样做的好处是 AXI 侧的两个通道各自只占用一拍握手,桥内部用寄存器消化乱序,不要求主机保序。
进入 APB 侧后时序是固定的:T1(Setup)拉起 PSEL=1, PENABLE=0,驱动锁存好的 PADDR/PWRITE=1/PWDATA/PSTRB;T2(Access)拉起 PENABLE=1,然后等 PREADY。PREADY=0 期间所有 APB 信号保持不变——这与 APB 等待态与 PENABLE 里讲的规则一致。Access 完成的那个周期,桥采样 PSLVERR,然后在下一个周期拉起 BVALID,BRESP = PSLVERR ? SLVERR : OKAY,等 BREADY 握手后回到空闲。
这张状态机图覆盖了读写两条路径:读路径只是把 CAPTURE 简化为只等 AR,RESPOND 里多带一份寄存的 PRDATA。注意 ACCESS 的自环——PREADY 拉低多少拍,桥就在 ACCESS 停多少拍,这期间 AXI 侧的响应通道绝不提前动作,反压由此自然形成。
三、PSLVERR 升格:SLVERR 还是 DECERR
这是桥设计里最容易答错面试题的地方。APB 只有一个错误信号 PSLVERR,不区分「外设说自己错了」和「地址根本没译码到任何外设」;AXI 的响应编码却是两位的:OKAY=00、SLVERR=10、DECERR=11。映射规则按错误来源分两段:
- 访问命中了某个 APB 外设、外设在 Access 完成拍拉高了
PSLVERR:这是外设报告的从设备错误,桥翻译为 SLVERR,原样写进BRESP/RRESP。 - 地址落在桥的译码窗口之外、没有任何
PSEL该被拉起:AXI 规约不允许请求石沉大海,桥必须自己消化——内部走完一拍伪 Access(不驱动任何 PSEL),然后回 DECERR。有些实现把译码放在桥上游的地址译码器里,此时由译码器回 DECERR、桥根本看不到这笔请求,两种划分都合法,但同一个 SoC 里口径必须统一。
读路径上 RDATA 在错误响应时的取值:SLVERR 场景回采到的 PRDATA(通常无意义但无害);DECERR 场景没有真实读数据,惯例回全 0,验证时按这个约定检查即可,规约本身不约束。
四、反压与吞吐:一笔事务几个周期
APB 侧一笔零等待传输固定 2 个周期(Setup + Access),每加一个等待态多 1 拍;再加上 AXI 侧锁存与响应各至少 1 拍,流水不重叠时一笔写事务端到端约 4 拍起步。AXI4-Lite 本身不支持 outstanding(一笔未完成不许发下一笔),所以桥不需要做事务重排或 ID 管理,吞吐上限就是「1 / (APB 拍数 + 固定开销)」。这也是为什么 APB 只配挂在低速寄存器外设上:真要高带宽,应该走 AXI4 完整协议 加 AXI 交叉开关,而不是指望桥流水化。
反压方向要想清楚两条:PREADY=0 时桥停在 ACCESS,AXI 侧表现是 BVALID/RVALID 迟迟不起——合法;反过来 AXI 主机 BREADY=0 不收响应时,桥停在 RESPOND,此时新的 AW/W/AR 的 READY 必须全部拉低,因为桥内部只有一份事务寄存器,不接新活儿。这也意味着这类简单桥天然是单事务串行的,想做并发就得加事务 FIFO,那是另一个量级的设计。
五、验证要点清单
先说 PSELx 译码这一个最容易被省略的坑。桥对外通常只暴露一个 APB 口,但真实子系统里一个桥后面挂十几二十个外设,PSELx 是一对一的:每根选择线只服务一个外设地址窗。译码逻辑拿 AWADDR/ARADDR 高位跟外设基址表逐个比较,命中哪一格就拉哪根 PSELx,全不命中就是 DECERR 场景——注意此时一根 PSELx 都不许动,否则悬空外设可能把假当时序做出副作用(比如误清中断状态位)。基址表建议用参数化 case 或 generate 写死,别留给综合工具推断 ROM;窗口有重叠时必须在 lint 阶段就报出来,不能指望仿真兜。
再补一条错误注入的验证手法。被动等外设自己产生 PSLVERR 往往等不到,工程做法是在验证平台里给 APB slave 模型加一个「错误注入寄存器」:配置第 N 笔访问回 PSLVERR=1、或把 PREADY 永远拉低模拟死掉的外设。前者用来钉死 SLVERR 升格路径,后者配合总线超时看门狗验证桥不会无限挂死(挂死时 AXI 侧表现为 BVALID 永远不起,看门狗应能抓到)。注入点放在 slave 模型而不是桥上,才能保持桥 RTL 不被验证代码污染。
对这座桥的验证,定向用例至少覆盖:AW 先于 W、W 先于 AW、两者同拍三种到达顺序;PREADY 拉低 0/1/N 拍的等待态;PSLVERR=1 时 BRESP/RRESP 必须为 SLVERR;译码窗口外地址必须回 DECERR 且无任何 PSEL 动作;BREADY 反压期间新请求 READY 全为 0。随机回归里把 AXI 侧 VALID/READY 延迟和 APB 侧 PREADY/PSLVERR 都做成可配置随机,配合断言检查「APB 信号在 PREADY=0 期间恒定」「PSEL 拉起后一拍内 PENABLE 必起」这两条协议不变量,基本就能把桥钉死。验证环境的搭法可参考 APB 时序协议设计 里的 monitor 结构。
这一篇在知识体系里的位置
协议底座见 AMBA 入门;APB 侧细节见 APB 时序协议设计 与 APB 等待态与 PENABLE;AXI 侧见 AXI4-Lite slave 设计 与 AXI RRESP/BRESP 解码;同类跨协议桥对照 AHB/APB 与桥接 与 外设总线桥 AHB 到 APB;错误语义更宽的对照见 AXI 错误响应与总线超时。
总结
APB AXI-Lite 桥映射的核心是两步翻译:把 AXI4-Lite 五通道的独立握手折叠成 APB 的 Setup/Access 两相位串行时序(写路径需等齐 AW 与 W 再进 Setup),把 APB 的单一完成事件展开回 B/R 响应通道;错误语义上,外设报告的 PSLVERR 升格为 SLVERR、译码未命中由桥自生 DECERR;PREADY 等待态通过延迟响应通道自然反压,简单桥单事务串行、零等待一笔约 4 拍,只适配低速寄存器外设。