2、AXI通道详解:读地址通道、读数据通道、写地址通道、写数据通道、写响应通道的信号定义与握手协议

各位同学,咱们今天来啃一块硬骨头——AXI的五个独立通道。说实话,我刚接触AXI时,也被这五个通道搞得晕头转向。但后来我发现一个窍门:把每个通道想象成一条独立的高速公路,各有各的车道、红绿灯和交通规则。这么一想,是不是清晰多了?

2.1 五通道架构概览

AXI总线之所以强大,核心就在于它采用了通道分离的设计思想。什么意思呢?就是把读操作和写操作彻底分开,各自走各自的路。

五个通道分别是:

  • 读地址通道(AR通道)—— 读请求走这里
  • 读数据通道(R通道) —— 读回来的数据走这里
  • 写地址通道(AW通道)—— 写请求走这里
  • 写数据通道(W通道) —— 要写的数据走这里
  • 写响应通道(B通道) —— 写操作完成后的状态反馈

你想想看,读和写分开,意味着一个Master可以同时发起读请求和写请求,互不干扰。这在高性能场景下简直是神器。

核心要点:每个通道都是单向的,读地址和数据通道是Master→Slave方向,读数据通道是Slave→Master方向。写通道同理。这种单向设计大大简化了时序收敛的难度。

下面这张图是我自己画的五通道交互关系,你看一眼就能明白它们是怎么配合的:

Master Slave 读地址通道 (AR) 读数据通道 (R) 写地址通道 (AW) 写数据通道 (W) 写响应通道 (B) ● 读地址 ● 读数据 ● 写地址 ● 写数据 ● 写响应

2.2 读地址通道(AR通道)

读地址通道,说白了就是Master告诉Slave:「嘿,我想读这个地址的数据」。它包含以下关键信号:

信号名 位宽 描述
ARID 可配置(通常4位) 读事务ID,用于匹配读请求和读数据
ARADDR 32/64位 读起始地址
ARLEN 8位 突发长度,表示一次读操作包含多少笔数据传输
ARSIZE 3位 每笔数据的大小(字节数)
ARBURST 2位 突发类型:FIXED/INCR/WRAP
ARVALID 1位 Master表示地址有效
ARREADY 1位 Slave表示可以接收地址

这里我要特别强调一下ARLEN这个信号。我记得刚做第一个AXI项目时,把ARLEN的值设错了。我以为ARLEN=4表示传4笔数据,结果实际传了5笔。后来查手册才发现,ARLEN的值是「传输次数减1」。也就是说ARLEN=0表示传1笔,ARLEN=7表示传8笔。这个坑我踩过,你们千万别再踩了。

2.3 读数据通道(R通道)

读数据通道是Slave把数据返回给Master的通道。它的信号包括:

信号名 位宽 描述
RID 同ARID 读事务ID,必须与ARID匹配
RDATA 32/64/128/...位 读回来的数据
RRESP 2位 读响应状态:OKAY/EXOKAY/SLVERR/DECERR
RLAST 1位 最后一笔数据的标志
RVALID 1位 Slave表示数据有效
RREADY 1位 Master表示可以接收数据

RLAST这个信号特别重要。它告诉Master:「这是本次读突发的最后一笔数据了」。如果没有RLAST,Master根本不知道什么时候该停。我见过一个设计,因为RLAST逻辑写错了,导致Master一直在等数据,系统直接卡死。

个人经验:在读数据通道中,RID必须与之前发出去的ARID严格匹配。如果你支持多个未完成的读事务,ID就是区分它们的唯一标识。我习惯把ID设计成「源端口号+事务序号」的组合,这样调试时一眼就能看出是哪个模块发起的请求。

2.4 写地址通道(AW通道)

写地址通道和读地址通道非常相似,只是方向不同。关键信号:

信号名 位宽 描述
AWID 可配置 写事务ID
AWADDR 32/64位 写起始地址
AWLEN 8位 突发长度(同样要减1)
AWSIZE 3位 每笔数据大小
AWBURST 2位 突发类型
AWVALID 1位 Master表示地址有效
AWREADY 1位 Slave表示可以接收地址

写地址通道和读地址通道的信号定义几乎一样,只是前缀从AR变成了AW。但有一个细微差别:写操作需要额外的数据通道和响应通道,而读操作只需要数据通道就够了。为什么?因为写操作需要确认数据是否成功写入,而读操作只要数据回来了,本身就意味着成功。

2.5 写数据通道(W通道)

写数据通道是Master把要写的数据发给Slave。它的信号:

信号名 位宽 描述
WID 可配置 写数据ID(注意:有些AXI版本已废弃此信号)
WDATA 32/64/128/...位 要写入的数据
WSTRB 数据位宽/8 写选通信号,指示哪些字节有效
WLAST 1位 最后一笔数据的标志
WVALID 1位 Master表示数据有效
WREADY 1位 Slave表示可以接收数据

