4、AXI传输特性:突发传输(Burst)、乱序传输(Out-of-Order)、交织传输(Interleaving)

好,咱们今天聊点硬核的。AXI总线的三个核心传输特性——突发、乱序、交织。这三个东西,说白了就是决定你的总线“跑得快不快”、“堵不堵车”、“能不能多任务并行”。我做了这么多年芯片,见过太多设计在这上面栽跟头。咱们一个一个掰开揉碎了讲。

4.1 突发传输(Burst)—— 一次握手,一串数据

先说说突发传输。这是AXI最基础、也最常用的特性。你想想看,如果没有突发,每次传输一个数据都要走一遍完整的地址握手流程,那效率得多低?

突发传输的核心思想:主设备只需要发送一次地址,然后连续传输多个数据。地址只占一个时钟周期,剩下的时间全用来传数据。

关键信号:

  • ARLEN / AWLEN:突发长度,表示一次突发传输多少个数据。注意,实际传输数量是 ARLEN + 1。
  • ARSIZE / AWSIZE:每个数据的字节数。比如2表示4字节,3表示8字节。
  • ARBURST / AWBURST:突发类型。固定地址(FIXED)、递增地址(INCR)、回绕地址(WRAP)。

我个人习惯,在设计DMA控制器或者高性能加速器时,优先使用INCR类型。为什么?因为大多数场景下,数据在内存中是连续存放的。INCR类型每次传输后地址自动加1,省心省力。

举个例子,你要从内存读取一个256字节的数据块,数据总线宽度是64位(8字节)。那么:

AWADDR   = 0x1000_0000
AWLEN    = 31   // 实际传输32个数据
AWSIZE   = 3    // 8字节(2^3 = 8)
AWBURST  = 1    // INCR类型

这样,一次突发就把256字节全搞定了。地址从0x1000_0000开始,每次增加8,直到0x1000_00F8。

避坑指南:我曾经在一个项目中,把AWLEN设成了32,结果发现只传了32个数据,但预期是33个。后来才意识到,AWLEN=0表示传1个数据,AWLEN=31表示传32个。这个“+1”的坑,新手必踩。

4.2 乱序传输(Out-of-Order)—— 谁先准备好谁先走

乱序传输,这是AXI协议的精髓之一。很多初学者不理解:为什么要有乱序?顺序执行不是更简单吗?

嗯,这里要注意。在复杂的SoC系统中,多个主设备同时访问多个从设备,如果必须按顺序返回数据,那性能会大打折扣。你想想看,一个慢速的从设备(比如SPI Flash)拖住了整个总线,其他快速设备(比如DDR控制器)只能干等着,这合理吗?

乱序传输的实现机制:每个事务都有一个ID标签。主设备发送事务时带上ID,从设备返回数据时也带上相同的ID。这样,即使事务返回的顺序和发送的顺序不同,主设备也能通过ID识别出哪个数据属于哪个事务。

ID标签的作用:

  • 主设备可以同时发出多个不同ID的事务
  • 从设备可以按任意顺序返回这些事务的数据
  • 主设备根据ID重新排序,恢复原始顺序

我记得有一次调试一个视频处理芯片,发现总线利用率只有30%左右。排查了很久,最后发现是ID分配出了问题——所有事务都用同一个ID,导致从设备必须按顺序返回,慢速外设成了瓶颈。改成多ID后,利用率直接飙到85%。

重要提醒:乱序传输虽然好,但也不是没有代价。从设备需要额外的缓冲区来暂存乱序返回的数据,主设备也需要重排序逻辑。如果你的系统对延迟不敏感,或者从设备响应时间很一致,那用顺序传输反而更简单。

4.3 交织传输(Interleaving)—— 数据包的“插花”艺术

交织传输,说白了就是乱序传输的“加强版”。乱序传输允许不同事务的数据乱序返回,但每个事务内部的数据还是顺序的。而交织传输更进一步——它允许不同事务的数据交错在一起返回。

举个例子:主设备发出了两个读事务,事务A要读4个数据,事务B要读4个数据。在交织传输下,返回顺序可能是:

A0, B0, A1, B1, A2, B2, A3, B3

而不是:

A0, A1, A2, A3, B0, B1, B2, B3

为什么会这样?因为从设备内部可能有多个存储体(bank),每个bank可以独立响应。如果事务A和事务B分别访问不同的bank,那交织传输可以最大化利用bank的并行性。

实战经验:我在设计DDR控制器时,就充分利用了交织传输。DDR内部有多个bank,每个bank的激活和预充电需要时间。通过交织传输,我可以让一个bank在预充电的同时,另一个bank正在传输数据。这样,DDR的带宽利用率从60%提升到了95%以上。

不过,交织传输对从设备的设计要求很高。从设备必须能够同时跟踪多个事务的进度,并且能够灵活地切换数据源。这需要大量的状态机和缓冲区。

4.4 三种特性的对比与选择

说了这么多,咱们来总结一下。这三种特性不是互斥的,而是可以组合使用的。我画了一张图,帮你理清它们的关系:

AXI传输特性关系图 突发传输 一次地址,多次数据 提高总线利用率 减少地址握手开销 乱序传输 不同事务乱序返回 ID标签识别事务 提高多从设备效率 交织传输 数据交错返回 最大化并行性 对从设备要求高 三种特性可以组合使用,实现最佳性能 典型组合:突发 + 乱序 + 交织 主设备发出多个突发事务,每个事务带不同ID 从设备按ID乱序返回,数据在事务间交织传输

在实际设计中,我建议你这样选择:

场景 推荐特性 原因
连续内存访问(如DMA) 突发传输 地址连续,一次突发搞定
多主设备访问多从设备 突发 + 乱序 避免慢速设备拖累快速设备
高性能DDR控制器 突发 + 乱序 + 交织 最大化bank并行性
简单外设(如GPIO) 单次传输 没必要用突发,增加复杂度

注意:不要为了用特性而用特性。如果你的从设备不支持乱序或交织,强行使用会导致协议错误。我曾经见过一个设计,主设备发出了乱序请求,但从设备是简单的SRAM控制器,根本不支持乱序,结果数据全乱了。调试了整整两天才找到问题。

好了,关于AXI的三种传输特性,咱们就聊到这里。记住一句话:突发是基础,乱序提效率,交织榨性能。具体怎么用,还得看你的系统需求。下一章咱们聊聊互联结构,那个更有意思。

核心要点回顾:

  • 突发传输:一次地址,多次数据,减少握手开销
  • 乱序传输:不同事务可乱序返回,通过ID识别
  • 交织传输:数据在事务间交错,最大化并行性
  • 三种特性可组合使用,但需考虑从设备能力
可可精品资料库