2. AXI协议基础回顾

好,咱们正式开始聊AXI协议。说实话,每次带新人做项目,我都要花不少时间讲这块。不是因为它难,而是因为它太灵活了。灵活到很多人一开始会懵。

AXI协议,说白了就是一套主设备和从设备之间怎么“说话”的规则。ARM公司搞出来的,现在基本是片上互连的事实标准。我个人习惯把它理解成一套“高速公路系统”——有独立的车道、有交通规则、还能支持多辆车同时跑。

2.1 五个独立的通道

AXI最核心的设计思想,就是通道分离。它把读写操作拆成了五个独立的通道:

  • 读地址通道(AR):主设备告诉从设备“我要读哪里”
  • 读数据通道(R):从设备把数据送回来
  • 写地址通道(AW):主设备告诉从设备“我要写哪里”
  • 写数据通道(W):主设备把数据发过去
  • 写响应通道(B):从设备回复“写完了,没问题”

你想想看,读和写是分开的通道,地址和数据也是分开的。这意味着什么?意味着读操作和写操作可以同时进行,互不干扰。我在一个项目中遇到过,有人把读地址和写地址混在一起处理,结果死锁了整整两天。嗯,通道分离这个设计,就是为了避免这种混乱。

关键点:每个通道都是单向的。读数据通道只能从设备到主设备,写数据通道只能从主设备到从设备。方向搞反了,协议就崩了。

2.2 握手信号:VALID和READY

每个通道的传输,都靠一对握手信号来控制:VALID 和 READY。

  • VALID:发送方说“我准备好了,数据/地址有效”
  • READY:接收方说“我准备好了,可以接收”

只有两者同时为高,传输才算完成。这有点像两个人握手——一个人伸手不够,两个人都伸手才算握上。

握手有三种情况:

  1. VALID先来,READY后来:发送方先准备好,等接收方。最常见的情况。
  2. READY先来,VALID后来:接收方先准备好,等发送方。从设备可以提前声明“我随时能收”。
  3. 同时有效:一拍搞定,效率最高。

我的经验:设计从设备时,我建议尽量让READY信号早一点拉高。别等数据到了才准备,那样会拖慢整个系统。我曾经见过一个DMA控制器,因为READY信号总是晚一拍,导致带宽直接砍半。

2.3 突发传输:一次说清楚要传多少

AXI支持突发传输(Burst)。什么意思呢?就是主设备发一次地址,然后连续传多笔数据。

突发传输有三个关键参数:

参数含义说明
AxLEN突发长度一次突发传多少笔数据。注意:实际笔数 = AxLEN + 1
AxSIZE数据宽度每笔数据多少字节。比如3表示8字节(64位)
AxBURST突发类型FIXED(固定地址)、INCR(递增地址)、WRAP(回环)

举个例子:

// 一次读突发:地址0x1000,长度4,宽度4字节(32位)
// 实际传输:
// 地址0x1000 -> 数据0x12345678
// 地址0x1004 -> 数据0x9ABCDEF0
// 地址0x1008 -> 数据0x11223344
// 地址0x100C -> 数据0x55667788

我个人最常用的是INCR类型,地址自动递增,适合连续内存访问。WRAP类型在Cache line fill时很常见,比如从地址0x100C开始,长度4,宽度4字节,地址会回环到0x1000。嗯,这个在CPU的Cache控制器里经常见到。

避坑指南:我曾经在一个项目中,把AxLEN设成了0,以为这样只传一笔。结果协议规定AxLEN=0就是传1笔,没问题。但有人设成了1,以为传1笔,结果传了2笔。记住:实际笔数 = AxLEN + 1。这个坑我踩过,你别踩。

2.4 乱序传输:ID标签的妙用

AXI最强大的特性之一,就是乱序传输(Out-of-Order)。

为什么需要乱序?你想想看,主设备发了两个读请求:读地址A和读地址B。如果从设备是一个DDR控制器,读A需要先打开行,读B正好在另一行。如果严格按顺序来,读B必须等读A完成。但如果允许乱序,读B可以先返回,效率就高多了。

AXI用ID标签来实现乱序。每个事务都有一个ID,从设备返回数据时带上相同的ID,主设备就知道这笔数据对应哪个请求。

关键规则:

  • 同一ID的事务必须保序:如果你用ID=0发了两个读请求,返回时第一个必须比第二个先回来。
  • 不同ID的事务可以乱序:ID=0和ID=1的请求,返回顺序可以任意。
  • 写响应也同理:写请求的ID决定了写响应回来的顺序。

实际应用:我做过一个多主设备系统,CPU、GPU、DSP都挂在同一个互连网络上。每个主设备分配不同的ID范围,这样它们的请求可以互相穿插,互连网络可以自由调度。系统吞吐量提升了30%以上。

2.5 知识体系总览

下面这张图,是我自己总结的AXI协议核心逻辑。你看一眼,基本就明白这几个概念怎么串起来了。

AXI协议核心知识体系 主设备 (Master) 从设备 (Slave) 读地址通道 (AR) 读数据通道 (R) 写地址通道 (AW) 写数据通道 (W) 写响应通道 (B) 三大核心机制 握手协议 VALID + READY 两者同时为高才传输 突发传输 AxLEN / AxSIZE / AxBURST 一次地址,多笔数据 乱序传输 ID标签区分事务 同ID保序,异ID乱序 五个独立通道 + 三种核心机制 = AXI互连的基础

这张图把AXI的骨架画出来了。五个通道是“路”,握手是“交通规则”,突发是“车队”,乱序是“多车道超车”。你把这个逻辑理清了,后面讲互连网络、QoS、一致性协议,都会轻松很多。

一个小建议:刚开始学AXI,别急着看细节。先把通道、握手、突发、乱序这四个概念刻在脑子里。我每次带新人,都让他们先画这张图,画熟了再碰代码。基础不牢,后面全是坑。