3. AXI突发传输:突发长度、突发大小、突发类型

AXI总线里最核心的概念,我觉得就是突发传输了。说白了,就是一次握手,连续传一堆数据。为什么要这么设计?你想想看,如果每次传一个数据都要走一遍地址握手,那效率得多低啊。我刚开始接触AXI时,就被这个突发机制搞得有点晕,后来亲手调了几个IP,才算真正搞明白。

3.1 突发长度(Burst Length)

突发长度,就是一次突发里要传多少个数据。用专业的话说,是ARLEN或AWLEN信号决定的。注意啊,这个值是「长度减1」。比如你想传16个数据,那LEN就要设成15。

关键点:突发长度范围是1到256。但有个限制——如果是INCR类型,且数据位宽超过128位,那最大长度只能到16。我当年第一次做DMA控制器时就踩了这个坑,仿真怎么都跑不过,查了半天协议才发现这个限制。

传输类型 最大突发长度 说明
INCR 256 数据位宽≤128位时
INCR 16 数据位宽>128位时
FIXED 16 固定地址,长度受限
WRAP 16 回环边界限制

3.2 突发大小(Burst Size)

突发大小指的是每次传输的字节数,由ARSIZE或AWSIZE控制。这个值是个3位信号,编码方式如下:

  • 3'b000:1字节(8位)
  • 3'b001:2字节(16位)
  • 3'b010:4字节(32位)
  • 3'b011:8字节(64位)
  • 3'b100:16字节(128位)
  • 3'b101~3'b111:保留,别用

我个人习惯,做图像处理加速时,数据位宽通常是64位或128位。比如处理一个像素是32位的RGB图像,我一般设SIZE为4字节,这样一拍就能传一个像素,逻辑清晰。

小技巧:突发大小不能超过数据总线的位宽。比如你的数据总线是32位,那SIZE最大只能设4字节。这个在RTL设计时很容易忽略,我建议在地址通道加个断言检查。

3.3 突发类型(Burst Type)

AXI定义了三种突发类型,由ARBURST或AWBURST控制。嗯,这里要重点讲,因为很多新人会搞混。

3.3.1 FIXED(固定地址)

每次传输都访问同一个地址。说白了,就是往同一个位置反复写数据。什么时候用?比如配置寄存器,或者FIFO操作。我做过一个视频缩放模块,就用FIXED类型往系数寄存器写滤波参数。

// FIXED突发示例
// 地址0x1000,写4次,每次写同一个地址
AWADDR  = 0x1000
AWLEN   = 3      // 4次传输
AWSIZE  = 2      // 4字节
AWBURST = 2'b00  // FIXED
// 数据:D0→0x1000, D1→0x1000, D2→0x1000, D3→0x1000

3.3.2 INCR(递增地址)

这是最常用的类型。每次传输后,地址自动增加一个SIZE。比如你从内存里读一帧图像,用INCR就对了。地址计算很简单:

// INCR突发地址计算
// 起始地址:0x2000,SIZE=4字节,LEN=7(8次传输)
// 地址序列:
// Beat 0: 0x2000
// Beat 1: 0x2004
// Beat 2: 0x2008
// ...
// Beat 7: 0x201C

我在项目中遇到过一个问题:用INCR读DDR时,如果起始地址没对齐到SIZE的整数倍,性能会暴跌。后来我强制让DMA的起始地址做对齐,带宽直接翻了一倍。

3.3.3 WRAP(回环地址)

这个稍微复杂点。WRAP类型会在一个地址范围内循环,到了边界就跳回起始地址。它主要用于Cache Line的读写,或者一些环形缓冲区的操作。

WRAP的边界计算规则:

  • 边界地址 = INT(起始地址 / (SIZE × LEN)) × (SIZE × LEN)
  • 地址范围:[边界地址, 边界地址 + SIZE × LEN - 1]

注意:WRAP突发要求起始地址必须对齐到SIZE × LEN的整数倍。我曾经在调试一个图像旋转加速器时,因为地址没对齐,WRAP行为完全乱掉了,数据错位得一塌糊涂。后来加了个地址对齐模块才解决。

3.4 地址对齐规则

地址对齐,说白了就是起始地址必须是SIZE的整数倍。比如SIZE=4字节,那地址最低2位必须是0。这个规则在AXI协议里是强制的,不对齐的传输虽然协议允许,但性能会打折扣。

我总结了一个对齐检查表:

SIZE(字节) 地址对齐要求 地址最低有效位
1 任意地址 无要求
2 2字节对齐 addr[0] = 0
4 4字节对齐 addr[1:0] = 00
8 8字节对齐 addr[2:0] = 000
16 16字节对齐 addr[3:0] = 0000

实战经验:做图像处理时,我通常把图像的行宽对齐到64字节。这样不管是INCR还是WRAP,地址计算都简单,而且DDR的带宽利用率最高。你想想看,如果每行末尾有几个字节没对齐,那下一行的起始地址就乱了,整个加速器的流水线都得等。

3.5 突发传输的完整流程

一个完整的AXI突发传输,分三个阶段:地址通道、数据通道、响应通道。我画了个流程图,帮你理清关系:

AXI突发传输完整流程 主控(Master) 从设备(Slave) 阶段1:地址通道(AW/AR) • 起始地址(ADDR) • 突发长度(LEN) • 突发大小(SIZE) • 突发类型(BURST) 阶段2:数据通道(W/R) • 数据(WDATA/RDATA) • 字节选通(WSTRB) • 最后标志(WLAST/RLAST) • 就绪/有效握手(READY/VALID) 阶段3:响应通道(B/RESP) • 写响应(BRESP)或读数据(含RDATA) 三个阶段依次进行,但数据通道可以流水线化

这个图把突发传输的三个阶段串起来了。你注意看,地址通道先发,然后数据通道开始传数据,最后从设备给响应。实际设计中,数据通道是可以流水线操作的——也就是地址还没传完,数据就可以开始发了。我优化图像加速器时,就是靠这个流水线特性把吞吐量提上去的。

避坑指南:我曾经在写一个AXI Slave时,忘了处理WLAST信号。结果主控发了16个数据,我这边只收了15个就停了,整个总线直接死锁。从那以后,我设计任何AXI接口都会先检查WLAST和RLAST的时序。

好了,关于AXI突发传输的核心内容就这些。突发长度、突发大小、突发类型这三个参数,加上地址对齐规则,是理解AXI总线的基础。你把这些搞清楚了,后面做图像处理加速时,设计DMA和地址生成器就会顺手很多。

一句话总结:突发传输就是一次地址握手,连续传一批数据。长度决定传多少,大小决定每拍传多少,类型决定地址怎么变。对齐规则是性能的关键,千万别忽视。

可可精品资料库