4. AXI传输机制:突发传输、乱序传输与交织传输

各位同学,今天我们来聊聊AXI总线里最核心的三个传输机制。说实话,这三个概念刚接触时容易搞混,但它们在真实项目中天天见。我个人习惯把这三者比作「快递发货」——突发传输是批量发货,乱序传输是不同订单混着发,交织传输则是把一个大包裹拆成小包交错发。咱们一个一个拆开讲。

4.1 突发传输(Burst)—— 批量搬运的艺术

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

AXI的突发传输有三大要素:

  • 突发长度(Burst Length):一次突发传几个数据。1~16笔,固定长度。
  • 突发大小(Burst Size):每笔数据多少字节。1、2、4、8字节等。
  • 突发类型(Burst Type):地址怎么变。FIXED、INCR、WRAP三种。

我在项目中遇到过一个问题:某次DMA控制器配置了INCR突发,但地址边界没对齐,结果总线直接报错。嗯,这里要注意——INCR突发的地址不能跨4KB边界,这是AXI协议的硬性规定。

核心公式:
突发总字节数 = 突发长度 × 突发大小
地址范围 = [起始地址, 起始地址 + 总字节数 - 1]

举个实际例子:

// 配置:突发长度=4,突发大小=4字节(32位),INCR类型
// 起始地址:0x1000
// 传输的数据地址依次为:
// 0x1000, 0x1004, 0x1008, 0x100C
// 总共传输 4 × 4 = 16 字节

WRAP类型比较特殊,常用于Cache Line填充。它会在地址到达边界后回绕。我曾经调试过一个Cache控制器,WRAP地址算错了,结果数据全写到了错误的位置——那次排查花了我整整两天。

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

乱序传输,很多人一听就头大。其实没那么复杂。你想想,总线发出去多个请求,有的去DDR,有的去SRAM,DDR慢SRAM快,难道非要等DDR的回来才能处理SRAM的?

AXI用ID标签来实现乱序。每个事务都有一个ID,从设备返回数据时带上相同的ID,主设备就能识别这是哪个请求的回应。

我的经验:ID位数决定了乱序深度。比如4位ID,最多支持16个未完成事务。但要注意,同一个ID的事务必须按顺序返回——这是协议规定的。

乱序传输的好处很明显:

  • 提高总线利用率——慢设备不阻塞快设备
  • 降低延迟——响应快的请求优先处理
  • 支持多通道并行——不同从设备可以同时响应

但坑也不少。我曾经设计一个多主设备互联的Crossbar,ID分配没规划好,结果两个主设备用了相同的ID,数据全乱套了。避坑指南:每个主设备分配独立的ID高位,低位留给内部事务区分。

4.3 交织传输(Interleaving)—— 数据包的交叉流水

交织传输,说白了就是多个突发传输的数据可以交错着传。注意,这和乱序不一样——乱序是不同事务的数据可以乱序返回,而交织是同一个事务内的数据都可以交错。

举个例子:主设备发了两个突发,突发A有4笔数据,突发B有4笔数据。交织传输允许这样返回:A0, B0, A1, B1, A2, B2, A3, B3。

AXI协议对交织有限制:

  • 交织深度不能超过4(协议建议值)
  • 从设备必须支持交织,主设备可以选择是否使用
  • 交织的数据必须保持各自突发的顺序
注意:交织传输对从设备的设计要求很高。你需要为每个突发维护一个独立的缓冲区。我在一个项目中为了省面积,把交织深度设成了1(即禁止交织),结果性能测试没通过,最后不得不改设计。

4.4 三种机制的对比与选择

这三种机制不是互斥的,它们可以同时使用。我画了一张图来展示它们的关系:

AXI传输机制关系图 主设备 从设备 AXI 总线 支持突发、乱序、交织 突发传输 • 一次地址,多笔数据 • 类型:FIXED/INCR/WRAP • 不可跨4KB边界 乱序传输 • 不同ID可乱序返回 • 同ID必须保序 • 提高总线利用率 交织传输 • 数据交错传输 • 交织深度≤4 • 需独立缓冲区 设计建议 • 高性能场景:同时启用突发+乱序+交织 • 低功耗场景:仅用突发,关闭乱序和交织

从图中可以看出,这三种机制是层层递进的。突发是基础,乱序和交织是在突发之上的优化手段。

4.5 实战中的选择策略

在实际项目中,怎么选?我总结了几条经验:

应用场景 突发 乱序 交织 说明
DDR控制器 ✅ 必选 ✅ 推荐 ❌ 不推荐 DDR本身有行缓冲,乱序能提高命中率
SRAM接口 ✅ 可选 ❌ 不需要 ❌ 不需要 SRAM延迟低,乱序收益不大
PCIe桥接 ✅ 必选 ✅ 必选 ✅ 可选 PCIe本身支持乱序,AXI侧需要匹配
低功耗IoT ✅ 可选 ❌ 关闭 ❌ 关闭 减少逻辑翻转,降低动态功耗
我的建议:刚开始设计时,先把突发传输调通。乱序和交织是锦上添花,不是雪中送炭。我曾经在一个项目里一上来就搞乱序,结果调试了三个月才发现是ID分配的问题——如果先从简单的突发开始,两周就能搞定。

4.6 避坑指南

最后,分享几个我踩过的坑:

  • ID复用问题:多个主设备用相同ID,导致数据交叉错乱。解决方案:每个主设备分配独立ID高位。
  • 交织深度过大:从设备缓冲区不够,导致数据丢失。我曾经把交织深度设为8,结果从设备只支持4,仿真没问题,上板就挂。
  • WRAP地址计算错误:WRAP的地址边界是突发大小×突发长度,不是随便设的。我见过有人把WRAP边界设成16字节,但突发大小是8字节,结果地址回绕点算错了。
  • 乱序与保序混淆:同一个ID的事务必须保序,不同ID可以乱序。这个规则一定要记清楚。

嗯,今天就讲到这里。这三种机制是AXI总线设计的基石,理解了它们,后面的互联设计、性能优化就好办了。

可可精品资料库