2. AXI握手协议:VALID/READY握手机制、通道依赖关系、传输时序

好,咱们直接进入正题。

AXI总线最核心的东西是什么?就是握手。说白了,没有握手,数据就没法在Master和Slave之间可靠地传递。我刚开始接触AXI时,总觉得这握手不就是两个信号嘛,有啥难的?结果第一次调时序就栽了跟头——数据丢包了。嗯,从那以后我再也不敢小看这个握手协议了。

2.1 VALID/READY握手机制

AXI的每个通道(读地址、读数据、写地址、写数据、写响应)都用了同一套握手规则。两个关键信号:

  • VALID:发送方说“我准备好了,数据/地址有效”。
  • READY:接收方说“我准备好了,可以接收”。

只有两个信号同时为高,传输才算完成。这就是所谓的“一拍握手”。

核心原则:VALID信号一旦拉高,就不能再变,直到握手成功。READY可以随时拉高或拉低。

你想想看,为什么VALID不能变?因为发送方承诺了“我这拍数据是有效的”,如果接收方还没准备好,发送方就得一直保持这个数据。我见过有人把VALID当使能信号用,拉高又拉低,结果接收方只采到半个数据——这种坑,踩一次就够了。

2.2 三种握手场景

实际传输中,VALID和READY谁先来,有三种情况:

场景 描述 典型情况
VALID先到 发送方先准备好,等待接收方 Slave正在处理前一笔数据,还没准备好接收下一笔
READY先到 接收方先准备好,等待发送方 Slave空闲,但Master还在准备数据
同时到达 一拍完成传输,零等待 理想情况,流水线满负荷运转

我个人习惯在设计时,尽量让Slave的READY信号在空闲时保持高电平。这样Master只要VALID拉高,一拍就能传过去,延迟最小。当然,如果Slave内部FIFO快满了,READY就得拉低,这叫反压。

小技巧:调试时,先看VALID和READY是否同时为高。如果长时间不同时,大概率是某一方卡住了。我曾经花了两天查一个死锁问题,最后发现是Slave的READY逻辑写错了,永远拉不高。

2.3 通道依赖关系

AXI有五个通道,但它们不是完全独立的。通道之间有依赖关系,搞错了就会死锁。

先看写操作:

  • 写地址通道(AW)和写数据通道(W)是并行的。Master可以同时发地址和数据。
  • 写响应通道(B)依赖前两者。Slave必须收到地址和数据后,才能返回响应。

读操作更简单:

  • 读地址通道(AR)先发,然后读数据通道(R)返回数据。
  • R通道的最后一个数据会带上RLAST信号,表示传输结束。

注意:写数据通道的WLAST信号必须在最后一笔数据时拉高。如果WLAST丢了,Slave会一直等数据,永远不会返回B响应。我遇到过这种问题,仿真时没检查WLAST,结果综合后功能全乱套。

这里有个容易忽略的点:写数据通道可以比写地址通道先完成。也就是说,Master可以先发完所有数据,再发地址。这在某些特殊场景下有用,但我不建议这么干——容易把自己绕晕。

2.4 传输时序示例

咱们看一个典型的单拍写传输时序:

时钟周期:  T0   T1   T2   T3   T4
ACLK      :  _-  _-  _-  _-  _-
AWVALID   :  0    1    1    0    0
AWREADY   :  0    0    1    0    0
WVALID    :  0    1    1    1    0
WREADY    :  0    0    0    1    0
WDATA     :  X    D0   D0   D0   X
WLAST     :  0    0    0    1    0
BVALID    :  0    0    0    0    1
BREADY    :  0    0    0    0    1
BRESP     :  X    X    X    X   OKAY

我来解释一下这个时序:

  1. T1周期:Master拉高AWVALID和WVALID,但Slave的AWREADY和WREADY都是低。
  2. T2周期:AWREADY拉高,地址握手成功。但WREADY还是低,数据没传过去。
  3. T3周期:WREADY终于拉高,数据握手成功。注意WLAST也在这拍拉高。
  4. T4周期:Slave处理完,拉高BVALID,Master用BREADY响应,写操作完成。

你看,地址和数据不是同时握手的。这在AXI里完全合法。但要注意,Slave必须保证在地址和数据都收到后,才返回B响应。如果Slave在地址没到时就返回B,那Master就懵了。

2.5 握手协议的核心要点

总结一下我这些年积累的经验:

  • VALID不能依赖READY:发送方的VALID逻辑不能等接收方的READY。否则会形成组合逻辑环,时序跑不高。
  • READY可以依赖VALID:接收方可以用VALID来产生READY,但要注意加一级寄存器,避免组合路径太长。
  • 死锁预防:如果两个通道互相等对方先握手,就会死锁。比如Master等Slave的READY,Slave又在等Master的VALID——这种循环依赖必须避免。
  • 背靠背传输:如果Master连续发数据,VALID可以一直保持高,READY每拍都拉高,就能实现每拍一个数据的吞吐率。

避坑指南:我曾经设计一个DMA控制器,Master在发完最后一笔数据后,立刻把WVALID拉低。结果Slave的WREADY还没拉高,最后一笔数据没传过去。正确的做法是:WVALID必须保持到WREADY拉高为止。这个bug让我调了整整两天。

2.6 知识体系结构图

下面这张图展示了AXI握手协议的核心逻辑:

AXI握手协议知识体系 VALID/READY握手 三种握手场景 通道依赖关系 传输时序分析 VALID先到 / READY先到 / 同时 写通道 / 读通道 / 响应依赖 单拍 / 突发 / 背靠背 核心原则:VALID不能依赖READY READY可以依赖VALID(但建议加寄存器) ⚠ 常见陷阱 WLAST丢失 → 写响应永远不返回 VALID提前拉低 → 数据丢失

嗯,这张图把咱们刚才讲的内容串起来了。从上往下看,先理解握手的基本概念,再掌握三种场景,然后搞清楚通道之间的依赖,最后用时序分析来验证你的设计对不对。

我个人建议,初学者先别急着写代码。把这张图里的逻辑想清楚,用纸笔画一遍时序,再动手。我当年就是太心急,直接写RTL,结果仿真一堆问题。后来老老实实画时序图,效率反而更高。

可可精品资料库