4. AXI传输特性:突发传输、乱序传输与交织传输
大家好,我是老李。做AXI总线这么多年,我见过太多工程师在传输特性上栽跟头了。今天咱们就聊聊AXI的三个核心传输特性——突发传输、乱序传输和交织传输。这三个概念,说白了就是AXI高性能的三大法宝。
我个人习惯把这三个特性比作快递系统:突发传输是批量发货,乱序传输是不同包裹走不同路线,交织传输则是多个快递员同时派送。这么一想,是不是就清晰多了?
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加载纹理数据:
- 突发传输:一次突发读64字节,正好是一个Cache Line
- 乱序传输:同时发起多个纹理请求,哪个先准备好就先返回哪个
- 交织传输:多个纹理的数据在总线上交错传输,不让总线闲着
你想想看,如果只用突发传输,虽然单次效率高了,但多个请求还是得排队。加上乱序和交织,整个系统的吞吐量能翻好几倍。
注意:不是所有场景都适合用这三个特性。比如控制寄存器访问,用单次传输就够了,用突发反而增加复杂度。我见过有人对配置寄存器也用突发传输,结果地址越界把系统搞挂了。嗯,设计时要根据实际需求来选。
好了,关于AXI的三个传输特性就聊到这儿。记住:突发传输提效率,乱序传输降延迟,交织传输提带宽。三者配合,才能发挥AXI的真正实力。
一句话总结:突发传输是批量处理,乱序传输是灵活调度,交织传输是并行流水。用好这三板斧,你的AXI设计就成功了一大半。
可可精品资料库