3. AXI握手协议:VALID/READY握手机制、通道依赖关系、传输与响应的关系

大家好,我是老李。今天我们来聊聊AXI协议最核心的部分——握手协议。说实话,我见过不少工程师,写RTL代码时对握手信号的处理马马虎虎,结果仿真能过,上板就挂。嗯,这章我们就把握手这件事彻底讲透。

3.1 VALID/READY握手机制

AXI协议里,每个通道都用一套独立的VALID/READY握手信号。说白了,就是发送方说“我有数据了”(VALID拉高),接收方说“我准备好了”(READY拉高),然后一拍即合,数据就传过去了。

握手有三种基本场景:

  • VALID先有效,READY后有效:发送方先准备好数据,等接收方就绪。这是最常见的场景。
  • READY先有效,VALID后有效:接收方提前告知“我随时可以收”,发送方准备好后立即传输。
  • VALID和READY同时有效:一拍完成传输,效率最高。

关键点:数据只在VALID和READY同时为高的时钟上升沿传输。其他时候,数据保持不变。

我个人习惯在设计时,尽量让VALID信号在数据准备好后再拉高,避免无效的握手尝试。你想想看,如果VALID拉高了但数据还没稳定,接收方读到的可能是错误值,这坑我踩过。

3.2 通道依赖关系

AXI有五个通道:读地址(AR)、读数据(R)、写地址(AW)、写数据(W)、写响应(B)。它们之间不是独立的,有严格的依赖关系。

我的经验:很多新手搞混写地址和写数据的顺序。其实AXI允许写地址和写数据乱序,但写响应必须等最后一个写数据完成后才能返回。

通道依赖的核心规则:

  • 读操作:先发AR通道的地址,再等R通道返回数据。R通道的LAST信号标记最后一个数据。
  • 写操作:AW和W通道可以同时发起,但B通道的响应必须等W通道的LAST信号之后才能发出。

我曾经在一个项目中,因为写响应返回得太早,导致数据还没写完就被认为完成了。嗯,从那以后我特别注意B通道的时序。

3.3 传输与响应的关系

每次传输,不管是读还是写,最终都会有一个响应。响应用RRESP或BRESP信号表示,取值如下:

响应值 含义 说明
00 OKAY 正常访问成功
01 EXOKAY 独占访问成功
10 SLVERR 从设备错误
11 DECERR 地址译码错误

这里要注意:响应信号必须和最后一个数据(读操作)或写响应通道(写操作)一起返回。你不能提前返回响应,也不能滞后。

避坑指南:我曾经遇到一个从设备,地址译码错误时返回了SLVERR而不是DECERR。结果主设备认为是从设备内部错误,而不是地址问题,调试了整整两天。所以响应码一定要用对。

3.4 握手时序图

下面我用SVG画一个典型的写操作握手时序图,展示地址、数据、响应三个通道的依赖关系。

T0 T1 T2 T3 T4 T5 AWVALID AWREADY WVALID WREADY BVALID BREADY 地址握手 数据握手 响应握手 依赖 依赖

从图中可以看到:地址握手完成后,数据握手才开始;数据握手完成后,响应握手才开始。这就是通道依赖的直观体现。

3.5 实际设计中的注意事项

最后,我总结几个实际设计中容易踩的坑:

  • 不要依赖READY信号:发送方不能假设READY一定会来,必须保持数据稳定直到握手成功。
  • 避免死锁:如果两个模块互相等待对方的VALID/READY,就会死锁。我遇到过,仿真卡死,查了半天才发现是握手顺序反了。
  • 响应必须及时:从设备不能无限期延迟响应,否则主设备可能超时。

小技巧:设计时,我习惯在状态机里加一个超时计数器。如果握手超过一定周期没完成,就报错。这在调试时特别有用。

好了,这一章的内容就到这里。握手协议是AXI的基础,理解透了,后面的乱序传输、原子操作才能学得轻松。

可可精品资料库