第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 三种握手情况

握手过程其实就三种情况,我画个图你们就明白了:

AXI VALID/READY 握手时序 情况1:VALID先到 CLK ▁▁▂▂▁▁▂▂▁▁▂▂▁▁▂▂ VALID ▁▁▂▂▂▂▂▂▁▁▁▁▁▁▁▁ READY ▁▁▁▁▁▁▂▂▂▂▁▁▁▁▁▁ 传输 ▁▁▁▁▁▁▂▂▁▁▁▁▁▁▁▁ ← 握手成功 情况2:READY先到 CLK ▁▁▂▂▁▁▂▂▁▁▂▂▁▁▂▂ READY ▁▁▂▂▂▂▂▂▁▁▁▁▁▁▁▁ VALID ▁▁▁▁▁▁▂▂▂▂▁▁▁▁▁▁ 传输 ▁▁▁▁▁▁▂▂▁▁▁▁▁▁▁▁ ← 握手成功 情况3:同时有效 CLK ▁▁▂▂▁▁▂▂▁▁▂▂ VALID ▁▁▁▁▁▁▂▂▂▂ READY ▁▁▁▁▁▁▂▂▂▂ 传输 ▁▁▁▁▁▁▂▂▁▁ ← 一拍完成

三种情况其实结果都一样——数据在VALID和READY同时为高的那个时钟沿被传输。只是等待的拍数不同。

2.4 读操作流程

读操作走两个通道,我给你们拆解一下:

  1. 主机在AR通道上发送读地址,拉高ARVALID
  2. 从机准备好后拉高ARREADY,握手完成
  3. 从机开始读取数据(可能需要几个周期)
  4. 从机在R通道上返回数据,拉高RVALID
  5. 主机准备好后拉高RREADY,握手完成

这里有个细节:读数据通道还带了一个RRESP信号。00表示正常,01表示独占访问失败,10表示错误,11是保留。我建议你们在设计时至少处理00和10两种情况。

注意:读数据通道可以支持乱序返回。如果主机发了多个读请求,从机可以不按顺序返回数据。这时候就需要RID信号来匹配哪个数据对应哪个请求。

2.5 写操作流程

写操作稍微复杂一点,因为有三个通道:

  1. 主机在AW通道上发送写地址,拉高AWVALID
  2. 主机在W通道上发送写数据,拉高WVALID
  3. 从机准备好后拉高AWREADY和WREADY
  4. 从机完成写操作后,在B通道上返回写响应
  5. 主机拉高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控制就好办了。

可可精品资料库