第2章:AXI通道与握手——读地址、读数据、写地址、写数据、写响应通道,VALID/READY握手机制详解
大家好,我是你们的芯片架构设计讲师。今天我们来聊聊AXI总线最核心的部分——五个独立通道和它们的握手机制。
说实话,我刚接触AXI的时候,最头疼的就是这五个通道。读地址、读数据、写地址、写数据、写响应……名字看着差不多,功能却完全不同。但等你真正理解了,你会发现AXI的设计其实非常优雅。
2.1 五个通道,各司其职
AXI协议把一次传输拆成了五个独立的通道。为什么这么设计?说白了就是为了并行。
你想想看,读操作和写操作可以同时进行,地址和数据的传输也可以重叠。这在高性能系统中太重要了。
五个通道一览:
- 读地址通道(AR):主机发送读请求,包含地址和控制信息
- 读数据通道(R):从机返回读数据,包含数据和响应信号
- 写地址通道(AW):主机发送写请求,包含地址和控制信息
- 写数据通道(W):主机发送写数据,包含数据和字节选通信号
- 写响应通道(B):从机返回写完成状态,告诉主机写操作是否成功
我个人习惯把读操作和写操作分开理解。读操作只需要两个通道(AR和R),写操作需要三个通道(AW、W、B)。为什么写多一个?因为写操作需要确认——数据到底写进去了没有?
2.2 VALID/READY握手机制
这是AXI最基础也最重要的机制。每个通道都使用VALID和READY信号来完成握手。
规则很简单:
- 发送方拉高VALID,表示数据有效
- 接收方拉高READY,表示可以接收
- 当VALID和READY同时为高时,传输发生
嗯,这里要注意:VALID不能依赖READY。也就是说,发送方不能等接收方说准备好了才把数据放出来。但READY可以等VALID——接收方可以等到有数据来了再准备接收。
我曾经在一个项目中踩过这个坑。设计了一个从机,READY信号等VALID来了才拉高,结果导致死锁。因为主机也在等READY才发数据……两边互相等,系统就卡死了。
我的建议:从机的READY最好默认拉高,或者至少不要完全依赖VALID。这样可以避免很多握手死锁的问题。
2.3 三种握手情况
握手过程其实就三种情况,我画个图你们就明白了:
三种情况其实结果都一样——数据在VALID和READY同时为高的那个时钟沿被传输。只是等待的拍数不同。
2.4 读操作流程
读操作走两个通道,我给你们拆解一下:
- 主机在AR通道上发送读地址,拉高ARVALID
- 从机准备好后拉高ARREADY,握手完成
- 从机开始读取数据(可能需要几个周期)
- 从机在R通道上返回数据,拉高RVALID
- 主机准备好后拉高RREADY,握手完成
这里有个细节:读数据通道还带了一个RRESP信号。00表示正常,01表示独占访问失败,10表示错误,11是保留。我建议你们在设计时至少处理00和10两种情况。
注意:读数据通道可以支持乱序返回。如果主机发了多个读请求,从机可以不按顺序返回数据。这时候就需要RID信号来匹配哪个数据对应哪个请求。
2.5 写操作流程
写操作稍微复杂一点,因为有三个通道:
- 主机在AW通道上发送写地址,拉高AWVALID
- 主机在W通道上发送写数据,拉高WVALID
- 从机准备好后拉高AWREADY和WREADY
- 从机完成写操作后,在B通道上返回写响应
- 主机拉高BREADY,握手完成
你可能会问:地址和数据必须同时到达吗?其实不用。AXI允许地址先到,数据后到,或者反过来。我个人习惯让地址和数据尽量同时发送,这样从机处理起来更简单。
写数据通道里有个WLAST信号,这个很重要。在一次突发传输中,最后一个数据拍要把WLAST拉高,告诉从机数据结束了。我见过有人忘记拉WLAST,结果从机一直等数据,系统就卡住了。
2.6 握手依赖关系
五个通道之间是有依赖关系的,但不是强制的。我总结一下:
| 依赖关系 | 说明 | 我的建议 |
|---|---|---|
| AR → R | 读数据必须在读地址之后 | 必须保证,否则数据不知道去哪 |
| AW → B | 写响应必须在写地址之后 | 必须保证,否则响应没有归属 |
| W → B | 写响应必须在写数据之后 | 建议保证,但可以优化 |
| AW与W | 地址和数据可以独立到达 | 建议同时,简化设计 |
我曾经设计过一个高性能的AXI从机,把AW和W的依赖完全解耦了。地址先到就缓存地址,数据先到就缓存数据,等两者都到了再执行写操作。这样做的好处是吞吐量高,但控制逻辑复杂了不少。
2.7 实战中的握手设计要点
最后,我分享几个实战中的经验:
- 默认READY策略:如果从机总是能接收数据,READY就默认拉高。这样握手一拍完成,效率最高。
- VALID不能等READY:这是协议硬性规定。VALID一旦拉高,必须保持到握手完成。
- 小心死锁:如果两个模块互相等待对方的READY,系统就死锁了。设计时一定要检查依赖链。
- 流水线插入:在长路径上插入寄存器,可以提升时序。但要注意握手信号的传递延迟。
一个小技巧:调试AXI接口时,先看VALID和READY有没有同时为高。如果长时间没有握手,大概率是死锁了。用波形抓一下,很快就能定位问题。
好了,这一章的内容就到这里。五个通道和握手机制是AXI的基础,理解了这些,后面的流水线设计和QoS控制就好办了。