4、AXI传输特性:突发传输(Burst)、地址对齐与非对齐传输、窄传输(Narrow Transfer)、未定义长度传输

各位同学,今天我们来啃一块硬骨头——AXI的传输特性。说实话,这部分内容刚接触时容易让人头大,但一旦搞明白,你写起总线逻辑来会顺手很多。我在项目中调试过不少AXI相关的bug,很多问题都出在对这些传输特性的理解不到位上。

4.1 突发传输(Burst)—— 一次握手,批量搬运

突发传输是AXI最核心的特性之一。说白了,就是主机只需要发一次地址,然后连续传输多个数据。你想想看,如果每传一个数据都要重新发一次地址,那效率得多低?

突发传输由三个关键信号控制:

  • ARLEN/AWLEN:突发长度,表示一次突发中传输的数据个数减1。比如值为3,表示传4个数据。
  • ARSIZE/AWSIZE:每次传输的字节数,用2的幂表示。比如3表示8字节。
  • ARBURST/AWBURST:突发类型,决定地址如何递增。

突发类型有三种,我习惯用一张表来对比记忆:

BURST值 类型 地址变化规则 典型应用
00 FIXED(固定地址) 地址不变 反复读写同一个寄存器
01 INCR(递增地址) 地址 = 起始地址 + N × 数据宽度 内存连续读写
10 WRAP(回环地址) 地址递增,到边界后回绕 Cache line填充

我个人最常用的是INCR类型。比如从DDR中搬一段数据,用INCR突发一次传16个64位数据,效率非常高。我曾经遇到过一个性能瓶颈,就是因为突发长度设得太小,每次只传4个数据,结果总线利用率不到30%。改成16个数据后,直接飙到85%以上。

重要提示:突发传输不能跨越4KB边界。这是AXI协议的一个硬性规定。为什么?因为4KB是内存保护页的典型大小,跨越边界可能导致访问权限问题。

4.2 地址对齐与非对齐传输

地址对齐,简单说就是传输的起始地址正好是数据宽度的整数倍。比如传8字节数据,起始地址是0x1000,那就是对齐的。如果起始地址是0x1001,那就是非对齐。

AXI协议本身是支持非对齐传输的。但要注意,非对齐传输会带来额外的开销。为什么?因为底层总线可能要把一次非对齐访问拆成多次对齐访问。

举个例子:

// 假设数据宽度为8字节(64位)
// 对齐传输:起始地址0x1000,传8字节
// 一次完成,效率高

// 非对齐传输:起始地址0x1002,传8字节
// 实际需要两次传输:
// 第一次:从0x1000读6字节(实际只需要从0x1002开始的6字节)
// 第二次:从0x1008读2字节
// 然后拼接成8字节数据

我在项目中遇到过这样一个坑:某个IP核的DMA控制器配置错了起始地址,导致每次读写都是非对齐的。结果系统性能直接腰斩。查了两天才找到原因,嗯,从那以后我写地址对齐检查代码时格外小心。

避坑指南:我曾经因为非对齐传输导致数据错位,排查了整整三天。后来发现是软件传过来的地址没有做对齐处理。建议大家在设计时,如果性能要求高,尽量保证地址对齐。如果实在无法对齐,要确保从设备能正确处理非对齐传输。

4.3 窄传输(Narrow Transfer)

窄传输,就是实际传输的数据宽度小于总线数据宽度。比如总线是64位宽的,但你只传8位数据。这时候就需要用到WSTRB(写选通信号)来指示哪些字节是有效的。

WSTRB的每一位对应一个字节。比如:

  • WSTRB = 4'b0001:只有第0字节有效
  • WSTRB = 4'b0011:第0和第1字节有效
  • WSTRB = 4'b1111:所有4个字节都有效

窄传输在寄存器访问中很常见。比如一个32位的寄存器,你只想修改其中8位,就可以用窄传输配合WSTRB来实现。

你想想看,如果没有窄传输,每次写寄存器都要传32位数据,那多浪费带宽?

个人经验:我建议在设计从设备时,一定要正确处理WSTRB信号。很多新手容易忽略这一点,结果导致写数据时把不该修改的字节也给改了。我曾经见过一个bug,就是因为从设备没检查WSTRB,导致写一个8位寄存器时把相邻的寄存器也覆盖了。

4.4 未定义长度传输

未定义长度传输,说白了就是传输长度在开始时不固定,由从设备决定什么时候结束。这在AXI中是通过设置ARLEN/AWLEN为全1(即长度255)来实现的。

但说实话,我在实际项目中很少用到未定义长度传输。为什么?因为大多数场景下,主机在发起传输时就知道要传多少数据。而且未定义长度传输对从设备的要求比较高,需要从设备能动态控制传输结束。

不过有一种情况例外——某些特殊的外设,比如FIFO接口。当FIFO中的数据量不确定时,用未定义长度传输就比较合适。主机一直读,直到FIFO空了,从设备就结束传输。

我记得有一次调试一个视频处理芯片,就是用未定义长度传输来读取视频行数据。因为每行像素数不固定,用固定长度反而麻烦。

重要提示:未定义长度传输只支持INCR突发类型。而且从设备必须能正确处理RLAST/WLAST信号,否则会导致总线死锁。

知识体系总览

下面这张图总结了本章的核心知识点,我画成了流程图,方便大家理解各个传输特性之间的关系:

AXI传输特性知识体系 AXI传输特性 突发传输 (Burst) 地址对齐/非对齐 窄传输 (Narrow) 未定义长度传输 FIXED/INCR/WRAP 4KB边界限制 对齐:高效 非对齐:开销大 WSTRB选通 节省带宽 长度255 从设备控制结束 理解这些特性,是掌握AXI总线设计的基础

这张图把四个核心特性以及它们的子知识点都串起来了。我个人建议你把它保存下来,做设计时对照着看,能少走不少弯路。

好了,这一章的内容就到这里。记住,突发传输提升效率,地址对齐减少开销,窄传输灵活访问,未定义长度应对不确定场景。把这四点吃透了,AXI总线设计你就入门了。

可可精品资料库