4. AXI传输类型:突发传输、固定地址传输、非对齐传输、原子访问
各位同学,今天我们来聊聊AXI总线里最核心的几个传输类型。说实话,我刚接触AXI的时候,被这些概念绕得有点晕。但后来在实际项目中踩过几次坑,才真正理解了它们的设计意图。
AXI协议支持四种主要的传输类型:突发传输、固定地址传输、非对齐传输和原子访问。每种类型都有它特定的应用场景。咱们一个一个来看。
4.1 突发传输(Burst Transfer)
突发传输是AXI最常用的传输方式。说白了,就是一次发起传输请求,然后连续传输多个数据。我习惯把它想象成「快递小哥一次送一整箱货,而不是一趟一趟跑」。
突发传输有三个关键参数:
- ARLEN/AWLEN:突发长度,表示一次突发传输多少个数据。注意,这个值是「长度-1」。比如你要传4个数据,这个值就是3。
- ARSIZE/AWSIZE:数据宽度,单位是字节。比如32位总线,SIZE就是2(2^2=4字节)。
- ARBURST/AWBURST:突发类型,有FIXED、INCR、WRAP三种。
我在项目中遇到过一个问题:某次DMA传输大量数据,突发长度设成了256。结果从设备根本处理不过来,直接挂死。后来我查了协议才发现,AXI3最大支持16次突发,AXI4才支持到256次。嗯,这里要注意,不是所有从设备都支持长突发。
突发类型速查表
| BURST[1:0] | 类型 | 地址变化 | 典型应用 |
|---|---|---|---|
| 00 | FIXED | 地址不变 | FIFO操作 |
| 01 | INCR | 地址递增 | 内存读写 |
| 10 | WRAP | 地址回环 | Cache line fill |
| 11 | 保留 | - | 不使用 |
4.2 固定地址传输(Fixed Address Transfer)
固定地址传输,就是每次传输都访问同一个地址。你想想看,什么场景下会需要这样?对,FIFO操作、状态寄存器读写。
我记得有一次调试一个网络加速器,它的描述符队列就是用FIFO实现的。主机通过固定地址传输往FIFO里写数据,每次写地址都一样,但数据被依次推入队列。这种场景下,FIXED突发类型就特别合适。
固定地址传输的特点:
- 地址通道只发送一次地址
- 每次传输都使用相同的地址
- 从设备内部自己管理地址指针
小技巧:如果你要访问的寄存器地址是固定的,用FIXED突发比用INCR突发效率高。因为地址通道只需要发送一次地址,节省了总线带宽。
4.3 非对齐传输(Unaligned Transfer)
非对齐传输,说白了就是访问的起始地址不是数据宽度的整数倍。比如32位总线上,你从地址0x03开始读4个字节。这在很多协议里是不允许的,但AXI支持。
为什么会需要非对齐传输?我举个例子:你在处理一个网络数据包,包头从地址0x00开始,但数据载荷从地址0x03开始。如果AXI不支持非对齐传输,你就得先读对齐的数据,再手动移位拼接。麻烦不说,还容易出错。
AXI处理非对齐传输的方式:
- 使用WSTRB/RSTRB信号来指示哪些字节有效
- 地址通道发送的地址是实际起始地址
- 从设备根据地址和SIZE自动处理对齐
避坑指南:我曾经在一个项目中,从设备没有正确处理非对齐传输。结果每次非对齐读,返回的数据都是错的。排查了两天才发现,是从设备的地址译码逻辑没考虑非对齐情况。所以,如果你自己设计从设备,一定要处理好非对齐场景。
4.4 原子访问(Atomic Access)
原子访问,是AXI里比较高级的特性。它保证了一组操作要么全部完成,要么全部不完成,不会被其他总线事务打断。
原子访问有两种:
- 原子加载-链接(Load-Linked):先读一个地址,然后检查这个地址是否被修改过
- 原子存储-条件(Store-Conditional):只有地址没被修改过,才执行写操作
我记得在做一个多核处理器项目时,需要实现自旋锁。如果用普通的读写操作,两个核同时抢锁就会出问题。后来用了AXI的原子访问,锁的获取和释放就变得安全了。
原子访问的典型应用场景:
- 多核同步
- 信号量操作
- 互斥锁实现
- 共享资源保护
重要提示:原子访问需要从设备支持。不是所有从设备都实现了原子操作。在设计系统时,要确认你的从设备是否支持原子访问,否则会出现不可预期的行为。
4.5 四种传输类型的对比
为了让大家更直观地理解这四种传输类型的区别,我画了一张图:
从这张图可以看出,每种传输类型都有它擅长的领域。突发传输适合大数据块传输,固定地址传输适合FIFO和寄存器,非对齐传输提供了灵活性,原子访问则保证了数据一致性。
4.6 实际应用中的选择建议
说了这么多,到底什么时候该用哪种传输类型?我给大家一些实际建议:
- 内存拷贝:用INCR突发,长度设大一点(比如16或32),效率最高
- FIFO读写:用FIXED突发,地址固定,数据连续
- 数据包处理:可能需要非对齐传输,因为包结构不一定对齐
- 多核同步:用原子访问,保证数据一致性
个人经验:我一般会先评估从设备的能力。如果从设备支持长突发,我就用长突发;如果不支持,就拆成短突发。另外,非对齐传输虽然灵活,但会降低效率。能对齐就尽量对齐。
好了,这四种传输类型就讲到这里。每种类型都有它的设计哲学,理解了它们,你就能更好地设计AXI互连系统。
可可精品资料库