3、AXI传输事务:突发传输、地址对齐与非对齐传输、窄传输、未定义长度传输
大家好,我是你们的FPGA讲师。今天我们来啃一块硬骨头——AXI的传输事务。说实话,这部分内容在项目中踩坑率极高。我见过不少工程师,协议背得滚瓜烂熟,一上板子就抓瞎。为什么?因为理论跟实际波形之间,隔着一层窗户纸。今天我们就来捅破它。
3.1 突发传输(Burst)—— 批量搬运的核心
突发传输,说白了就是一次握手,连续搬砖。你想想看,如果每次只传一个数据,都要重新走一遍地址握手,那效率得多低?AXI的突发传输,就是让你只给一次起始地址,然后连续传多个数据。
我个人习惯把突发传输比作「快递车」。地址是目的地,数据是包裹。普通传输是一辆车送一个包裹,送完回来再装下一个。突发传输呢?一车装满,一次出发,沿途按地址递增卸货。效率高下立判。
突发传输有三个关键参数,我建议你刻在脑子里:
- ARLEN/AWLEN:突发长度。注意,这个值是「长度-1」。比如你要传4个数据,这里写3。我在项目中第一次用的时候就被坑过,写了个4,结果传了5个出去,总线直接挂掉。
- ARSIZE/AWSIZE:每次传输的字节数。3'b011表示8字节,3'b010表示4字节。这个跟数据总线宽度有关,别乱设。
- ARBURST/AWBURST:突发类型。2'b00是固定地址(FIXED),2'b01是递增(INCR),2'b10是回绕(WRAP)。
核心公式:突发传输的总字节数 = (ARLEN+1) × (2^ARSIZE)
举个例子:ARLEN=3(传4个),ARSIZE=3'b010(4字节),总字节数 = 4 × 4 = 16字节。
嗯,这里要注意:INCR类型是最常用的,地址依次递增。WRAP类型主要用于Cache Line,地址到了边界会回绕。FIXED类型嘛,所有数据都打在同一个地址上,我只有在配置寄存器时才用。
3.2 地址对齐与非对齐传输
这个问题,我敢说90%的新手都搞不清楚。什么叫对齐?简单说,就是传输的起始地址,能不能被传输宽度整除。
举个例子:数据总线是32位(4字节),ARSIZE=3'b010(4字节)。如果起始地址是0x00,那就是对齐的。如果起始地址是0x01,那就是非对齐的。
我曾经在一个视频处理项目中,DMA从DDR搬数据,地址没对齐,结果性能直接腰斩。为什么?因为非对齐传输,总线控制器要额外做拆分和拼接,多花好几个周期。
AXI协议本身是支持非对齐传输的。但支持归支持,性能损失是实打实的。我建议你:能对齐就对齐,别给自己找麻烦。
| 起始地址 | ARSIZE | 是否对齐 | 实际行为 |
|---|---|---|---|
| 0x00 | 4字节 | ✅ 对齐 | 一次传输完成 |
| 0x01 | 4字节 | ❌ 非对齐 | 拆成两次传输 |
| 0x02 | 4字节 | ❌ 非对齐 | 拆成两次传输 |
| 0x04 | 4字节 | ✅ 对齐 | 一次传输完成 |
你看这个表就明白了。非对齐传输,底层其实是被拆成多个对齐传输来完成的。只不过协议帮你封装好了,你看不到而已。
3.3 窄传输(Narrow Transfer)
窄传输,就是数据宽度小于总线宽度。比如总线是64位,但你只想传8位数据。这时候就要用到WSTRB(写选通信号)了。
WSTRB是一个位掩码,每一位对应一个字节。比如WSTRB=4'b0001,表示只写最低字节。WSTRB=4'b0011,表示写最低两个字节。
我记得有一次调试一个PCIe的AXI桥接,从设备返回的数据总是错位。查了三天,最后发现是WSTRB没处理好。从设备只支持32位传输,但主机发了个16位的窄传输,WSTRB只置了低两位,结果数据被放到了错误的字节通道上。
避坑指南:我曾经在Zynq上做过一个项目,PS端通过AXI_HP口访问PL端的BRAM。PS端发了一个窄传输,WSTRB=4'b0010,结果PL端的BRAM控制器没处理WSTRB,直接把整个32位都写了。数据全乱套了。
所以,如果你在PL端实现Slave,一定要检查WSTRB。别偷懒。
3.4 未定义长度传输
这个特性,说实话,我在实际项目中几乎没用过。但面试的时候经常被问到,所以还是得讲一讲。
未定义长度传输,就是突发长度不确定。主机通过拉低BVALID来告诉从机:「我还没传完,别急。」从机通过拉低RVALID来回应:「好的,我等着。」
为什么会有这个特性?我猜是为了应对一些实时性要求高的场景。比如视频流,数据源源不断,你事先不知道有多少帧。但AXI4已经废弃了这个特性,改为固定长度突发。所以,如果你用的是AXI4,直接忽略未定义长度传输就好。
嗯,这里要补充一句:AXI3是支持未定义长度传输的。如果你还在维护老项目,可能会遇到。但新设计,我建议直接用AXI4,省心。
3.5 知识体系总览
说了这么多,我们来画个图,把今天的内容串起来。这张图是我自己总结的,每次带新人我都会画一遍。
这张图把今天的内容都串起来了。你看,核心就是三个参数(长度、大小、类型),然后围绕它们展开对齐、窄传输这些概念。未定义长度传输是个历史遗留问题,知道就行。
我的个人建议:刚开始学AXI,别急着背协议。先搭一个简单的Master和Slave,用Vivado的ILA抓波形。亲眼看看突发传输的地址是怎么递增的,WSTRB是怎么变化的。看懂了波形,协议自然就理解了。
我当年就是这么学的。第一次看到INCR突发的地址从0x00跳到0x04再到0x08,那种「原来如此」的感觉,至今难忘。
好了,这一章的内容就到这里。记住:突发传输是AXI的灵魂,地址对齐是性能的关键,WSTRB是窄传输的命门。把这三点吃透了,后面学起来就轻松了。