2、AXI通道详解:读地址通道(AR)、读数据通道(R)、写地址通道(AW)、写数据通道(W)、写响应通道(B)信号定义与时序

AXI4 协议将总线事务拆分为五个独立的通道,实现了读/写地址、读/写数据与写响应的解耦。每个通道均为单方向传输,由主设备(Manager)或从设备(Subordinate)驱动,并通过 VALID/READY 握手机制完成数据交换。本章逐一解析五个通道的信号定义、握手规则及典型时序。

2.1 通道握手基础:VALID/READY 机制

所有 AXI 通道均采用相同的点对点握手机制:

  • VALID:由发送方驱动,表示当前通道上的地址/数据/响应信号有效。
  • READY:由接收方驱动,表示接收方已准备好接收数据。

数据传输发生在 VALID 与 READY 同时为高 的时钟上升沿。三种典型握手场景如下:

场景描述时序特点
VALID 先于 READY发送方先置位 VALID,等待接收方置位 READY发送方数据需保持稳定,直至握手完成
READY 先于 VALID接收方提前置位 READY,等待发送方置位 VALID接收方可在 VALID 有效后立即采样
同时置位VALID 与 READY 在同一周期内同时拉高零等待周期,最高效传输
验证要点: 在 UVM 环境中,必须覆盖三种握手场景的随机组合,并检查 VALID 置位后数据保持稳定直至握手完成,避免因过早撤销 VALID 导致数据丢失。

2.2 读地址通道(AR)

读地址通道由主设备驱动,向从设备发送读请求的起始地址及控制信息。该通道是读事务的发起端,决定了后续读数据通道的返回内容。

2.2.1 信号定义

信号位宽方向描述
ARIDn主→从读地址 ID,用于匹配读数据返回的 RID
ARADDR32/64主→从读起始地址,必须对齐到突发长度 × 数据位宽
ARLEN8主→从突发长度,实际传输次数 = ARLEN + 1
ARSIZE3主→从每拍数据字节数:3'b000=1B, 3'b001=2B, …, 3'b101=32B
ARBURST2主→从突发类型:00=FIXED, 01=INCR, 10=WRAP
ARLOCK2主→从传输锁定类型:00=正常, 01=独占, 10=锁定
ARCACHE4主→从缓存属性:可缓存/缓冲/分配策略
ARPROT3主→从保护单元:特权/安全/指令数据
ARVALID1主→从地址有效指示
ARREADY1从→主从设备准备好接收地址

2.2.2 时序要求

  • ARVALID 置位后,ARADDR 及所有控制信号必须保持稳定,直到 ARREADY 被拉高且握手完成。
  • 从设备可以在 ARVALID 置位前就拉高 ARREADY(提前准备),但必须在 ARVALID 有效时采样地址。
  • 读地址通道与读数据通道之间无固定时序依赖,从设备可在接收地址后任意周期返回数据。

2.3 读数据通道(R)

读数据通道由从设备驱动,向主设备返回读请求的数据及响应状态。该通道支持乱序返回,通过 RID 与 ARID 匹配。

2.3.1 信号定义

信号位宽方向描述
RIDn从→主读数据 ID,必须与对应 ARID 一致
RDATA32/64/128/256/512从→主读数据总线
RRESP2从→主读响应:00=OKAY, 01=EXOKAY, 10=SLVERR, 11=DECERR
RLAST1从→主最后一拍指示,用于标记突发传输结束
RVALID1从→主读数据有效指示
RREADY1主→从主设备准备好接收数据

2.3.2 时序要求

  • 从设备必须在 RVALID 置位时提供有效的 RDATA、RRESP 和 RID。
  • RLAST 必须在突发传输的最后一拍置位,且与 RVALID 同步。
  • 主设备可以延迟 RREADY 以进行流控,但必须保证最终接收所有数据。
  • 读数据通道支持 交错传输:不同 ID 的数据拍可以交替返回,但同一 ID 内的数据必须按顺序返回。
验证陷阱: 在 UVM 中构造读数据通道时,务必随机化 RLAST 与 RVALID 之间的延迟,并检查主设备在 RLAST 置位后是否停止等待该 ID 的更多数据。同时需验证 RID 与 ARID 的匹配逻辑,防止 ID 错位导致数据混乱。

2.4 写地址通道(AW)

写地址通道由主设备驱动,向从设备发送写请求的起始地址及控制信息。该通道与读地址通道结构对称,但服务于写事务。

2.4.1 信号定义

信号位宽方向描述
AWIDn主→从写地址 ID,用于匹配写响应 BID
AWADDR32/64主→从写起始地址
AWLEN8主→从突发长度,实际传输次数 = AWLEN + 1
AWSIZE3主→从每拍数据字节数
AWBURST2主→从突发类型
AWLOCK2主→从传输锁定类型
AWCACHE4主→从缓存属性
AWPROT3主→从保护单元
AWVALID1主→从写地址有效指示
AWREADY1从→主从设备准备好接收写地址

2.4.2 时序要求

  • 写地址通道与写数据通道之间无严格时序依赖,主设备可以先发地址后发数据,也可以先发数据后发地址,或同时发送。
  • 从设备必须在接收到 AWADDR 和 W 数据后,才能产生写响应 B 通道的响应。
  • AWVALID 与 ARVALID 可以同时置位,实现读写并行。

2.5 写数据通道(W)

写数据通道由主设备驱动,向从设备发送待写入的数据及字节选通信号。该通道是 AXI 中唯一包含字节使能的通道。

