3、AXI协议基础(二):突发传输(Burst)、乱序传输(Out-of-Order)、原子访问(Locked/Exclusive)

好,我们接着聊AXI协议。上一章我们把握手信号和通道结构理清了,这章要啃的才是真正让AXI“高级”起来的东西——突发传输、乱序传输和原子访问。

说实话,这三个特性是AXI区别于AHB、APB这类简单总线的核心。你想想看,为什么复杂SoC里非要用AXI?不就是因为它能高效处理大数据块、能容忍乱序、还能保证共享数据的一致性吗?

3.1 突发传输(Burst)——搬数据的高效姿势

突发传输,说白了就是一次地址请求,连续传多个数据。我刚开始做验证时,总觉得突发不就是多传几个beat嘛,有什么难的?直到有一次调试DDR控制器,发现地址边界没对齐,整个系统直接挂死……嗯,从那以后我再也不敢小看Burst的细节了。

3.1.1 Burst的基本三要素

每个突发传输由三个信号控制:

  • ARLEN/AWLEN:突发长度,表示一次突发中传输的数据拍数(beat数)。注意,值是长度减1。比如传4个数据,ARLEN=3。
  • ARSIZE/AWSIZE:每拍数据的字节数。2^SIZE,比如SIZE=2表示每拍4字节。
  • ARBURST/AWBURST:突发类型,决定地址如何递增。

我个人习惯把这三个信号记成“一次传多少拍、每拍多大、地址怎么跳”。

3.1.2 三种突发类型

BURST[1:0] 类型 地址计算方式 典型应用
00 FIXED 地址不变,每拍都访问同一个地址 FIFO操作、状态寄存器轮询
01 INCR 地址递增,递增步长=每拍字节数 普通内存读写、DMA传输
10 WRAP 地址递增,到边界后回绕 Cache line fill、SDRAM行访问
11 保留 — —

避坑指南:我曾经在项目中遇到一个bug,WRAP突发的地址边界计算错了。WRAP的边界是:起始地址对齐到(突发长度 × 每拍字节数)。比如4拍、每拍4字节,边界就是16字节对齐。如果起始地址是0x04,那传完0x04、0x08、0x0C后,下一拍会回绕到0x00,而不是0x10。这个回绕逻辑,很多新手会搞混。

3.1.3 地址对齐的坑

AXI要求起始地址必须对齐到每拍字节数。比如ARSIZE=3(8字节),起始地址必须是8字节对齐的。如果没对齐,从机可以返回SLVERR。

但注意,突发长度和地址对齐没有直接关系。你可以起始地址0x00,传3拍,每拍4字节——这是合法的。地址分别是0x00、0x04、0x08。

3.2 乱序传输(Out-of-Order)——谁说先发的一定先到?

乱序传输是AXI最强大的特性之一,也是验证中最容易出bug的地方。

为什么会需要乱序?你想想看,一个总线master发了一堆读请求,有的去DDR(延迟大),有的去片上SRAM(延迟小)。如果非要按顺序返回,那SRAM的数据得等DDR的数据回来才能被master拿到,这不是浪费性能吗?

AXI的做法是:给每个事务分配一个ID标签。从机返回数据时带上这个ID,master根据ID把数据重新排序。

3.2.1 ID标签的作用

  • ARID/AWID:写事务和读事务的ID,宽度由设计者定义,通常4~8位。
  • RID/WID:响应通道返回的ID,必须与请求ID一致。
  • 同一ID的事务必须保序:如果master用同一个ID发了两个读请求,从机必须按顺序返回。
  • 不同ID的事务可以乱序:ID不同,返回顺序随意。

我的经验:在验证乱序传输时,我建议至少用3个不同的ID来测试。一个ID模拟高优先级(比如CPU的cache line fill),一个ID模拟低优先级(比如DMA的后台搬运),还有一个ID用来测试ID保序性。我曾经见过一个设计,从机对不同ID的请求处理没问题,但同一个ID内部乱序了——这其实是协议违规,但仿真很难发现,因为数据内容碰巧是对的。

3.2.2 乱序带来的验证挑战

乱序传输让验证变得复杂,主要体现在:

  • 数据顺序不确定:你不能假设R通道的数据顺序和AR通道的请求顺序一致。
  • 响应顺序不确定:BRESP和RRESP的返回顺序也可能乱。
  • ID管理:master必须能同时跟踪多个未完成的事务。

我个人习惯在验证环境中加一个“重排序检查器”,它会记录每个发出请求的ID和地址,然后在响应通道根据ID重新排序,再检查数据是否正确。这个检查器虽然写起来麻烦,但能抓到很多隐蔽的bug。

3.3 原子访问(Locked/Exclusive)——共享数据的保护伞

