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
我来解释一下这个时序:
- T1周期:Master拉高AWVALID和WVALID,但Slave的AWREADY和WREADY都是低。
- T2周期:AWREADY拉高,地址握手成功。但WREADY还是低,数据没传过去。
- T3周期:WREADY终于拉高,数据握手成功。注意WLAST也在这拍拉高。
- 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握手协议的核心逻辑:
嗯,这张图把咱们刚才讲的内容串起来了。从上往下看,先理解握手的基本概念,再掌握三种场景,然后搞清楚通道之间的依赖,最后用时序分析来验证你的设计对不对。
我个人建议,初学者先别急着写代码。把这张图里的逻辑想清楚,用纸笔画一遍时序,再动手。我当年就是太心急,直接写RTL,结果仿真一堆问题。后来老老实实画时序图,效率反而更高。
可可精品资料库