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,主设备就能识别这是哪个请求的回应。
乱序传输的好处很明显:
- 提高总线利用率——慢设备不阻塞快设备
- 降低延迟——响应快的请求优先处理
- 支持多通道并行——不同从设备可以同时响应
但坑也不少。我曾经设计一个多主设备互联的Crossbar,ID分配没规划好,结果两个主设备用了相同的ID,数据全乱套了。避坑指南:每个主设备分配独立的ID高位,低位留给内部事务区分。
4.3 交织传输(Interleaving)—— 数据包的交叉流水
交织传输,说白了就是多个突发传输的数据可以交错着传。注意,这和乱序不一样——乱序是不同事务的数据可以乱序返回,而交织是同一个事务内的数据都可以交错。
举个例子:主设备发了两个突发,突发A有4笔数据,突发B有4笔数据。交织传输允许这样返回:A0, B0, A1, B1, A2, B2, A3, B3。
AXI协议对交织有限制:
- 交织深度不能超过4(协议建议值)
- 从设备必须支持交织,主设备可以选择是否使用
- 交织的数据必须保持各自突发的顺序
4.4 三种机制的对比与选择
这三种机制不是互斥的,它们可以同时使用。我画了一张图来展示它们的关系:
从图中可以看出,这三种机制是层层递进的。突发是基础,乱序和交织是在突发之上的优化手段。
4.5 实战中的选择策略
在实际项目中,怎么选?我总结了几条经验:
| 应用场景 | 突发 | 乱序 | 交织 | 说明 |
|---|---|---|---|---|
| DDR控制器 | ✅ 必选 | ✅ 推荐 | ❌ 不推荐 | DDR本身有行缓冲,乱序能提高命中率 |
| SRAM接口 | ✅ 可选 | ❌ 不需要 | ❌ 不需要 | SRAM延迟低,乱序收益不大 |
| PCIe桥接 | ✅ 必选 | ✅ 必选 | ✅ 可选 | PCIe本身支持乱序,AXI侧需要匹配 |
| 低功耗IoT | ✅ 可选 | ❌ 关闭 | ❌ 关闭 | 减少逻辑翻转,降低动态功耗 |
4.6 避坑指南
最后,分享几个我踩过的坑:
- ID复用问题:多个主设备用相同ID,导致数据交叉错乱。解决方案:每个主设备分配独立ID高位。
- 交织深度过大:从设备缓冲区不够,导致数据丢失。我曾经把交织深度设为8,结果从设备只支持4,仿真没问题,上板就挂。
- WRAP地址计算错误:WRAP的地址边界是突发大小×突发长度,不是随便设的。我见过有人把WRAP边界设成16字节,但突发大小是8字节,结果地址回绕点算错了。
- 乱序与保序混淆:同一个ID的事务必须保序,不同ID可以乱序。这个规则一定要记清楚。
嗯,今天就讲到这里。这三种机制是AXI总线设计的基石,理解了它们,后面的互联设计、性能优化就好办了。