WSTRB这个信号,我敢说90%的新手都会搞错。它表示的是「哪些字节是有效的」。比如数据总线是32位(4字节),WSTRB[3:0]的每一位对应一个字节。如果你只想写最低字节,WSTRB就设为4'b0001。我曾经在调试一个DMA控制器时,发现写进去的数据总是错的,查了两天才发现是WSTRB逻辑写反了——该置1的位置了0,该置0的位置了1。

注意:写数据通道和写地址通道是独立的,这意味着地址可以先传,数据后传,或者反过来。但Slave必须等到地址和数据都到了才能开始写操作。这种灵活性给设计带来了便利,但也增加了握手的复杂度。

2.6 写响应通道(B通道)

写响应通道是Slave告诉Master:「你刚才的写操作完成了,结果是这样的」。信号很简单:

信号名 位宽 描述
BID 同AWID 写响应ID,必须与AWID匹配
BRESP 2位 写响应状态:OKAY/EXOKAY/SLVERR/DECERR
BVALID 1位 Slave表示响应有效
BREADY 1位 Master表示可以接收响应

B通道是五个通道中最简单的,但千万别小看它。没有B通道,Master就不知道写操作是否成功。我见过一个设计,为了省资源把B通道给省略了,结果系统跑起来后数据对不上,根本不知道是哪里写失败了。

2.7 握手协议:VALID-READY机制

好了,信号都认识了,接下来是最核心的部分——握手协议。AXI所有通道都使用相同的握手方式:VALID和READY信号。

简单来说:

  • 发送方把数据准备好后,拉高VALID
  • 接收方准备好接收时,拉高READY
  • 当VALID和READY同时为高时,数据在时钟上升沿被传输

这里有三种握手场景:

  1. VALID先有效,READY后有效——发送方先准备好,等接收方。这是最常见的情况。
  2. READY先有效,VALID后有效——接收方先准备好,等发送方。这种情况也常见,比如Slave提前告诉Master「我准备好了,你有数据就发过来」。
  3. VALID和READY同时有效——一拍完成传输,效率最高。

我个人习惯在设计中尽量让READY提前有效,这样一旦VALID来了,数据立刻就能传过去,减少等待周期。但要注意,READY不能依赖VALID,否则会形成组合逻辑环。

关键规则:VALID一旦拉高,必须保持到握手完成(即VALID和READY同时为高)才能拉低。READY可以随时拉高拉低,没有这个限制。这个规则保证了传输的可靠性。

下面是一个典型的握手时序示例:

// 读地址通道握手示例
// 时钟周期1: Master拉高ARVALID,Slave还没准备好
// 时钟周期2: Slave拉高ARREADY,握手完成,地址被传输
// 时钟周期3: Master拉低ARVALID,准备下一个事务

always @(posedge clk) begin
    if (rst) begin
        arvalid <= 1'b0;
        araddr  <= 32'h0;
    end else begin
        if (arvalid && arready) begin
            // 握手成功,可以准备下一个地址
            arvalid <= 1'b0;
        end else if (需要发起读请求) begin
            arvalid <= 1'b1;
            araddr  <= 目标地址;
        end
    end
end

2.8 通道间的依赖关系

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

  • 读操作:AR通道的握手必须在R通道的数据返回之前完成。说白了,你得先告诉Slave读哪里,它才知道该返回什么数据。
  • 写操作:AW通道和W通道可以独立握手,但B通道的响应必须在AW和W都完成后才能发出。Slave必须等到地址和数据都齐了,才能开始写,写完了才能给响应。

这里有个容易忽略的点:写数据通道的WLAST信号。Slave必须收到WLAST为高的那笔数据后,才知道本次写突发结束了,然后才能发出B通道的响应。如果WLAST丢了或者错了,B通道就永远不会来,Master就会一直等。

避坑指南:我曾经在一个项目中,因为WLAST的生成逻辑有bug,导致每次写操作都少传了一笔数据。Slave永远等不到WLAST,B通道也永远不会返回响应。最后整个系统hang住了。从那以后,我每次写WLAST逻辑时都会反复检查:突发长度和WLAST的时序是否匹配。

2.9 小结

好了,五个通道的信号和握手协议就讲到这里。总结几个关键点:

  • 每个通道都是独立的,有各自的VALID-READY握手
  • 读操作需要两个通道(AR+R),写操作需要三个通道(AW+W+B)
  • 突发长度ARLEN/AWLEN的值是「传输次数减1」,千万别搞错
  • WSTRB控制哪些字节有效,是写操作的精髓
  • B通道是写操作的「回执」,没有它你永远不知道写成功了没有

下一章我们会深入讲突发传输的地址计算,包括FIXED、INCR、WRAP三种突发模式的具体行为。到时候我会用实际波形带大家一步步分析,保证让你彻底搞明白。

可可精品资料库