2. AXI协议基础回顾
好,咱们正式开始聊AXI协议。说实话,每次带新人做项目,我都要花不少时间讲这块。不是因为它难,而是因为它太灵活了。灵活到很多人一开始会懵。
AXI协议,说白了就是一套主设备和从设备之间怎么“说话”的规则。ARM公司搞出来的,现在基本是片上互连的事实标准。我个人习惯把它理解成一套“高速公路系统”——有独立的车道、有交通规则、还能支持多辆车同时跑。
2.1 五个独立的通道
AXI最核心的设计思想,就是通道分离。它把读写操作拆成了五个独立的通道:
- 读地址通道(AR):主设备告诉从设备“我要读哪里”
- 读数据通道(R):从设备把数据送回来
- 写地址通道(AW):主设备告诉从设备“我要写哪里”
- 写数据通道(W):主设备把数据发过去
- 写响应通道(B):从设备回复“写完了,没问题”
你想想看,读和写是分开的通道,地址和数据也是分开的。这意味着什么?意味着读操作和写操作可以同时进行,互不干扰。我在一个项目中遇到过,有人把读地址和写地址混在一起处理,结果死锁了整整两天。嗯,通道分离这个设计,就是为了避免这种混乱。
关键点:每个通道都是单向的。读数据通道只能从设备到主设备,写数据通道只能从主设备到从设备。方向搞反了,协议就崩了。
2.2 握手信号:VALID和READY
每个通道的传输,都靠一对握手信号来控制:VALID 和 READY。
- VALID:发送方说“我准备好了,数据/地址有效”
- READY:接收方说“我准备好了,可以接收”
只有两者同时为高,传输才算完成。这有点像两个人握手——一个人伸手不够,两个人都伸手才算握上。
握手有三种情况:
- VALID先来,READY后来:发送方先准备好,等接收方。最常见的情况。
- READY先来,VALID后来:接收方先准备好,等发送方。从设备可以提前声明“我随时能收”。
- 同时有效:一拍搞定,效率最高。
我的经验:设计从设备时,我建议尽量让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的骨架画出来了。五个通道是“路”,握手是“交通规则”,突发是“车队”,乱序是“多车道超车”。你把这个逻辑理清了,后面讲互连网络、QoS、一致性协议,都会轻松很多。
一个小建议:刚开始学AXI,别急着看细节。先把通道、握手、突发、乱序这四个概念刻在脑子里。我每次带新人,都让他们先画这张图,画熟了再碰代码。基础不牢,后面全是坑。