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画一个典型的写操作握手时序图,展示地址、数据、响应三个通道的依赖关系。
从图中可以看到:地址握手完成后,数据握手才开始;数据握手完成后,响应握手才开始。这就是通道依赖的直观体现。
3.5 实际设计中的注意事项
最后,我总结几个实际设计中容易踩的坑:
- 不要依赖READY信号:发送方不能假设READY一定会来,必须保持数据稳定直到握手成功。
- 避免死锁:如果两个模块互相等待对方的VALID/READY,就会死锁。我遇到过,仿真卡死,查了半天才发现是握手顺序反了。
- 响应必须及时:从设备不能无限期延迟响应,否则主设备可能超时。
小技巧:设计时,我习惯在状态机里加一个超时计数器。如果握手超过一定周期没完成,就报错。这在调试时特别有用。
好了,这一章的内容就到这里。握手协议是AXI的基础,理解透了,后面的乱序传输、原子操作才能学得轻松。