3. AXI传输机制:突发传输、乱序传输、交织传输与原子访问

大家好,我是你们的芯片设计老司机。今天咱们聊聊AXI总线里最核心的几个传输机制。说实话,我刚入行那会儿,光看协议文档看得头大——什么突发、乱序、交织、独占访问,一堆术语堆在一起。后来在实际项目中踩过几次坑,才真正搞明白这些机制到底是怎么回事。

嗯,咱们一个一个来拆解。

3.1 突发传输(Burst)

突发传输,说白了就是一次握手,连续传一堆数据。你想想看,如果每次传一个数据都要重新走一遍地址握手,那效率得多低?

AXI的突发传输有几个关键参数:

  • AxLEN:突发长度,表示一次突发传输多少个数据节拍。注意,实际传输的数据节拍数是 AxLEN + 1。
  • AxSIZE:每个数据节拍的字节数,必须是 2 的幂次方。
  • AxBURST:突发类型,有 FIXED、INCR、WRAP 三种。

我个人习惯把突发类型记成三种场景:

突发类型 地址变化 典型应用场景
FIXED 地址不变 FIFO 操作、状态寄存器重复读取
INCR 地址递增 内存连续拷贝、DMA 传输
WRAP 地址递增,到边界回绕 Cache line fill、环形缓冲区

举个例子,一个 INCR 类型的写突发,AxLEN=3,AxSIZE=4(4字节),起始地址 0x1000:

地址序列:0x1000 → 0x1004 → 0x1008 → 0x100C
数据节拍:WDATA[0] → WDATA[1] → WDATA[2] → WDATA[3]

这里要注意,每个数据节拍都需要 WVALID 和 WREADY 握手才能完成。我曾经在调试一个 DMA 控制器时,发现从机 WREADY 拉低了一个周期,结果整个突发被卡住了——嗯,这就是典型的握手依赖问题。

小技巧: 设计从机时,如果无法在一个周期内接收所有数据,建议用 WREADY 反压来控制节奏。但要注意,一旦 WVALID 和 WREADY 同时为高,数据就锁存了,不能反悔。

3.2 乱序传输(Out-of-Order)

乱序传输,这是 AXI 协议里比较高级的特性。为什么需要乱序?你想想看,如果主设备发了两个请求:第一个去读一个慢速外设,第二个去读一个快速 SRAM。如果必须按顺序返回,那第二个请求就得等第一个完成,效率太低了。

AXI 通过 ID 标签来实现乱序。每个事务都有一个 AxID,从机返回的数据或响应必须携带相同的 ID。主设备可以根据 ID 来区分不同的事务。

我记得有一次做多主设备互联,一个主设备发了 8 个读请求,ID 分别是 0~7。结果从机返回的顺序是 3、0、7、2... 如果从机端没有按 ID 重新排序,主设备那边就乱套了。

避坑指南: 我曾经遇到过一个 bug——从机虽然支持乱序返回,但返回的 RLAST 信号位置不对,导致主设备误以为一个突发提前结束了。排查了两天才发现,是从机的状态机在乱序场景下没有正确维护每个 ID 的剩余节拍数。

乱序传输的核心规则:

  • 同一 ID 的事务必须按顺序完成
  • 不同 ID 的事务可以乱序完成
  • 写响应(B通道)也可以乱序,但同样受 ID 约束

3.3 交织传输(Interleaving)

交织传输和乱序传输有点像,但有个关键区别。乱序传输是说不同 ID 的事务可以乱序完成,而交织传输是说同一事务内的数据节拍可以被其他事务的数据节拍穿插。

说白了,交织是在数据通道层面做的。比如主设备发了两个写突发:

  • 突发 A:WDATA[0], WDATA[1], WDATA[2]
  • 突发 B:WDATA[0], WDATA[1]

如果从机支持交织,数据通道上可能出现这样的顺序:

A[0], B[0], A[1], B[1], A[2], B[2]

