第2章:AXI通道详解——五条通道与握手协议

大家好,我是你们的芯片设计老司机。今天咱们来聊聊AXI总线最核心的部分——那五条通道和它们的握手方式。说实话,我刚接触AXI时也被这五条通道搞得有点晕,但搞懂了它们,你就掌握了AXI的精髓。

2.1 五条通道概览

AXI协议把一次传输拆成了五个独立的通道。为什么要这么设计?说白了就是为了并行。你想想看,读和写可以同时进行,地址和数据也能分开处理,这效率不就上来了吗?

这五条通道分别是:

  • 读地址通道(AR):主机告诉从机,我要读哪个地址的数据
  • 读数据通道(R):从机把读到的数据返回给主机
  • 写地址通道(AW):主机告诉从机,我要往哪个地址写数据
  • 写数据通道(W):主机把要写的数据发送给从机
  • 写响应通道(B):从机告诉主机,写操作完成了,有没有出错

我在项目中遇到过不少新人,一上来就问:为什么写操作需要三个通道,而读操作只需要两个?嗯,这个问题问得好。因为写操作需要从机给个反馈,告诉主机数据写进去了没。读操作呢?数据本身就已经包含了反馈信息。

2.2 读地址通道(AR)详解

读地址通道,就是主机告诉从机「我要读数据」的通道。它携带的信息包括:

信号 位宽 说明
ARADDR 32/64位 读操作的起始地址
ARLEN 8位 突发传输长度,实际传输次数 = ARLEN + 1
ARSIZE 3位 每次传输的字节数,2^ARSIZE
ARBURST 2位 突发类型:00=FIXED, 01=INCR, 10=WRAP
ARID 取决于配置 读事务ID,用于乱序传输

我个人习惯把AR通道想象成「下单」的过程。主机下了一个订单,告诉从机我要什么地址的数据,要多少,怎么要。从机收到这个订单后,就开始准备数据。

小提示:ARLEN的值是实际传输次数减1。比如你想读4个数据,ARLEN就设成3。这个坑我踩过,第一次写代码时设成了4,结果多读了一个数据,整个系统都乱了。

2.3 读数据通道(R)详解

读数据通道是从机返回数据的通道。它包含:

  • RDATA:读到的数据,位宽通常是32、64或128位
  • RRESP:读响应状态,2位宽,00=OKAY, 01=EXOKAY, 10=SLVERR, 11=DECERR
  • RLAST:最后一次传输的标志,1位宽
  • RID:读事务ID,与ARID对应

这里要注意的是,读数据通道的最后一个数据会拉高RLAST信号。从机可以一次返回所有数据,也可以分多次返回。我曾经调试过一个bug,就是RLAST信号没处理好,导致主机一直在等数据,整个总线都卡死了。

2.4 写地址通道(AW)详解

写地址通道和读地址通道非常相似,只是方向不同。它包含:

信号 说明
AWADDR 写操作的起始地址
AWLEN 突发传输长度
AWSIZE 每次传输的字节数
AWBURST 突发类型
AWID 写事务ID

说白了,AW通道和AR通道就是一对双胞胎,只是一个是读,一个是写。很多设计里,这两个通道的地址生成逻辑可以复用。

2.5 写数据通道(W)详解

写数据通道是主机把数据发送给从机的通道。它包含:

  • WDATA:要写入的数据
  • WSTRB:字节选通信号,每1位对应1个字节,高电平表示该字节有效
  • WLAST:最后一次传输的标志
  • WID:写数据ID(在AXI3中使用,AXI4已取消)

WSTRB这个信号很有意思。它允许你只写数据中的某些字节。比如你只想写一个32位数据的低8位,WSTRB就设成4'b0001。我在项目中遇到过有人忘了处理WSTRB,结果把不该写的数据也写进去了,整个系统的数据都乱了套。

2.6 写响应通道(B)详解

写响应通道是从机给主机的反馈。它包含:

  • BRESP:写响应状态,2位宽,含义和RRESP一样
  • BID:写事务ID,与AWID对应

写响应通道只有一笔数据,不像读数据通道那样可以有多笔。为什么?因为写操作是一次性的,从机收到所有数据后,给个反馈就行了。

注意:写响应必须在所有写数据都传输完成后才能发出。我曾经见过一个设计,从机在收到第一个写数据后就发了响应,结果后面的数据全丢了。这个bug查了我整整两天。

2.7 握手协议:VALID/READY

好了,通道讲完了,现在来说说它们之间怎么通信。AXI使用VALID/READY握手协议。这个协议很简单,就两个信号:

  • VALID:发送方表示数据有效
  • READY:接收方表示可以接收数据

数据只有在VALID和READY同时为高时才传输。这就像两个人握手,一个人伸出手(VALID),另一个人也伸出手(READY),两只手握在一起才算握手成功。

握手有三种情况:

  1. VALID先来,READY后来:发送方先准备好数据,等待接收方
  2. READY先来,VALID后来:接收方先准备好,等待发送方
  3. VALID和READY同时来:一拍完成传输,效率最高
核心要点:VALID信号不能依赖READY信号。也就是说,发送方不能等接收方说准备好了才发VALID。但READY可以等VALID,也可以不等。这个规则保证了不会出现死锁。

2.8 通道间的依赖关系

五条通道之间不是完全独立的,它们有依赖关系:

  • 读数据通道必须等读地址通道握手成功后才能开始传输
  • 写数据通道和写地址通道可以同时进行,没有先后顺序
  • 写响应通道必须等写数据通道的WLAST传输完成后才能发出

我建议你在设计时,把地址通道的优先级设高一些。因为地址通道的数据量小,传输快,先传地址可以让从机提前准备。这个经验是我在调试一个高性能系统时总结出来的。

2.9 知识体系图

下面这张图展示了AXI五条通道和握手协议的关系:

主机 从机 AR通道(读地址) R通道(读数据) AW通道(写地址) W通道(写数据) B通道(写响应) 握手协议:VALID / READY 发送方拉高VALID,接收方拉高READY 两者同时为高时,数据完成传输

2.10 实战经验总结

最后,分享几个我在项目中积累的经验:

  • 地址对齐很重要:突发传输的地址必须和ARSIZE/AWSIZE对齐,否则从机可能无法正确处理
  • ID要配对:ARID和RID要一致,AWID和BID要一致,否则乱序传输时会乱套
  • 不要忽略响应:每次写操作都要检查BRESP,每次读操作都要检查RRESP。我曾经忽略了一次SLVERR,结果整个系统都在用错误的数据运行
  • WLAST不能丢:写数据通道的WLAST信号必须准确,从机靠它来判断写操作是否结束

好了,这一章的内容就到这里。五条通道和握手协议是AXI的基础,搞懂了这些,后面的内容就会轻松很多。记住,多动手写代码,多仿真调试,才能真正掌握这些知识。

可可精品资料库