2. AXI通道与握手:读地址通道、读数据通道、写地址通道、写数据通道、写响应通道,VALID/READY握手协议详解
好,咱们今天聊聊AXI总线最核心的东西——通道和握手。
说实话,我刚接触AXI的时候,被这五个通道搞得有点晕。读地址、读数据、写地址、写数据、写响应,五个通道各司其职。你想想看,这就像一条高速公路,有专门的车道给不同方向的车流。搞清楚了,其实没那么复杂。
2.1 五个通道,各管一摊
AXI协议把一次传输拆成了独立的通道。为什么这么设计?说白了就是为了并行。读操作和写操作可以同时进行,互不干扰。
我给大家列个表,一目了然:
| 通道名称 | 方向 | 传输内容 |
|---|---|---|
| 读地址通道(AR) | 主机→从机 | 读请求的地址、长度、大小等控制信息 |
| 读数据通道(R) | 从机→主机 | 读回来的数据,以及读响应状态 |
| 写地址通道(AW) | 主机→从机 | 写请求的地址、长度、大小等控制信息 |
| 写数据通道(W) | 主机→从机 | 要写出去的数据,每拍带字节使能 |
| 写响应通道(B) | 从机→主机 | 写操作完成后的状态反馈 |
这里有个细节我提醒一下:读数据通道里其实包含了响应信号(RRESP),而写操作是单独用一个写响应通道(B通道)来返回状态的。为什么?因为写数据可能分多拍发送,等所有数据都写完了,从机才给你一个统一的答复。嗯,这个设计挺合理的。
2.2 VALID/READY握手,核心中的核心
每个通道的传输都靠一对握手信号:VALID和READY。
- VALID:发送方说「我准备好了,数据有效」
- READY:接收方说「我准备好了,可以接收」
只有两者同时为高,数据才算真正传输成功。这个握手规则,我建议你刻在脑子里。
握手有三种情况:
- VALID先有效,READY后有效:发送方先准备好,等接收方。这是最常见的情况。
- READY先有效,VALID后有效:接收方提前说「我随时可以收」,发送方准备好后一拍就传过去了。
- 同时有效:一拍搞定,效率最高。
我在项目中遇到过一种情况:从机READY信号拉得太晚,导致主机一直等,整个总线性能掉了一大截。后来查了半天,发现是从机内部仲裁逻辑太复杂了。所以啊,READY信号能早拉就早拉,别藏着掖着。
核心规则:VALID信号不能依赖READY信号。也就是说,发送方一旦把VALID拉高,就必须保持到握手成功。而READY信号可以等VALID来了再拉,也可以提前拉。
2.3 读操作通道时序
读操作涉及两个通道:读地址(AR)和读数据(R)。
流程是这样的:
- 主机通过AR通道发送读地址和控制信息
- 从机收到后,开始准备数据
- 从机通过R通道把数据返回给主机
这里有个关键点:读数据通道可以支持乱序返回。什么意思?就是主机发了多个读请求,从机可以先返回后面的数据,再返回前面的。当然,这需要ARID和RID来匹配。
我给大家画个简单的时序图:
时钟 : __| |__| |__| |__| |__| |__| |__
ARVALID: ______| |______________________
ARREADY: ____________| |______________________
ARADDR : XXXXXX<Addr0>__XXXXXXXXXXXXXXXXXXXXXX
RVALID : ____________________| |________
RREADY : ________________________| |__________
RDATA : XXXXXXXXXXXXXXXXXXXXXX<Data0>XXXXXXXX
你看,AR通道握手成功后,过了几拍,R通道才开始传数据。这个延迟就是从机的访问时间。
个人经验:设计读操作时,我习惯把RVALID和RREADY的握手逻辑单独拿出来仿真。因为读数据通道的时序往往决定了整个系统的瓶颈。我曾经在一个图像处理加速器里,就是因为读数据通道的握手没处理好,导致帧率上不去。
2.4 写操作通道时序
写操作涉及三个通道:写地址(AW)、写数据(W)、写响应(B)。
流程:
- 主机通过AW通道发送写地址
- 主机通过W通道发送要写的数据
- 从机接收数据并完成写入
- 从机通过B通道返回写响应
注意,AW和W通道是独立的。也就是说,地址和数据可以同时发送,也可以地址先发、数据后发,或者反过来。但有个约束:从机必须保证收到地址和数据后,才能完成写操作并返回响应。
写数据通道有个特殊信号——WLAST。它告诉从机「这是最后一笔数据了」。从机看到WLAST后,就知道可以准备返回写响应了。
时钟 : __| |__| |__| |__| |__| |__| |__
AWVALID: ______| |______________________
AWREADY: ____________| |______________________
AWADDR : XXXXXX<Addr0>__XXXXXXXXXXXXXXXXXXXXXX
WVALID : ______| |______________________
WREADY : ____________| |______________________
WDATA : XXXXXX<Data0>__XXXXXXXXXXXXXXXXXXXXXX
WLAST : ______| |______________________
BVALID : ____________________________| |_
BREADY : __________________________________| |_
BRESP : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<OKAY>XX
避坑指南:我曾经犯过一个错误——写数据通道的WVALID和WLAST没有对齐。从机收到WLAST时,对应的数据还没传完,结果从机提前返回了写响应,导致数据丢失。记住,WLAST必须和最后一笔数据的WVALID同时有效。
2.5 握手依赖关系,别搞反了
五个通道之间是有依赖关系的,但不是你想的那种串行依赖。
- 读操作:AR通道握手成功后,从机才开始准备R通道的数据。但R通道的握手不依赖AR通道的READY信号。
- 写操作:从机必须同时收到地址(AW通道)和所有数据(W通道,包括WLAST)后,才能返回写响应(B通道)。但AW和W通道之间没有先后顺序要求。
说白了,地址通道和数据通道是并行的,但响应通道必须等数据通道结束。
我给大家画个依赖关系图:
读操作:
AR通道握手成功 ──→ 从机准备数据 ──→ R通道握手成功
写操作:
AW通道握手成功 ──┐
├──→ 从机完成写入 ──→ B通道握手成功
W通道握手成功 ────┘
(需包含WLAST)
2.6 实际设计中的注意事项
嗯,这里我总结几个实际项目中容易踩的坑:
- VALID不能等READY:这是硬性规定。发送方一旦有数据,就应该把VALID拉高,不能等READY来了再拉。否则可能造成死锁。
- READY可以提前拉:接收方如果随时能收数据,可以把READY一直拉高。这样发送方数据一来就能传,效率最高。
- 小心背靠背传输:连续传输时,上一笔数据握手成功后,下一笔的VALID和READY可能已经准备好了。这时候要保证数据在同一个时钟沿完成传输。
- 写响应不能丢:主机必须确保每个写操作都能收到B通道的响应。如果漏了,你可能永远不知道数据有没有写成功。
我的建议:刚开始设计AXI接口时,先把单通道的握手逻辑调通。一个通道一个通道来,别想着五个通道一起上。等每个通道的握手都稳了,再把它们组合起来。这样出问题了也好定位。
好了,这一章的内容就到这儿。五个通道、VALID/READY握手,这些是AXI总线的基础。搞懂了这些,后面的内容就好办了。
小技巧:调试AXI接口时,我习惯用波形查看器同时观察VALID和READY信号。如果看到VALID一直高但READY一直低,那八成是从机卡住了。反过来,READY一直高但VALID一直低,那就是主机还没准备好数据。
可可精品资料库