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 四种传输类型的对比

为了让大家更直观地理解这四种传输类型的区别,我画了一张图:

AXI四种传输类型对比 突发传输 连续传输多个数据 固定地址传输 地址不变,数据变化 非对齐传输 任意地址起始 原子访问 不可中断的操作 特性 • 突发长度1-256 • 三种突发类型 • 地址自动递增 • 适合大数据传输 • 带宽利用率高 特性 • 地址保持不变 • 适合FIFO操作 • 寄存器访问 • 状态查询 • 控制寄存器 特性 • 任意起始地址 • 使用WSTRB控制 • 字节级粒度 • 灵活的数据访问 • 兼容对齐访问 特性 • 不可中断 • 多核同步 • 信号量操作 • 互斥锁 • 需要硬件支持

从这张图可以看出,每种传输类型都有它擅长的领域。突发传输适合大数据块传输,固定地址传输适合FIFO和寄存器,非对齐传输提供了灵活性,原子访问则保证了数据一致性。

4.6 实际应用中的选择建议

说了这么多,到底什么时候该用哪种传输类型?我给大家一些实际建议:

  1. 内存拷贝:用INCR突发,长度设大一点(比如16或32),效率最高
  2. FIFO读写:用FIXED突发,地址固定,数据连续
  3. 数据包处理:可能需要非对齐传输,因为包结构不一定对齐
  4. 多核同步:用原子访问,保证数据一致性

个人经验:我一般会先评估从设备的能力。如果从设备支持长突发,我就用长突发;如果不支持,就拆成短突发。另外,非对齐传输虽然灵活,但会降低效率。能对齐就尽量对齐。

好了,这四种传输类型就讲到这里。每种类型都有它的设计哲学,理解了它们,你就能更好地设计AXI互连系统。

可可精品资料库