3、AXI握手协议:VALID/READY握手机制、握手依赖关系、传输完成条件

各位同学,今天我们来聊聊AXI总线最核心、最基础的东西——握手协议。说实话,我见过不少工程师,写AXI代码时对时序一知半解,结果仿真跑不通,或者上板后数据对不上。问题出在哪?十有八九是握手没搞明白。

AXI的传输,说白了就是一次「握手」的过程。发送方说「我有数据了」,接收方说「我准备好了」,然后数据就传过去了。就这么简单。但简单背后,藏着不少细节。

3.1 VALID/READY握手机制

AXI的每个通道(地址、数据、写响应)都用了两套信号:VALID 和 READY。VALID由源端发出,表示「我这边的数据/地址/控制信号已经准备好了」。READY由目标端发出,表示「我已经准备好接收了」。

握手成功,也就是传输发生,需要满足一个条件:VALID和READY同时为高,并且在时钟上升沿被采样到。

我刚开始学AXI时,总觉得这玩意儿跟普通的总线使能信号差不多。后来踩了坑才明白,VALID和READY的组合关系,决定了整个总线的行为。

具体来说,握手有三种情况:

场景 VALID READY 结果
1. 源端先准备好 先拉高 后拉高 READY拉高时立即握手
2. 目标端先准备好 后拉高 先拉高 VALID拉高时立即握手
3. 同时准备好 同时拉高 同时拉高 一个周期完成握手

你看,不管谁先等谁,只要双方都准备好了,一拍就搞定。这就是AXI的高效之处。

核心要点:握手只发生在VALID和READY同时为高的时钟上升沿。在此之前,数据必须保持稳定。

3.2 握手依赖关系

这里有个坑,我当年就栽过。VALID信号一旦拉高,不能等到READY拉高后再拉低。什么意思?就是说,源端一旦声明「我有数据」,就必须保持这个数据稳定,直到握手成功。

我给大家画个图,你就明白了。

CLK T0 T1 T2 T3 T4 T5 VALID 高 READY 高 ✓ 握手成功 DATA 有效数据 下一笔数据

你看这个时序图。VALID在T0就拉高了,但READY直到T2才拉高。那么握手发生在T2的上升沿。注意,VALID从T0到T2一直保持高,数据也必须保持稳定。这就是AXI的规则:VALID一旦拉高,必须等到握手成功才能变。

我曾经踩过的坑:有一次我写一个AXI从机,VALID拉高后,因为内部逻辑延迟,数据在握手前就变了。结果仿真时数据对不上,查了三天才发现是这个问题。记住:VALID拉高后,数据必须保持稳定,直到握手成功。

反过来,READY信号可以随时拉高拉低。目标端可以在任何时刻声明「我准备好了」,也可以随时反悔。但实际设计中,我建议READY一旦拉高,最好也保持到握手成功,否则容易造成死锁。

3.3 传输完成条件

一次AXI传输,什么时候算完成?嗯,这个问题看似简单,但不同通道有不同说法。

对于地址通道,握手成功就算地址传输完成。对于数据通道,握手成功就算一笔数据传输完成。对于写响应通道,握手成功就算响应传输完成。

但一个完整的AXI事务(比如一次突发写),需要所有通道都完成各自的握手。具体来说:

  • 写事务:地址握手成功 + 所有数据握手成功 + 写响应握手成功
  • 读事务:地址握手成功 + 所有数据握手成功

这里有个细节,我提醒大家注意。对于突发传输,数据通道的握手次数必须等于突发长度。比如一个4拍的突发写,数据通道需要握手4次,每次传输一笔数据。

个人经验:我在调试一个DMA控制器时,发现数据总是少传一笔。后来发现是数据通道的LAST信号没处理好。LAST信号在最后一笔数据时拉高,告诉接收方「这是最后一笔了」。很多新手会忽略这个信号,导致传输提前结束或无法结束。

另外,写响应通道的握手,必须发生在所有数据握手成功之后。这是AXI协议规定的顺序依赖关系。读事务没有写响应通道,所以读数据通道的最后一笔数据,就隐含了「读完成」的意思。

我给大家总结一下传输完成的判断条件:

事务类型 完成条件
单笔写 AW握手 + W握手 + B握手
突发写 AW握手 + (W握手 × 突发长度) + B握手
单笔读 AR握手 + R握手
突发读 AR握手 + (R握手 × 突发长度)

你想想看,如果突发长度是8,但数据通道只握手了7次,那这个事务就没完成。接收方会一直等最后一笔数据。这就是死锁的常见原因之一。

好了,关于握手协议,今天就讲这么多。记住三个关键词:VALID、READY、同时为高。搞懂了这三个词,AXI的传输你就掌握了八成。

本章核心:

  • 握手条件:VALID和READY同时为高
  • VALID规则:拉高后必须保持到握手成功
  • READY规则:可以随时拉高拉低,但建议保持
  • 传输完成:所有相关通道握手成功

可可精品资料库