FPGA 专家 07:AXI4 完整协议深水区——握手、ID、事务
本文是
fpga/专家层第 10 篇。协议概览见进阶 AXI4 完整协议与互联,互联设计见下一篇 AXI 互联设计,DMA 见 DMA 数据搬运。
一、五通道与握手铁律

| 规则 | 内容 |
|---|---|
| VALID 稳定 | 置起后信息不变、直到 VALID&READY |
| 不成环 | VALID 不组合依赖 READY,防互等死锁 |
| B 响应 | 每笔写突发结束只一次 |
| 4KB | 单突发不跨 4KB 页 |
| 对齐 | AxSIZE=2 幂、≤总线宽、地址对齐 |
二、ID、乱序、outstanding
- AxID:事务线程标签;同 ID 按序、不同 ID 可乱序完成;
- outstanding:未完成事务数,
所需 ≈ 带宽×往返延迟÷每笔字节,DDR 建议 16~64; - 互联扩展 ID(加主设备前缀),下游 ID 更宽;
- 响应按 ID 匹配,不可张冠李戴。
三、突发与响应
| 字段/信号 | 含义 |
|---|---|
| AxLEN | 突发拍数(1~256) |
| AxSIZE | 每拍字节(2 幂、≤总线宽) |
| AxBURST | INCR 连续 / WRAP 回环 / FIXED(FIFO) |
| WSTRB | 字节选通(窄传输/部分写) |
| RRESP/BRESP | OKAY / EXOKAY / SLVERR(从机错)/ DECERR(无此从机) |
| AxLOCK | 独占访问(原子操作) |
四、违规与挂死排查
- 仿真上 AXI VIP / protocol checker 断言(上板挂死仿真却过的元凶);
- ILA 抓五通道:谁 VALID 不起、谁 READY 不给、响应回没回;
- 典型挂死:从机不回 R/B、B 通道没人接收、ID 错配、跨 4KB 未切、DECERR 地址悬空;
- 寄存器/Lite 访问挂死常见:地址位没接全、从机状态机等条件。
五、五通道握手的完整时序语义与违规模式
AXI 的可靠性全部建立在五通道独立握手上,把握手规则讲透比记住信号名重要。每个通道都有 VALID(信息发起方置位)和 READY(接收方可接收),传输在两者同高的上升沿发生;规范给了三种合法起点:VALID 先于 READY(最常见、最安全,信息稳定地等);READY 先于 VALID(接收方缓冲空闲时常高,允许);同周期两者一起起(合法但要求组合路径不互相依赖)。铁律有两条:第一,VALID 一旦置起,在握手完成前不得撤销,且载荷(地址、数据、控制位)必须保持稳定——允许的例外只有 wlast/wstrb 也必须连同 wdata 一起稳定。第二,VALID 的置起不得组合依赖对方的 READY/AWREADY 等;READY 可以等 VALID(“看见有效我再准备”),因此安全的依赖方向是 READY→VALID 这一侧观察对方,反向组合成环就构成互锁:主机“你 ready 我才 valid”,从机“你 valid 我才 ready”,上电后双方永远不动。
真实项目里反复出现的违规模式值得逐一识别。模式一,FSM 里 if(ready) valid<=1:写法上看似“准备好才发”,实际生成了 VALID 对 READY 的组合/时序依赖,背靠背传输时丢拍甚至死锁;正确写法是“有请求就置 VALID,握手后清”。模式二,载荷随 VALID 组合变化:握手前最后一拍数据仍在变,从机采到中间值;所有 Ax*/W* 信号必须来自保持寄存器。模式三,READY 用复位后未初始化的状态组合:READY 信号上有毛刺,偶发握手。模式四,W 通道假设 AW 必先握手:协议允许 W 数据先于 AW 到达(从机/互联可以先缓存),从机不能写死顺序依赖,反之主机可以利用这点预取数据。模式五,B/R 通道无接收者:主机发完写不等 BRESP,或不持续收 R 数据,从机/互联缓冲填满后整个通道停摆,进而反压到全机。模式六,复位期间行为不确定:复位期间/复位释放当拍 VALID 必须为低,避免恢复后的伪传输。这些问题在简单 RTL 仿真中可能因激励顺序“恰好能跑”而漏网,务必让 AXI VIP 或第三方 protocol checker 跑随机握手延迟(随机拉低 READY)的测试,这是把协议违规挡在仿真阶段的标准手段。
六、ID、线程模型与互联中的响应路由
AxID(AWID/ARID)和响应侧的 BID/RID 是 AXI 高性能能力的核心,也是最多误解的字段。本质上,ID 给每个主端口提供了若干条“逻辑事务流(thread)”:规范只保证同一 ID 的事务按发起顺序完成,不同 ID 之间完全允许乱序(读数据可能后发先至,写响应也可能乱序),互联和从机据此并行处理——慢的从设备不阻塞发往快设备的事务,DDR 控制器也能对不同 ID 的请求重排提高 row hit 率。主机设计必须据此维护 ID 上下文表:发出读请求时把(ID、内部缓冲指针、剩余长度)登记,收到 R 数据按 RID 分派,RLAST 时归还表项;若把所有响应当 FIFO 顺序消费,只要从机允许任何重排(多端口 DDR、PCIe DMA 都如此),数据就会错配。写路径的约束更细:不同 ID 的写数据允许在 W 通道交错(interleaving),从机按 WID(AXI3)或 AW 顺序规则/ID(AXI4 已去掉 WID,写数据交错在 AXI4 中实际被禁止,同 ID 顺序由互联保证)重组;AXI4 从机通常只支持无交错写,互联配置要匹配。
经过 Interconnect/NIC 后,ID 还会被扩展:互联在主 ID 前拼上主设备编号前缀,使从机(及响应回程)能区分事务来自哪个主,因此从口看到的 ID 宽度 = 前缀位 + 主口 ID 位,配置互联时这一宽度由工具计算,手工改窄会截断主编号或线程位,导致响应回错主机。ID 宽度的规划问题:主口自身 ID 至少要覆盖该主设备内部需要并行飞行的线程数(例如一个 DMA 有 8 个散聚队列,至少 3bit 线程 ID);不是 ID 越多越好——更宽的 ID 增加从机和互联的重排缓冲资源,也增加协议死锁的配置面。**独占访问(AxLOCK=EXCLUSIVE)**利用 ID 实现类似 LL/SC 的原子语义:先独占读(记下地址监控),再独占写,期间若他者修改了该位置,从机在 BRESP 中返回 OKAY 而非 EXOKAY 表示失败,软件据此重试;这是无锁队列在 AXI 上的基础,但要求从机支持监控,寄存器型简单从机通常不支持,误用会永久失败。把“ID 即线程、同序跨 ID 乱、响应按 ID 匹配、互联加前缀”四句话落到每个 RTL 评审项,能消灭大量只在多主/高负载下才出现的数据错乱。
七、突发事务、4KB 边界与响应语义
突发参数决定了一笔事务的形状。AxLEN 是拍数减一(AXI4 可达 255,即 256 拍;AXI3 上限 16),AxSIZE 是每拍字节数的对数编码(2^size,必须是 2 的幂且不超过数据总线宽度),AxBURST 决定地址推进:INCR 每拍地址加一个 size,连续内存/DDR 的默认选择;WRAP 在跨过(len+1)×size 的边界后回绕到突发起点,专用于 cache line 填充(如 CPU 缓存行的关键字优先);FIXED 地址不变,每次拍都访问同一位置,适合 FIFO/流式寄存器。地址必须按 size 对齐(低位地址与 size 匹配),非对齐起始在 AXI4 中允许但首拍会配合 WSTRB 屏蔽部分字节,简单从机可以不支持。4KB 规则是硬边界:一笔突发所有拍必须落在同一个 4KB 页内,不允许跨页——它来自 PCIe 等系统的页解码假设,也避免突发越过从机地址译码边界;DMA 引擎必须按 4KB 切分传输,软件描述符也要遵守。常见违例是“128 字节突发从接近页尾的地址起”,越界后访问落到另一个从设备。
数据通道细节:WSTRB 每字节一根选通,为 0 的字节从机应忽略(使能部分字写、ECC 友好的读改写由更高层负责);RLAST/WLAST 在最后一拍置起,从机必须正确给出——主机按 last 判断突发结束,缺失会导致上下文表项泄漏直到挂死;窄总线到宽总线或位宽转换由互联处理,但会改变拍数和 strobe 形态,要在验证中覆盖。响应语义分两级:RRESP 每拍可读但只在最后一拍有效(2bit:OKAY 正常访问/EXOKAY 独占成功/SLVERR 从机错误/DECERR 解码错误);BRESP 每笔写突发只返回一次,且必须在整笔写的最后一个 W 握手之后。SLVERR 表示“从机收到了但执行失败”(非法寄存器、FIFO 满策略为报错、ECC 不可纠正),DECERR 表示互联找不到这个地址(地址映射空洞)——两者对软件是不同的故障类,寄存器设计时所有保留地址应显式返回 SLVERR 或由互联给 DECERR,绝不能沉默(沉默的访问会表现为 PCIe/AXI 挂死而不是干净报错)。调试时一个有效方法是给每个响应类做计数器:SLVERR 突增是从机逻辑问题,DECERR 是地址表问题,OKAY 但数据错才去查 ID/重排逻辑。
八、outstanding 深度与带宽数学:延迟由谁来盖
AXI 性能问题的核心公式是 Little 定律在总线上的应用:所需在途事务数 ≈ 目标带宽 × 单次往返延迟 ÷ 每事务有效字节。以 DDR 路径为例,若控制器往返延迟 80ns、目标 8GB/s、每笔突发 64 字节,则需要约 10 笔在飞,考虑仲裁和刷新等待取 2~4 倍余量,即 16~32 笔 outstanding 是常见配置;PCIe→AXI DMA 路径的“往返”还包含 TLP 回程,深度需求更大(见 专家 08 第八节的 tag 深度公式)。只发一笔等一笔时,总线利用率 ≈ 传输时间/(传输+往返),高延迟下可能不到 5%;把管道填满后才能接近 100%。但 outstanding 不是越深越好:每笔在飞事务在主机、互联、从机三处都要占上下文/缓冲资源;太深的在途队列在拥塞时只会增加排队延迟(这对低延迟寄存器访问是灾难),并放大复位时需要排空的状态。成熟做法是分通道配深度:大块数据通道深(32~256),控制寄存器通道浅(1~2),并支持每主设备的配额限制,防止一个 DMA 主设备用 outstanding 占满互联缓冲饿死别人。
配套提频手段:突发长度尽量拉长(一笔 256 拍的地址开销摊薄到接近零),但长突发对延迟不友好且占住从口时间长,实时仲裁器常限制单次突发配额(budget),在带宽和公平之间折中;读写并行:AXI 的读、写通道独立,主机可以同时维持读、写两套 outstanding,DDR 控制器也能在内部调度,带宽测试要双向分别测再混合测;避免气泡:R 通道数据应每拍都被接收(主机接收 FIFO 永远 ready),W 通道背靠背(数据在置 AW 时已备好)。验证带宽时要建一个“延迟注入从机模型”(可调响应延迟、随机 READY),观察在目标延迟下的实际利用率,而不是用零延迟的仿真从机得出虚假的 100%。把“往返延迟×带宽÷突发字节”的估算写进设计评审,是区分会算管道的工程师和只会“加大 FIFO 试试”的工程师的标志。
九、AXI4-Lite/Stream 与 AXI5/ACE:协议家族的边界
AXI4 家族里三个协议常被混用,设计接口时应明确选用。AXI4(内存映射完整版):支持突发、多 ID、outstanding,用于 DDR/DMA 等高带宽内存映射路径。AXI4-Lite:单拍事务(len=0、32/64 位数据)、单线程、无突发,是控制寄存器的标准接口;它简单到一个小 FSM 就能正确实现从口,因此“寄存器一律 Lite、数据才上 AXI4”是最重要的接口纪律之一——把寄存器接在支持突发的宽总线上要经过转换器(downsize/single-beat),既增延迟又给死锁埋雷。Lite 从机仍必须完整响应五个通道的规则(每次读 AR→R、每次写 AW+W→B,且 B 必须在 W 之后),Lite 挂死最常见原因正是 B 通道没给响应或 AW/W 分别等待形成内部死锁(应把 AW、W 都收齐后再执行写)。AXI4-Stream:不是总线而是单向流,只有 VALID/READY/tlast/tkeep/tuser,无地址无响应,用于数据流水(见 专家 05、以太网帧路径);Stream 与 MM 的边界由 DMA/桥完成。
AXI5 与 ACE/CHI 方向:新版 AXI5 增加了 QoS 增强、原子操作(AtomicOp)、缓存刷新标签、可选择的一致性信号、wakeup 信号,并把响应/锁语义现代化;ACE(AXI Coherency Extensions)在 AXI 上增加缓存状态通道(snoop),使 CPU 缓存一致的主设备(如 ACP 口、某些 MPSoC 加速器口)能参与硬件一致性(Zynq ACP 的使用见 专家 13);CHI 则是 ARM 全新的网状一致协议,Versal 等新平台的 NoC 已向其靠拢。工程上不需要追新,但要知道:一致性端口带来的便利(免缓存维护)伴随 snoop 流量和不确定性延迟,高性能数据面是否经过一致性域要按收益评估;跨代 IP 集成(AXI3 master 接 AXI4 互联、AXI4 接 AXI5)要用经过验证的桥并检查 ID/锁语义差异(AXI3 的 WID、locked 事务在 AXI4 中移除)。接口选型一句话:寄存器 Lite、流数据 Stream、内存批量才用 AXI4,一致性只在确有 CPU 共享数据收益时开启。
十、验证方法学:VIP、检查器、覆盖率与挂死定位
AXI 子系统的验证投入通常和协议复杂度成正比,以下是工业界收敛后的最小实践集。组件层:每个自研主/从口接 AXI VIP(VIP 既当响应可配置延迟/错误的从机,也当可发随机事务的主机)跑定向+随机回归;伴随 protocol checker(断言库)监视全通道,任何 VALID 撤销、载荷变化、4KB 跨越、last 缺失、ID 乱序违规立即报断言。子系统层:在互联系统中用多个 VIP 主设备同时施压,覆盖 ID 全组合、读/写混合、outstanding 打满、随机反压、从机 SLVERR/DECERR 注入、复位中途发生事务的恢复;功能覆盖率关注:各主×各从路径、ID 交错、窄传输/strobe、突发长度与对齐边界(刚好在 4KB 前结束的突发、跨边界被 DMA 切分的序列)、独占访问成功/失败。性能断言:对关键路径写 SVA 或监视器统计延迟分布与带宽,CI 中与预算对比,防止 RTL 改动悄悄引入一拍延迟后到系统集成才发现。
上板后协议检查器不可能一直跑(综合后断言可保留为轻量监视),挂死定位靠死锁检测寄存器与可观测性:为每个主口记录“最老未完成事务”的年龄(周期计数),超过阈值置 sticky 标志并抓快照(谁的 AWVALID 高而 AWREADY 低、哪个从口的 BVALID 高无人收、ID 表占用情况);经 AXI-Lite 可读,必要时触发软复位该路径。这套机制在 专家 45 的调试体系里属于标准配置。典型挂死现场的判读:AW 通了 W 不动→主机数据未备好或 W 通道被下游反压;W 通了无 B→从机逻辑缺响应;R 一直 VALID 主机不收→主机侧 FIFO/上下文表满,多为 ID 不匹配或 last 丢失;某主年龄无限增长而总线空闲→ID 表项泄漏;所有主都卡在同一从口→从机挂死或其时钟/复位异常。最后强调:任何 AXI 从设备都必须保证请求最终有响应(宁可 SLVERR 也不能沉默),这是全片不发生不可恢复挂死的底线;把“响应不缺失、错误可上报、死锁可定位”作为和吞吐同等重要的验收指标,AXI 子系统才谈得上可靠。
十一、自研 AXI 主/从口的工程模板
把协议规范落成可复用 RTL 时,有一套经过大量项目验证的模板化写法。主口模板:内部维护请求 FIFO(存放地址、长度、ID、上下文指针),AW/AR VALID 由“FIFO 非空且通道未占”置位并保持到握手,握手后推进 FIFO;写数据来自独立数据 FIFO,允许提前填充,WLAST 由长度计数产生;响应通道的 B/R 必须无条件持续接收(READY 常高或接到一个小 FIFO),收到响应后按 ID/标签释放上下文;读数据出口写到接收 FIFO 由后端消费,绝不能因为后端忙而不接收 R——那会占住总线并可能死锁。模块内部把“请求发起”和“响应回收”解耦成两个独立小状态机,是避免组合成环的关键。从口(Lite 寄存器)模板:AR 握手后立即(或一周期内)驱动 R 数据与 RRESP,读路径不做长等待;写路径分别收 AW 和 W,各存到小缓冲,两者到齐后执行一次寄存器写再给 BRESP——先收齐再写避免了 AW/W 互等;所有地址(包括保留段)都有响应,非法地址回 SLVERR。寄存器本身用“写使能脉冲+数据保持寄存器”实现,脉冲只在握手那一拍产生,避免连续写被漏采。
宽 AXI 从口(带突发)模板:维护突发内 beat 计数、地址 INCR 生成、WSTRB 透传到 BRAM 的字节写使能;R 通道按计数给出连续数据并在末尾置 RLAST;建议内部先收敛为一个简单的“请求/响应”FIFO 接口,业务逻辑只见线性读写,不直接接触五通道。通用纪律:所有 VALID 寄存器输出、上电复位期间 VALID=0;READY 尽量早确定(常高或仅依赖本地 FIFO 非满);跨时钟域只放在互联的异步 FIFO,自研口不直接跨域;侧带信号(user/sideband)随通道同拍寄存。每个自研口交付时附带一个 VIP 测试台(随机 ready、随机延迟、错误响应注入、复位测试)并在 CI 中保持通过。模板化的意义不只是减少 bug,更在于评审时能快速对照“这份实现是否偏离了经过验证的骨架”,把协议正确性从个人经验变成组织资产。
十二、跨时钟域、复位与低功耗集成
AXI 接口在系统集成时还必须处理协议文本之外的三件事。跨时钟域:主从异频/异步时只通过互联的异步 FIFO(或验证过的 AXI 异步桥)连接,五个通道的跨域各自独立但必须保持事务关联——自制跨域桥极易在 ID/LAST 对齐上出错;配置桥时注意两侧 outstanding 能力取最小值。复位纪律:AXI 规范要求复位 asserted 期间 VALID 全低,复位释放必须在时钟稳定后且保持足够长;一个系统里主、从、互联可能用不同的复位树和复位极性,要在顶层明确谁先谁后——通常建议先复位从设备和互联、再释放主设备,避免主设备对尚未就绪的从口发事务;热复位单个 IP 时,要保证该 IP 口上无在途事务(先停主、等最老事务年龄归零、再复位、最后恢复),否则跨复位的握手会留下永久卡死的通道。低功耗时钟门控与 AXI 的配合:门控从口时钟前要确认无在途事务,或让互联的 Q-channel/低功耗握手接管;调试时钟也要在门控状态下仍可读关键状态,否则现场无法诊断。系统启动时建议先跑一个 AXI 冒烟测试(PS 经互联读写每个从口的 ID 寄存器和一段 BRAM 回环),任何一条链路无响应立即中止启动并报错——这能在几十毫秒内发现地址表、复位、时钟使能类集成错误,而不是等到业务跑起来才挂死。把这些集成纪律和协议规则同等对待,AXI 系统才不仅“仿真能通”,而是每次上电都可靠。
十三、一页纸总结:AXI4 设计与评审检查单
把全篇压缩成可直接用于评审的检查单。握手:VALID 是否全部寄存输出且置起后稳定;READY 是否避免与 VALID 组合成环;复位期间 VALID 是否为低;五个通道是否都有接收方(尤其 B/R 不被遗漏)。ID 与并发:ID 宽度是否覆盖内部线程并预留余量;互联后 ID 前缀是否算入;响应是否严格按 ID 分派;同 ID 顺序假设是否成立。突发:AxSIZE 是否对齐且不超总线宽;4KB 是否由 DMA/软件切分;LAST 是否必然产生;WSTRB 语义是否贯通;AXI3/4 交错与 WID 配置是否匹配。响应:SLVERR/DECERR 是否有来源且被软件检查;保留地址是否显式报错;响应超时器与挂死快照是否就位。性能:outstanding 是否按带宽×延迟÷突发字节计算并分通道配置;长突发对控制面延迟的影响是否有配额/优先级管理;读写双向是否分别验证。集成:跨域是否仅经异步 FIFO;复位顺序与热复位流程是否定义;时钟门控与事务排空是否联动。验证:VIP 随机握手/错误注入/复位恢复是否在回归中常开;协议 checker 是否全通道;带宽是否在延迟模型下实测。这张表逐条打钩之后,AXI 子系统才算达到专家级交付标准。
十四、AXI 性能问题定位速查
把现场最常见的五类 AXI 性能症状和判据汇总,供集成阶段直接使用。症状一,带宽远低于预算但总线不忙:多半是 outstanding 不足或一问一答,看主机侧在飞事务计数器,低于设计深度就是主设备问题;若计数器长期打满而总线利用率低,看从机延迟(DDR 校准/刷新/仲裁等待),需要更深的在飞数或换从口。症状二,总线忙但有效吞吐低:检查突发长度分布(短突发占比高则地址开销大)、WSTRB 稀疏写(部分字写浪费带宽)、宽度转换损耗。症状三,偶发长延迟尖峰:仲裁被长突发主占满、从机内部刷新/擦除(Flash 类)、或跨域 FIFO 水位同步延迟;用“最老事务年龄”计数器抓尖峰时刻,配合仲裁老化机制解决。症状四,混合负载下某路饿死:固定优先级或权重配置错误,复测“一路满速+一路心跳”的最坏延迟。症状五,复位后第一批事务必挂:复位释放顺序或 VALID 复位值问题,按第十二节的复位纪律检查。所有判断都以硬件计数器为准(口利用率、突发长度直方图、年龄峰值、响应码计数,见 专家 45),不要用 ILA 抓几拍波形就下结论——总线问题的统计特性决定了单次波形几乎必然误导。最后提醒团队协作:自研 AXI IP 的接口文件中应写明 ID 语义、最大 outstanding、是否支持窄传输和独占访问、复位要求,这些信息是互联配置和软件驱动共同依赖的契约;接口契约文档与 RTL 同版本维护,很多集成期的扯皮其实是契约缺失造成的,把契约写清楚比事后解释波形便宜得多,也让新加入项目的工程师能快速对齐系统边界,降低长期维护成本与沟通损耗,使协议正确性在团队层面可持续。
常见坑对照
| 坑 | 后果 | 正确做法 |
|---|---|---|
| VALID 组合等 READY | 死锁 | VALID 寄存器置起、信号先稳 |
| 发一笔等一笔 | 带宽极低 | outstanding 拉满 |
| 同 ID 期待乱序 | 数据错乱 | 不同流用不同 ID |
| 突发跨 4KB | 从机越界 | 软件/描述符按 4KB 切 |
| 不查 DECERR | 地址悬空难定位 | 检查地址映射/响应 |
| B 每拍等一个 | 协议误解 | 每笔突发只一个 BRESP |
| 无协议检查上板 | 挂死查不到 | VIP/checker 进仿真 |
相关与延伸
概览:AXI4 完整协议与互联;互联:AXI 互联设计。 应用:DMA 搬运、Zynq HP/AXI DMA。
一句话总结
AXI4 五通道(读地址/读数据、写地址/写数据/写响应)全部 VALID/READY 握手,铁律是 VALID 置起后信号必须保持到握手、且不能组合依赖 READY 成环(互等即死锁)。高性能靠两点:AxID 线程标签(同 ID 保序、不同 ID 允许乱序完成,多流并行飞行、响应按 ID 匹配)和 outstanding 深度(多笔未完成事务填满'带宽×延迟'的管道,DDR 场景 16~64)。突发规则:不跨 4KB、AxSIZE 对齐且 ≤总线宽、INCR/WRAP/FIXER 按场景、WSTRB 做字节选通、写响应 B 每笔突发仅一次;RRESP/BRESP 中 SLVERR 是从机报错、DECERR 是地址没接设备。协议违规仿真常不报错而上板挂死——务必用 AXI VIP/protocol checker 断言,ILA 抓五通道看'谁不握手/响应回没回/ID 对不对'。