嗯,这里要注意,交织传输对从机的设计复杂度要求很高。从机需要为每个 ID 维护一个独立的缓冲区,来暂存交织的数据节拍。

重要: AXI4 协议中,从机可以不支持交织传输(即一次只处理一个突发的数据),但主设备必须支持从机可能不支持交织的情况。说白了,主设备不能假设从机会交织。

我个人建议,除非你的带宽要求特别高,否则从机设计时先不要支持交织。先把乱序做好,交织可以后面再优化。我在一个视频处理项目中试过交织,结果为了处理数据重排,多花了 30% 的逻辑资源。

3.4 原子访问(Locked / Exclusive)

原子访问,这是多核系统中必不可少的功能。AXI 提供了两种机制:Locked 访问和 Exclusive 访问。

3.4.1 Locked 访问

Locked 访问,也叫锁定传输。主设备通过拉高 ARLOCK 或 AWLOCK 信号,告诉互联和从机:这个事务是原子的,中间不能被其他主设备打断。

Locked 访问的典型用法:

1. 主设备发起 Locked 读(ARLOCK=1)
2. 从机返回读数据
3. 主设备发起 Locked 写(AWLOCK=1)
4. 从机返回写响应
5. 主设备解除锁定(发送一个 Normal 访问)

说实话,Locked 访问在实际设计中用得越来越少。为什么?因为它会阻塞总线,影响整体性能。而且如果主设备在锁定期间挂了,整个总线可能就死锁了。

我曾经踩过的坑: 在一个多核处理器项目中,一个核做了 Locked 访问,结果另一个核的 Cache 一致性请求被阻塞,导致系统死锁。后来我们改用 Exclusive 访问,问题就解决了。

3.4.2 Exclusive 访问

Exclusive 访问是 AXI 推荐的原子操作方式。它不需要锁定总线,而是通过监视机制来实现原子性。

Exclusive 访问的流程:

  1. 主设备发起 Exclusive 读(ARLOCK=01),从机返回数据并标记该地址为“被监视”
  2. 主设备计算新值
  3. 主设备发起 Exclusive 写(AWLOCK=01),携带相同的 ID
  4. 从机检查该地址是否被其他主设备修改过:
    • 如果没有被修改,写成功,返回 EXOKAY
    • 如果被修改了,写失败,返回 OKAY

这里的关键是,从机需要维护一个 Exclusive Monitor,记录哪些地址正在被监视。如果两个主设备同时监视同一个地址,那就需要仲裁了。

我记得在调试一个双核共享内存的场景时,两个核同时做 Exclusive 访问同一个变量,结果其中一个总是返回失败。后来发现是 Exclusive Monitor 的实现有问题——它只支持一个监视条目,第二个核的请求直接覆盖了第一个的。

设计建议: Exclusive Monitor 至少要为每个主设备维护一个独立的监视条目。如果主设备数量多,可以考虑用 CAM(内容可寻址存储器)来实现,这样查找速度快。

3.5 知识体系总览

说了这么多,咱们用一张图来总结一下 AXI 传输机制的核心逻辑:

AXI传输机制知识体系 AXI传输机制 突发传输 (Burst) 乱序传输 (OoO) 交织传输 (Interleaving) 原子访问 (Atomic) AxLEN / AxSIZE / AxBURST FIXED / INCR / WRAP ID 标签机制 同ID有序 / 异ID乱序 数据节拍穿插 ID独立缓冲区 Locked / Exclusive Exclusive Monitor 核心目标:提高总线利用率 + 保证数据一致性 乱序和交织提升带宽,原子访问保证多核安全

这张图把四个机制的关系理清楚了。突发传输是基础,乱序和交织是在此之上的优化,原子访问则是多核场景下的安全保障。

好了,这一章的内容就到这里。记住,理解这些机制最好的方式就是动手写 RTL 代码,然后在仿真中观察波形。我当年就是这么过来的——看十遍文档不如调一次波形来得深刻。

可可精品资料库