2.5.1 信号定义

信号位宽方向描述
WIDn主→从写数据 ID(AXI3 支持,AXI4 已移除)
WDATA32/64/128/256/512主→从写数据总线
WSTRB数据位宽/8主→从字节选通,每 bit 对应一个字节有效
WLAST1主→从最后一拍指示
WVALID1主→从写数据有效指示
WREADY1从→主从设备准备好接收数据

2.5.2 时序要求

  • WLAST 必须在突发传输的最后一拍置位,且与 WVALID 同步。
  • WSTRB 与 WDATA 必须同时有效,从设备根据 WSTRB 决定哪些字节写入存储器。
  • 写数据通道支持 交错传输(AXI3),但 AXI4 已移除该特性,同一写事务的数据必须连续发送。
  • 主设备可以在 WVALID 置位前等待从设备拉高 WREADY,但必须保证数据不丢失。

2.6 写响应通道(B)

写响应通道由从设备驱动,向主设备返回写事务的完成状态。每个写事务对应一个写响应,且必须在 WLAST 握手之后发出。

2.6.1 信号定义

信号位宽方向描述
BIDn从→主写响应 ID,必须与对应 AWID 一致
BRESP2从→主写响应:00=OKAY, 01=EXOKAY, 10=SLVERR, 11=DECERR
BVALID1从→主写响应有效指示
BREADY1主→从主设备准备好接收响应

2.6.2 时序要求

  • 从设备必须在完成整个写突发(即 WLAST 握手后)才能置位 BVALID。
  • BVALID 与 BREADY 的握手规则与其他通道一致。
  • 写响应通道不支持乱序:同一 ID 的写响应必须按写地址发送顺序返回。
UVM 封装建议: 在构建 AXI 总线功能模型(BFM)时,建议将五个通道分别封装为独立的 uvm_sequencer 和 uvm_driver,并通过 uvm_tlm_fifo 实现通道间的数据传递。例如,写地址通道的地址项需传递给写数据通道和写响应通道,用于地址匹配和响应生成。

2.7 五通道时序关系总览

下图展示了 AXI 读事务与写事务中五个通道的典型时序关系,帮助理解通道间的依赖与并行性。

AXI 五通道时序关系总览 AXI 五通道时序关系总览 读事务(Read Transaction) AR 通道 ARADDR, ARVALID→ARREADY R 通道 RDATA, RVALID→RREADY 延迟 写事务(Write Transaction) AW 通道 AWADDR, AWVALID→AWREADY W 通道 WDATA, WVALID→WREADY B 通道 BRESP, BVALID→BREADY 依赖 WLAST后 关键依赖规则 • 读事务:AR 通道先于 R 通道 • 写事务:AW/W 通道无先后顺序 • B 通道必须在 WLAST 握手后 • 读写事务可完全并行

2.8 通道间依赖关系总结

下表归纳了五个通道之间的依赖关系,是 UVM 验证环境中构造事务序列和检查时序的关键依据:

依赖关系源通道目标通道约束说明
读地址→读数据ARR从设备必须在接收 AR 地址后返回 R 数据
写地址→写响应AWB从设备需根据 AW 地址判断响应状态
写数据→写响应WBB 响应必须在 WLAST 握手之后发出
写地址↔写数据AW / W—无固定顺序,可任意交错
读↔写AR / AW—完全独立,可并行执行
UVM 序列构造技巧: 在编写 AXI 事务序列时,建议将读事务和写事务分别封装为独立的 uvm_sequence_item,并通过 uvm_do_with 约束地址对齐、突发长度和类型。对于写事务,需确保 WLAST 在最后一拍自动置位,避免遗漏。

2.9 典型时序波形示例

以下代码片段展示了 Verilog 中 AXI 写事务的握手时序实现,重点体现 AW、W、B 三个通道的交互:

// AXI 写事务握手时序示例
always @(posedge clk or negedge rst_n) begin
  if (!rst_n) begin
    aw_valid <= 1'b0;
    w_valid  <= 1'b0;
    b_ready  <= 1'b0;
  end else begin
    // 写地址通道:地址有效后等待从设备 ready
    if (aw_valid && aw_ready) begin
      aw_valid <= 1'b0;  // 握手完成,撤销 valid
    end else if (start_write) begin
      aw_valid <= 1'b1;  // 发起写地址
      aw_addr  <= write_addr;
      aw_len   <= burst_len;
    end

    // 写数据通道:数据有效后等待从设备 ready
    if (w_valid && w_ready) begin
      w_valid <= 1'b0;
    end else if (aw_valid && aw_ready) begin
      w_valid <= 1'b1;   // 地址握手后立即发送数据
      w_data  <= write_data[0];
      w_last  <= (burst_len == 0);
    end

    // 写响应通道:主设备准备好接收响应
    if (b_valid && b_ready) begin
      b_ready <= 1'b0;   // 响应接收完成
    end else if (w_last && w_ready) begin
      b_ready <= 1'b1;   // 最后一拍数据握手后准备接收响应
    end
  end
end
仿真调试要点: 在 UVM 环境中,建议在 monitor 中捕获每个通道的 VALID/READY 握手事件,并记录到波形中。重点关注:
① 写事务中 BVALID 是否在 WLAST 握手之后才置位;
② 读事务中 RLAST 是否与最后一拍数据同时有效;
③ 所有通道的 VALID 置位后是否保持稳定直至握手完成。