2、AXI通道详解:读地址通道(AR)、读数据通道(R)、写地址通道(AW)、写数据通道(W)、写响应通道(B)

好,咱们今天来聊聊AXI的五个独立通道。这五个通道,说白了就是AXI协议的“五条高速公路”。每条路各司其职,互不干扰。我刚开始学AXI的时候,觉得通道好多,记不住。后来发现,只要理解了“读”和“写”是分开的,地址和数据也是分开的,就豁然开朗了。

为什么要把通道拆得这么细?你想想看,如果地址和数据混在一起传,那总线得多乱?AXI的设计哲学就是“解耦”——把不同的事务拆开,让它们可以并行处理。这样,系统的吞吐量就上去了。

2.1 读地址通道(AR)

读地址通道,简称AR通道。它的任务很简单:把读请求的地址发给从设备。

AR通道的信号不多,但每个都很关键。我列个表,大家看看:

信号 方向 描述
ARID 主→从 读事务ID,用于匹配读数据
ARADDR 主→从 读地址,起始地址
ARLEN 主→从 突发长度,一次读几个数据
ARSIZE 主→从 每个数据的字节数
ARBURST 主→从 突发类型:固定、增量、回绕
ARVALID 主→从 主设备说:地址有效
ARREADY 从→主 从设备说:我准备好收地址了

这里有个握手协议,叫VALID-READY。主设备拉高ARVALID,表示地址有效。从设备拉高ARREADY,表示可以接收。两者都高,地址就传过去了。我在项目中遇到过一个问题:主设备一直拉着ARVALID不放,从设备却还没准备好。结果总线就卡住了。嗯,这里要注意,握手信号一定要配合好。

核心要点:AR通道只负责传地址,不传数据。数据走R通道。

2.2 读数据通道(R)

读数据通道,简称R通道。从设备把读到的数据,通过这个通道返回给主设备。

R通道的信号:

  • RID:事务ID,必须和ARID匹配。这样主设备才知道这个数据对应哪个读请求。
  • RDATA:读回来的数据,宽度可以是8、16、32、64、128位等。
  • RRESP:读响应状态。OKAY表示成功,EXOKAY表示独占访问成功,SLVERR表示从设备错误,DECERR表示地址译码错误。
  • RLAST:最后一个数据。突发传输时,最后一个数据会拉高RLAST。
  • RVALID:从设备说:数据有效。
  • RREADY:主设备说:我准备好收数据了。

R通道的握手和AR通道类似。但有个区别:R通道可以连续传多个数据(突发传输)。比如ARLEN=3,那就传4个数据(长度=ARLEN+1)。最后一个数据时,RLAST会拉高。

我个人习惯,在验证R通道时,会特别关注RRESP。有一次,从设备返回了SLVERR,但主设备没检查,直接用了数据。结果整个系统跑飞了。所以,一定要检查响应状态。

小技巧:RID可以用来乱序返回数据。主设备发出多个读请求,从设备可以按任意顺序返回数据,只要RID匹配就行。这能提高总线利用率。

2.3 写地址通道(AW)

写地址通道,简称AW通道。和AR通道类似,但它是用来传写地址的。

AW通道的信号和AR通道几乎一样:AWID、AWADDR、AWLEN、AWSIZE、AWBURST、AWVALID、AWREADY。用法也相同。

为什么写地址要单独一个通道?因为写操作需要地址、数据、响应三个步骤。地址先走AW通道,数据走W通道,响应走B通道。这样,地址和数据可以同时传输,提高效率。

我曾经遇到一个设计,把AW和W通道的握手信号搞混了。结果地址还没传完,数据就来了,从设备直接懵了。所以,AW和W是独立的,但时序上要协调好。

2.4 写数据通道(W)

写数据通道,简称W通道。主设备通过这个通道,把要写的数据发给从设备。

W通道的信号:

  • WID:写事务ID。注意,在AXI3中需要,AXI4中已经去掉了。因为AXI4中,写数据必须按顺序发送。
  • WDATA:写数据。
  • WSTRB:写选通信号。每个bit对应一个字节。比如32位数据,WSTRB[3:0]分别对应字节3、2、1、0。为1表示该字节有效。
  • WLAST:最后一个数据。
  • WVALID:主设备说:数据有效。
  • WREADY:从设备说:我准备好收数据了。

WSTRB这个信号,我刚开始觉得有点多余。后来做DMA设计时,发现它太有用了。比如,你想写一个32位寄存器的低16位,高16位保持不变。那就可以把WSTRB设为2'b0011,只写低两个字节。从设备会根据WSTRB决定哪些字节被更新。

注意:在AXI4中,写数据必须按顺序发送。也就是说,你不能先发第二个突发的数据,再发第一个。这和读数据不同,读数据可以乱序返回。

2.5 写响应通道(B)

写响应通道,简称B通道。写操作完成后,从设备通过B通道返回响应。

B通道的信号很少:

  • BID:事务ID,必须和AWID匹配。
  • BRESP:写响应状态。和RRESP类似:OKAY、EXOKAY、SLVERR、DECERR。
  • BVALID:从设备说:响应有效。
  • BREADY:主设备说:我准备好收响应了。

B通道只有一个数据,没有突发。因为一次写操作,无论写了多少个数据,最终只有一个响应。

我建议,写操作一定要检查BRESP。如果返回SLVERR,说明从设备没写成功。我曾经有个项目,从设备是外部存储器,偶尔会返回错误。主设备没检查,以为写成功了,结果数据丢了。排查了好久才发现是BRESP的问题。

2.6 通道间的依赖关系

五个通道不是完全独立的。它们之间有依赖关系。我画个图,大家一看就明白:

AXI五通道依赖关系图 主设备 从设备 AR通道(读地址) R通道(读数据) AW通道(写地址) W通道(写数据) B通道(写响应) 读:AR→R(先发地址,再收数据) 写:AW+W→B(地址和数据可并行,最后收响应)

从图上可以看出来:

  • 读操作:先走AR通道发地址,再走R通道收数据。AR和R是顺序依赖的。
  • 写操作:AW通道发地址,W通道发数据,这两个可以同时进行。最后B通道返回响应。AW和W都完成后,B才会出现。

这里有个细节:写操作中,从设备可以在收到所有数据和地址后,再返回B响应。也可以边收边处理。但B响应必须在最后一个数据(WLAST)之后才返回。这是协议规定的。

好了,五个通道就讲完了。说白了,就是读和写分开,地址和数据分开。这样设计,让总线可以同时处理多个事务,效率很高。下一章,咱们聊聊握手协议,看看VALID和READY是怎么配合的。

本章总结:

  • AXI有五个独立通道:AR、R、AW、W、B。
  • 读操作:AR→R,地址和数据分离。
  • 写操作:AW+W→B,地址和数据可并行,最后收响应。
  • 每个通道都有VALID-READY握手信号。
  • ID用于事务匹配,支持乱序和交织。

可可精品资料库