3、AXI握手协议:VALID/READY握手机制、通道之间的依赖关系、握手时序分析
大家好,我是老李。做芯片设计这些年,我见过太多新手在AXI握手上栽跟头。说白了,AXI总线能跑多快、数据对不对,全看这握手协议玩得溜不溜。今天咱们就把这层窗户纸捅破。
3.1 VALID/READY握手机制
AXI的每个通道(读地址、读数据、写地址、写数据、写响应)都靠一对信号握手:VALID和READY。这俩信号就像两个人握手——一个伸手(VALID),一个接住(READY),只有双方都到位了,数据才算真正传过去。
握手有三种情况:
- VALID先有效,READY后有效:发送方先准备好数据,等接收方准备好。这是最常见的场景。
- READY先有效,VALID后有效:接收方提前说“我准备好了”,发送方再把数据放上来。我习惯用这种方式做流水线设计,能省一个周期。
- VALID和READY同时有效:一拍搞定,效率最高。但说实话,实际项目中很少能这么理想。
核心规则:数据在时钟上升沿,且VALID和READY同时为高时,才被采样。少一个都不行。
我的经验:我在做DMA控制器时,曾经因为VALID信号过早拉低,导致数据丢失。后来我养成了一个习惯——VALID一旦拉高,必须等到握手成功才能拉低。这叫“VALID不能自降”,是AXI的铁律。
3.2 通道之间的依赖关系
AXI有五个通道,它们不是各玩各的。通道之间有严格的依赖关系,搞错了,系统就死锁了。
我画了一张图,帮你理清这些关系:
依赖关系说白了就几条:
- 读操作:先发读地址(AR通道),再收读数据(R通道)。数据必须等地址握手成功后才会回来。
- 写操作:写地址(AW通道)和写数据(W通道)可以同时发,但写响应(B通道)必须等地址和数据都握手成功后才能返回。
- WLAST信号:写数据的最后一拍必须带WLAST标志,告诉从设备“这是最后一份数据了”。从设备收到WLAST后,才会返回写响应。
避坑指南:我曾经遇到一个bug,从设备一直不返回写响应。查了三天,发现是主设备发了写地址但没发写数据。从设备傻等着数据,主设备傻等着响应,死锁了。记住:地址和数据必须都到位,响应才会回来。
3.3 握手时序分析
时序分析是验证握手协议的关键。咱们看一个典型的写操作时序:
时钟周期: T0 T1 T2 T3 T4 T5
ACLK ▁▁▁▂▂▂▁▁▁▂▂▂▁▁▁▂▂▂▁▁▁▂▂▂▁▁▁▂▂▂
AWVALID ▁▁▁▁▁▁▁▁▁▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
AWREADY ▁▁▁▁▁▁▁▁▁▁▁▁▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
WVALID ▁▁▁▁▁▁▁▁▁▁▁▁▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
WREADY ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁
WLAST ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁
BVALID ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂▂▂▁▁▁▁▁▁
BREADY ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂▂▂▁▁▁
咱们一步步拆解:
- T0-T1:主设备拉高AWVALID,但从设备还没准备好(AWREADY为低)。握手没成功。
- T2:从设备拉高AWREADY,VALID和READY同时为高,地址握手成功。
- T2-T3:主设备拉高WVALID和WLAST,但WREADY为低。数据在等待。
- T4:从设备拉高WREADY,数据握手成功。注意WLAST也同时被采样,从设备知道这是最后一笔数据。
- T5:从设备拉高BVALID,返回写响应。主设备拉高BREADY,响应握手成功。
关键点:从T2到T4,地址已经握手成功,但数据还在等。这说明地址和数据通道是独立的,可以错开握手。但写响应必须等数据和地址都搞定后才来。
你想想看,如果从设备在T2就返回写响应,那肯定出问题——数据还没到呢!这就是依赖关系的体现。
我的习惯:做时序分析时,我总会在验证环境里加一个断言:检查BVALID是否在WLAST握手之后才拉高。这个断言帮我抓过至少三个bug,建议你也加上。
3.4 实际设计中的注意事项
最后聊几个实战中容易踩的坑:
- READY信号不能依赖VALID:从设备的READY信号应该独立于VALID,否则可能造成死锁。我见过一个设计,READY逻辑里加了“等待VALID”的条件,结果主设备也在等READY,两边都卡死了。
- VALID信号必须保持稳定:一旦拉高,不能因为中间插了其他事务就拉低。必须等到握手成功。
- 多笔传输时的背压处理:如果从设备处理不过来,可以拉低READY来“踩刹车”。主设备看到READY为低,就得保持当前数据不动。
血的教训:我曾经在一个AI加速器项目中,因为没处理好写数据的背压,导致FIFO溢出。从设备READY拉低了,但主设备还在拼命发数据。结果数据丢了,整个推理结果全错。从那以后,我每次设计都会检查:READY拉低时,主设备是否真的停下来了?
好了,AXI握手协议的核心就这些。说白了就是两件事:VALID和READY怎么配合,通道之间谁等谁。搞懂了这些,AXI总线设计就成功了一半。