4. AXI传输特性:突发传输、乱序传输与交织传输

大家好,我是老李。做AXI总线这么多年,我见过太多工程师在传输特性上栽跟头了。今天咱们就聊聊AXI的三个核心传输特性——突发传输、乱序传输和交织传输。这三个概念,说白了就是AXI高性能的三大法宝。

我个人习惯把这三个特性比作快递系统:突发传输是批量发货,乱序传输是不同包裹走不同路线,交织传输则是多个快递员同时派送。这么一想,是不是就清晰多了?

AXI传输特性知识体系 AXI 传输特性 突发传输 Burst Transfer 乱序传输 Out-of-Order 交织传输 Interleaving • 地址连续 • 数据节拍 • 传输大小 • ID标识 • 重排序缓冲 • 多事务并发 • 数据交错 • 通道利用率

4.1 突发传输:批量发货的艺术

突发传输是AXI最基础也最重要的特性。你想想看,如果每次只传一个数据,那地址通道的利用率得多低啊?突发传输允许我们一次性发送一个起始地址,然后连续传输多个数据。

核心要点:突发传输通过一次地址握手,完成多个数据的传输。地址只发一次,数据连续发送。

我记得在做一个视频处理芯片时,DDR控制器需要连续读取一帧图像数据。如果用单次传输,每个数据都要发一次地址,那效率简直不敢想。用了突发传输后,带宽利用率直接提升了4倍。

AXI支持三种突发类型:

  • FIXED(固定地址):每次传输都访问同一个地址。这个用得少,但做FIFO操作时很实用。
  • INCR(递增地址):地址依次递增。这是最常用的模式,比如读内存数组。
  • WRAP(回环地址):地址递增到边界后回绕。做Cache Line填充时特别香。

突发长度由ARLEN/AWLEN信号控制,范围是1到16个节拍。嗯,这里要注意,突发长度是编码值,实际传输次数是ARLEN+1。

// 突发传输示例:连续读取4个32位数据
// 地址从0x1000开始,递增模式
assign ARADDR  = 32'h1000;
assign ARLEN   = 3'd3;      // 4次传输(3+1)
assign ARSIZE  = 3'b010;    // 4字节(32位)
assign ARBURST = 2'b01;     // INCR模式

// 数据通道会依次返回:
// R1: 0x1000 的数据
// R2: 0x1004 的数据  
// R3: 0x1008 的数据
// R4: 0x100C 的数据

实战小技巧:我在项目中习惯把突发长度设为8或16,这样既能充分利用总线带宽,又不会让从设备缓冲区压力太大。突发长度太大,从设备可能撑不住。

4.2 乱序传输:谁说先来的一定先到?

乱序传输,说白了就是允许后面的请求先完成。为什么会这样?因为不同的从设备响应速度不一样啊。

我曾经调试过一个SoC,CPU发起了两个读请求:一个读低速外设(比如UART),一个读高速内存。如果必须按顺序返回,CPU得等UART读完才能拿到内存数据,这多浪费啊!

乱序传输通过AXI ID机制实现:

  • 每个事务都有唯一的ID标识
  • 相同ID的事务必须按顺序完成
  • 不同ID的事务可以乱序完成

关键设计原则:乱序传输只发生在不同ID之间。相同ID的事务,必须保持顺序。这是AXI协议的铁律。

你想想看,如果乱序没有限制,那设计就乱套了。比如写数据,如果两个写操作针对同一个地址,顺序乱了数据就错了。所以AXI用ID来分组,同组内保序,不同组间可以乱序。

场景 ID分配 是否乱序
CPU读指令 ID=0 保序
CPU读数据 ID=1 保序
DMA传输 ID=2 可乱序
GPU纹理加载 ID=3 可乱序

避坑指南:我曾经在一个项目中,把不同master的ID设成了相同的值,结果乱序功能完全失效,性能掉了一半。后来查了三天才发现是ID冲突了。记住:不同master必须用不同的ID,否则乱序就白搭了。

4.3 交织传输:多线程的威力

交织传输,说白了就是多个事务的数据在数据通道上交错传输。这有点像操作系统的多线程——一个线程等I/O时,另一个线程可以继续执行。

我刚开始接触AXI时,总觉得交织传输和乱序传输是一回事。后来做项目才明白,两者完全不同:

  • 乱序传输:事务完成的顺序可以打乱
  • 交织传输:数据在通道上交错发送,但每个事务内部的数据还是有序的

举个例子:假设有两个读事务,每个事务需要读4个数据。没有交织时,必须等事务A的4个数据全部返回,才能开始事务B的数据。有了交织,可以A0、B0、A1、B1这样交错返回。

性能提升:交织传输能显著提高数据通道利用率。特别是当从设备有多个bank时,交错访问可以隐藏bank切换延迟。

AXI协议通过RID和WID信号来区分不同事务的数据。每个数据节拍都携带ID信息,这样接收端就能知道这个数据属于哪个事务。

// 交织传输示例:两个读事务交错返回
// 事务A: ID=0, 读地址0x1000, 长度4
// 事务B: ID=1, 读地址0x2000, 长度4

// 数据通道可能出现的顺序:
// 时钟1: RID=0, RDATA=数据A0
// 时钟2: RID=1, RDATA=数据B0
// 时钟3: RID=0, RDATA=数据A1
// 时钟4: RID=1, RDATA=数据B1
// 时钟5: RID=0, RDATA=数据A2
// 时钟6: RID=1, RDATA=数据B2
// 时钟7: RID=0, RDATA=数据A3
// 时钟8: RID=1, RDATA=数据B3

设计建议:我一般建议在互联结构中支持至少4个未完成事务。太少发挥不了交织优势,太多又增加硬件复杂度。4-8个是比较合理的范围。

4.4 三个特性的协同工作

这三个特性不是孤立的,它们一起构成了AXI高性能的基石。我画个简单的场景:

假设一个GPU需要从DDR加载纹理数据:

  1. 突发传输:一次突发读64字节,正好是一个Cache Line
  2. 乱序传输:同时发起多个纹理请求,哪个先准备好就先返回哪个
  3. 交织传输:多个纹理的数据在总线上交错传输,不让总线闲着

你想想看,如果只用突发传输,虽然单次效率高了,但多个请求还是得排队。加上乱序和交织,整个系统的吞吐量能翻好几倍。

注意:不是所有场景都适合用这三个特性。比如控制寄存器访问,用单次传输就够了,用突发反而增加复杂度。我见过有人对配置寄存器也用突发传输,结果地址越界把系统搞挂了。嗯,设计时要根据实际需求来选。

好了,关于AXI的三个传输特性就聊到这儿。记住:突发传输提效率,乱序传输降延迟,交织传输提带宽。三者配合,才能发挥AXI的真正实力。

一句话总结:突发传输是批量处理,乱序传输是灵活调度,交织传输是并行流水。用好这三板斧,你的AXI设计就成功了一大半。

可可精品资料库