原子访问,说白了就是“读-改-写”这个操作不能被中断。在多核系统里,两个CPU同时修改同一个内存变量,如果没有原子操作,数据就乱套了。

AXI支持两种原子访问机制:Locked访问和Exclusive访问。

3.3.1 Locked访问(已过时,但还在用)

Locked访问通过ARLOCK/AWLOCK信号实现。当LOCK=1时,表示这是一个锁定的事务序列。

工作原理:

  1. Master发出一个Locked读请求。
  2. 从机收到后,锁定该地址区域,其他master无法访问。
  3. Master发出Locked写请求,修改数据。
  4. 从机解锁。

注意:Locked访问有个大问题——它阻塞了总线。在Locked期间,其他所有master都不能访问被锁定的从机。这会导致严重的性能下降。所以ARM在AMBA 4中已经弃用了Locked访问,推荐使用Exclusive访问。但很多老IP还在用,你遇到时要知道怎么处理。

3.3.2 Exclusive访问(推荐方式)

Exclusive访问不阻塞总线,而是通过“监视”机制来保证原子性。它使用ARLOCK/AWLOCK信号,但编码不同:

  • ARLOCK=00 / AWLOCK=00:普通访问
  • ARLOCK=01 / AWLOCK=01:Exclusive访问
  • ARLOCK=10 / AWLOCK=10:Locked访问
  • ARLOCK=11 / AWLOCK=11:保留

Exclusive访问的典型流程:

  1. Master发出Exclusive读请求(ARLOCK=01)。
  2. 从机返回数据,并在内部标记该地址为“被监视”。
  3. Master修改数据(在本地完成)。
  4. Master发出Exclusive写请求(AWLOCK=01),带上修改后的数据。
  5. 从机检查该地址是否被其他master修改过:
    • 如果没被修改,写成功,返回EXOKAY响应。
    • 如果被修改了,写失败,返回OKAY响应(注意不是EXOKAY)。
  6. Master检查响应,如果失败则重试整个操作。

关键点:Exclusive访问的响应信号是RRESP和BRESP。成功时返回EXOKAY(resp=01),失败时返回OKAY(resp=00)。很多新手以为Exclusive访问一定会成功,其实不是——它只是保证“要么全部成功,要么全部失败”,不会出现部分修改的情况。

3.3.3 Exclusive Monitor的实现

Exclusive Monitor是负责跟踪“被监视地址”的硬件模块。它通常位于:

  • 从机内部:每个支持Exclusive的从机都有自己的Monitor。
  • 系统级:对于跨多个从机的Exclusive操作,需要全局Monitor。

Monitor的核心是一个状态机:

  • IDLE:空闲状态,没有地址被监视。
  • EXCLUSIVE:某个地址被Exclusive读标记,等待Exclusive写。
  • 如果收到其他master对该地址的写操作,Monitor清除标记,后续的Exclusive写会失败。

我曾经在项目中遇到一个bug:两个CPU核同时对一个共享变量做Exclusive访问,但Monitor只跟踪了地址,没跟踪master ID。结果CPU A的Exclusive读被CPU B的写破坏了,但CPU B的Exclusive写却成功了——因为Monitor认为地址没被修改(其实是CPU A的读标记被清除了,但CPU B不知道)。这个bug查了我整整两天,最后发现是Monitor设计时没考虑多master场景。

3.4 本章小结

突发传输、乱序传输和原子访问,这三个特性构成了AXI协议的核心竞争力。突发传输解决的是“怎么高效搬数据”,乱序传输解决的是“怎么容忍延迟差异”,原子访问解决的是“怎么保证数据一致性”。

在实际项目中,这三个特性往往是组合使用的。比如一个DMA控制器,它可能同时发出多个不同ID的突发读请求,然后乱序接收数据,最后通过Exclusive访问来更新描述符。你想想看,如果没有AXI的这些机制,要实现同样的功能,得费多大劲?

嗯,这章的内容就到这。下一章我们会深入AXI的“高级特性”——QoS、低功耗接口和调试接口。但那是后话了,先把这章的基础打牢。

AXI协议基础(二):三大核心特性 突发传输 Burst Transfer • 突发长度(LEN) • 突发大小(SIZE) • 突发类型(BURST) FIXED / INCR / WRAP 地址对齐是关键 乱序传输 Out-of-Order • ID标签机制 • 同ID保序 • 不同ID可乱序 • 重排序检查 验证中最易出bug 原子访问 Atomic Access • Locked访问(已过时) • Exclusive访问(推荐) • Exclusive Monitor • EXOKAY / OKAY响应 多核数据一致性保障 三者协同工作 突发传输 → 高效搬数据 乱序传输 → 容忍延迟差异 原子访问 → 保证数据一致性 典型应用场景:DMA控制器 多ID突发请求 → 乱序接收数据 → Exclusive更新描述符 没有AXI,实现同样功能要费很大劲