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 通道间的依赖关系
五个通道不是完全独立的。它们之间有依赖关系。我画个图,大家一看就明白:
从图上可以看出来:
- 读操作:先走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用于事务匹配,支持乱序和交织。
可可精品资料库