2. AXI通道与握手:读地址通道、读数据通道、写地址通道、写数据通道、写响应通道,VALID/READY握手协议详解

好,咱们今天聊聊AXI总线最核心的东西——通道和握手。

说实话,我刚接触AXI的时候,被这五个通道搞得有点晕。读地址、读数据、写地址、写数据、写响应,五个通道各司其职。你想想看,这就像一条高速公路,有专门的车道给不同方向的车流。搞清楚了,其实没那么复杂。

2.1 五个通道,各管一摊

AXI协议把一次传输拆成了独立的通道。为什么这么设计?说白了就是为了并行。读操作和写操作可以同时进行,互不干扰。

我给大家列个表,一目了然:

通道名称 方向 传输内容
读地址通道(AR) 主机→从机 读请求的地址、长度、大小等控制信息
读数据通道(R) 从机→主机 读回来的数据,以及读响应状态
写地址通道(AW) 主机→从机 写请求的地址、长度、大小等控制信息
写数据通道(W) 主机→从机 要写出去的数据,每拍带字节使能
写响应通道(B) 从机→主机 写操作完成后的状态反馈

这里有个细节我提醒一下:读数据通道里其实包含了响应信号(RRESP),而写操作是单独用一个写响应通道(B通道)来返回状态的。为什么?因为写数据可能分多拍发送,等所有数据都写完了,从机才给你一个统一的答复。嗯,这个设计挺合理的。

2.2 VALID/READY握手,核心中的核心

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

  • VALID:发送方说「我准备好了,数据有效」
  • READY:接收方说「我准备好了,可以接收」

只有两者同时为高,数据才算真正传输成功。这个握手规则,我建议你刻在脑子里。

握手有三种情况:

  1. VALID先有效,READY后有效:发送方先准备好,等接收方。这是最常见的情况。
  2. READY先有效,VALID后有效:接收方提前说「我随时可以收」,发送方准备好后一拍就传过去了。
  3. 同时有效:一拍搞定,效率最高。

我在项目中遇到过一种情况:从机READY信号拉得太晚,导致主机一直等,整个总线性能掉了一大截。后来查了半天,发现是从机内部仲裁逻辑太复杂了。所以啊,READY信号能早拉就早拉,别藏着掖着。

核心规则:VALID信号不能依赖READY信号。也就是说,发送方一旦把VALID拉高,就必须保持到握手成功。而READY信号可以等VALID来了再拉,也可以提前拉。

2.3 读操作通道时序

读操作涉及两个通道:读地址(AR)和读数据(R)。

流程是这样的:

  1. 主机通过AR通道发送读地址和控制信息
  2. 从机收到后,开始准备数据
  3. 从机通过R通道把数据返回给主机

这里有个关键点:读数据通道可以支持乱序返回。什么意思?就是主机发了多个读请求,从机可以先返回后面的数据,再返回前面的。当然,这需要ARID和RID来匹配。

我给大家画个简单的时序图:

时钟   :  __|  |__|  |__|  |__|  |__|  |__|  |__
ARVALID:  ______|        |______________________
ARREADY:  ____________|  |______________________
ARADDR :  XXXXXX<Addr0>__XXXXXXXXXXXXXXXXXXXXXX
RVALID :  ____________________|        |________
RREADY :  ________________________|  |__________
RDATA  :  XXXXXXXXXXXXXXXXXXXXXX<Data0>XXXXXXXX

你看,AR通道握手成功后,过了几拍,R通道才开始传数据。这个延迟就是从机的访问时间。

个人经验:设计读操作时,我习惯把RVALID和RREADY的握手逻辑单独拿出来仿真。因为读数据通道的时序往往决定了整个系统的瓶颈。我曾经在一个图像处理加速器里,就是因为读数据通道的握手没处理好,导致帧率上不去。

2.4 写操作通道时序

写操作涉及三个通道:写地址(AW)、写数据(W)、写响应(B)。

流程:

  1. 主机通过AW通道发送写地址
  2. 主机通过W通道发送要写的数据
  3. 从机接收数据并完成写入
  4. 从机通过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 实际设计中的注意事项

嗯,这里我总结几个实际项目中容易踩的坑:

  1. VALID不能等READY:这是硬性规定。发送方一旦有数据,就应该把VALID拉高,不能等READY来了再拉。否则可能造成死锁。
  2. READY可以提前拉:接收方如果随时能收数据,可以把READY一直拉高。这样发送方数据一来就能传,效率最高。
  3. 小心背靠背传输:连续传输时,上一笔数据握手成功后,下一笔的VALID和READY可能已经准备好了。这时候要保证数据在同一个时钟沿完成传输。
  4. 写响应不能丢:主机必须确保每个写操作都能收到B通道的响应。如果漏了,你可能永远不知道数据有没有写成功。

我的建议:刚开始设计AXI接口时,先把单通道的握手逻辑调通。一个通道一个通道来,别想着五个通道一起上。等每个通道的握手都稳了,再把它们组合起来。这样出问题了也好定位。

好了,这一章的内容就到这儿。五个通道、VALID/READY握手,这些是AXI总线的基础。搞懂了这些,后面的内容就好办了。

AXI通道与握手知识体系 AXI总线传输 读地址通道 (AR) 读数据通道 (R) 写地址通道 (AW) 写数据通道 (W) 写响应通道 (B) VALID / READY 握手协议 VALID不能依赖READY READY可以提前拉高 同时有效时一拍传输 五个通道独立工作,通过VALID/READY握手实现高效传输

小技巧:调试AXI接口时,我习惯用波形查看器同时观察VALID和READY信号。如果看到VALID一直高但READY一直低,那八成是从机卡住了。反过来,READY一直高但VALID一直低,那就是主机还没准备好数据。

可可精品资料库