3、AXI传输事务:突发传输、乱序传输、交织传输

大家好,我是你们的芯片架构设计讲师。今天我们来聊聊AXI总线里最核心的几个概念——突发传输、乱序传输和交织传输。说实话,这几个概念刚接触时容易搞混,但搞懂了它们,你基本就掌握了AXI的精髓。

我个人习惯把AXI的传输事务想象成一个快递系统。地址是快递单号,数据是包裹本身。地址通道和数据通道是两条独立的流水线,这设计太巧妙了——你想想看,快递单可以提前寄出,包裹可以分批到达,甚至不同订单的包裹可以混在一起运输。

3.1 突发传输(Burst)

突发传输,说白了就是一次地址请求,连续传输多个数据。我在项目中遇到过不少新手,总喜欢把连续地址的读写拆成单次传输,结果带宽利用率惨不忍睹。

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

  • AxLEN:突发长度,表示一次突发传输多少个数据节拍(beat)。比如AxLEN=3,就是传4个数据(从0开始计数)。
  • AxSIZE:每个数据节拍的字节数。比如AxSIZE=2,就是4字节(2^2=4)。
  • AxBURST:突发类型,有FIXED、INCR、WRAP三种。

嗯,这里要注意:AxLEN是实际节拍数减1。我刚开始做设计时,总在这里栽跟头——配置AxLEN=7,以为传7个数据,结果传了8个,把后面的地址空间给踩了。

三种突发类型对比:

类型 地址变化 典型应用
FIXED 地址不变 FIFO操作、状态寄存器重复读取
INCR 地址递增 内存连续读写、DMA传输
WRAP 地址递增,到边界回绕 Cache Line填充、环形缓冲区

举个例子,一个INCR突发传输,起始地址0x1000,AxLEN=3,AxSIZE=2(4字节):

地址序列:0x1000 → 0x1004 → 0x1008 → 0x100C
数据通道:D0 → D1 → D2 → D3

我曾经调试过一个DMA控制器,发现传输效率只有理论值的60%。查了半天,原来是软件配置的突发长度太小,每次只传2个节拍,地址通道的开销占比太大。改成16节拍后,效率直接飙到95%以上。

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

乱序传输,这是AXI最强大的特性之一。为什么需要乱序?你想想看,如果总线只能按顺序处理事务,那一个慢速设备就会堵住后面所有快速设备的请求。

AXI通过ID标签来实现乱序。每个事务都有一个ID,从设备返回的数据和响应必须携带相同的ID。主设备根据ID来匹配请求和响应。

ID管理小技巧:

我个人建议,每个主设备使用不同的ID高位,低位用于区分不同的事务。比如主设备0用ID[3:2]=00,主设备1用ID[3:2]=01。这样在互联逻辑里,解码和路由会简单很多。

乱序传输的典型场景:

  • 主设备发出读请求A(访问慢速外设)和读请求B(访问快速SRAM)
  • 请求B先完成,数据先返回
  • 请求A后完成,数据后返回
  • 主设备根据ID区分,B的数据先被处理

我在一个多核处理器项目中,遇到过乱序导致的死锁问题。两个核同时访问共享内存,ID分配不当,导致互联逻辑无法正确排序。嗯,从那以后我设计了一套严格的ID分配规则,再也没出过问题。

3.3 交织传输(Interleaving)

交织传输和乱序传输经常被混淆。我简单区分一下:

  • 乱序:整个事务的完成顺序可以打乱
  • 交织:同一个事务内的数据节拍可以和其他事务的数据节拍交错传输

说白了,交织是在更细粒度上的乱序。AXI协议允许不同事务的数据节拍在数据通道上交错传输,只要每个节拍携带正确的ID和LAST信号。

交织传输的注意事项:

我曾经在一个视频处理芯片中,为了追求极致带宽,启用了交织传输。结果发现从设备的缓冲区设计不合理,数据节拍交错后,重组逻辑变得异常复杂。最后不得不限制每个从设备只支持2个未完成事务的交织。

建议:除非带宽压力极大,否则不要轻易启用深度交织。一般设计中,2-4个事务的交织深度就足够了。

3.4 地址与数据通道的独立性

这是AXI架构的基石。地址通道和数据通道完全独立,意味着:

  • 地址请求可以连续发出,不需要等待数据返回
  • 数据通道可以同时传输多个事务的数据
  • 读地址通道和读数据通道是单向的,写地址通道和写数据通道也是单向的

我画了一张图,展示地址和数据通道的流水线关系:

AXI地址与数据通道流水线 主设备 从设备 写地址通道 (AW) 读地址通道 (AR) 读数据通道 (R) 写数据通道 (W) 写响应通道 (B) 地址阶段 数据阶段 响应阶段 地址通道独立于数据通道,支持流水线并行处理

从这张图可以看出,地址通道和数据通道是两条独立的流水线。主设备可以连续发出多个地址请求,然后从设备按顺序或乱序返回数据。这种设计让AXI总线能够达到非常高的吞吐率。

通道独立性的实际收益:

  • 地址请求可以背靠背发出,无需等待数据返回
  • 数据通道可以同时传输多个事务的数据节拍
  • 读和写可以完全并行,互不干扰
  • 支持多个未完成事务(outstanding transactions)

我记得在一个网络处理器项目中,利用通道独立性,我们实现了读和写的完全并行。写地址通道连续发出32个写请求,然后写数据通道以全速率传输数据,同时读数据通道还在返回之前读请求的数据。这种并行度,是传统总线无法想象的。

好了,这一章的内容就到这里。突发传输让你高效利用带宽,乱序传输让你避免慢速设备阻塞,交织传输让你在更细粒度上优化传输,而通道独立性则是这一切的基础。把这些概念吃透了,AXI互联设计就成功了一半。

可可精品资料库