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 信号定义
| 信号 | 位宽 | 方向 | 描述 |
|---|---|---|---|
| ARID | n | 主→从 | 读地址 ID,用于匹配读数据返回的 RID |
| ARADDR | 32/64 | 主→从 | 读起始地址,必须对齐到突发长度 × 数据位宽 |
| ARLEN | 8 | 主→从 | 突发长度,实际传输次数 = ARLEN + 1 |
| ARSIZE | 3 | 主→从 | 每拍数据字节数:3'b000=1B, 3'b001=2B, …, 3'b101=32B |
| ARBURST | 2 | 主→从 | 突发类型:00=FIXED, 01=INCR, 10=WRAP |
| ARLOCK | 2 | 主→从 | 传输锁定类型:00=正常, 01=独占, 10=锁定 |
| ARCACHE | 4 | 主→从 | 缓存属性:可缓存/缓冲/分配策略 |
| ARPROT | 3 | 主→从 | 保护单元:特权/安全/指令数据 |
| ARVALID | 1 | 主→从 | 地址有效指示 |
| ARREADY | 1 | 从→主 | 从设备准备好接收地址 |
2.2.2 时序要求
- ARVALID 置位后,ARADDR 及所有控制信号必须保持稳定,直到 ARREADY 被拉高且握手完成。
- 从设备可以在 ARVALID 置位前就拉高 ARREADY(提前准备),但必须在 ARVALID 有效时采样地址。
- 读地址通道与读数据通道之间无固定时序依赖,从设备可在接收地址后任意周期返回数据。
2.3 读数据通道(R)
读数据通道由从设备驱动,向主设备返回读请求的数据及响应状态。该通道支持乱序返回,通过 RID 与 ARID 匹配。
2.3.1 信号定义
| 信号 | 位宽 | 方向 | 描述 |
|---|---|---|---|
| RID | n | 从→主 | 读数据 ID,必须与对应 ARID 一致 |
| RDATA | 32/64/128/256/512 | 从→主 | 读数据总线 |
| RRESP | 2 | 从→主 | 读响应:00=OKAY, 01=EXOKAY, 10=SLVERR, 11=DECERR |
| RLAST | 1 | 从→主 | 最后一拍指示,用于标记突发传输结束 |
| RVALID | 1 | 从→主 | 读数据有效指示 |
| RREADY | 1 | 主→从 | 主设备准备好接收数据 |
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 信号定义
| 信号 | 位宽 | 方向 | 描述 |
|---|---|---|---|
| AWID | n | 主→从 | 写地址 ID,用于匹配写响应 BID |
| AWADDR | 32/64 | 主→从 | 写起始地址 |
| AWLEN | 8 | 主→从 | 突发长度,实际传输次数 = AWLEN + 1 |
| AWSIZE | 3 | 主→从 | 每拍数据字节数 |
| AWBURST | 2 | 主→从 | 突发类型 |
| AWLOCK | 2 | 主→从 | 传输锁定类型 |
| AWCACHE | 4 | 主→从 | 缓存属性 |
| AWPROT | 3 | 主→从 | 保护单元 |
| AWVALID | 1 | 主→从 | 写地址有效指示 |
| AWREADY | 1 | 从→主 | 从设备准备好接收写地址 |
2.4.2 时序要求
- 写地址通道与写数据通道之间无严格时序依赖,主设备可以先发地址后发数据,也可以先发数据后发地址,或同时发送。
- 从设备必须在接收到 AWADDR 和 W 数据后,才能产生写响应 B 通道的响应。
- AWVALID 与 ARVALID 可以同时置位,实现读写并行。
2.5 写数据通道(W)
写数据通道由主设备驱动,向从设备发送待写入的数据及字节选通信号。该通道是 AXI 中唯一包含字节使能的通道。
2.5.1 信号定义
| 信号 | 位宽 | 方向 | 描述 |
|---|---|---|---|
| WID | n | 主→从 | 写数据 ID(AXI3 支持,AXI4 已移除) |
| WDATA | 32/64/128/256/512 | 主→从 | 写数据总线 |
| WSTRB | 数据位宽/8 | 主→从 | 字节选通,每 bit 对应一个字节有效 |
| WLAST | 1 | 主→从 | 最后一拍指示 |
| WVALID | 1 | 主→从 | 写数据有效指示 |
| WREADY | 1 | 从→主 | 从设备准备好接收数据 |
2.5.2 时序要求
- WLAST 必须在突发传输的最后一拍置位,且与 WVALID 同步。
- WSTRB 与 WDATA 必须同时有效,从设备根据 WSTRB 决定哪些字节写入存储器。
- 写数据通道支持 交错传输(AXI3),但 AXI4 已移除该特性,同一写事务的数据必须连续发送。
- 主设备可以在 WVALID 置位前等待从设备拉高 WREADY,但必须保证数据不丢失。
2.6 写响应通道(B)
写响应通道由从设备驱动,向主设备返回写事务的完成状态。每个写事务对应一个写响应,且必须在 WLAST 握手之后发出。
2.6.1 信号定义
| 信号 | 位宽 | 方向 | 描述 |
|---|---|---|---|
| BID | n | 从→主 | 写响应 ID,必须与对应 AWID 一致 |
| BRESP | 2 | 从→主 | 写响应:00=OKAY, 01=EXOKAY, 10=SLVERR, 11=DECERR |
| BVALID | 1 | 从→主 | 写响应有效指示 |
| BREADY | 1 | 主→从 | 主设备准备好接收响应 |
2.6.2 时序要求
- 从设备必须在完成整个写突发(即 WLAST 握手后)才能置位 BVALID。
- BVALID 与 BREADY 的握手规则与其他通道一致。
- 写响应通道不支持乱序:同一 ID 的写响应必须按写地址发送顺序返回。
UVM 封装建议: 在构建 AXI 总线功能模型(BFM)时,建议将五个通道分别封装为独立的
uvm_sequencer 和 uvm_driver,并通过 uvm_tlm_fifo 实现通道间的数据传递。例如,写地址通道的地址项需传递给写数据通道和写响应通道,用于地址匹配和响应生成。
2.7 五通道时序关系总览
下图展示了 AXI 读事务与写事务中五个通道的典型时序关系,帮助理解通道间的依赖与并行性。
2.8 通道间依赖关系总结
下表归纳了五个通道之间的依赖关系,是 UVM 验证环境中构造事务序列和检查时序的关键依据:
| 依赖关系 | 源通道 | 目标通道 | 约束说明 |
|---|---|---|---|
| 读地址→读数据 | AR | R | 从设备必须在接收 AR 地址后返回 R 数据 |
| 写地址→写响应 | AW | B | 从设备需根据 AW 地址判断响应状态 |
| 写数据→写响应 | W | B | B 响应必须在 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 置位后是否保持稳定直至握手完成。
① 写事务中 BVALID 是否在 WLAST 握手之后才置位;
② 读事务中 RLAST 是否与最后一拍数据同时有效;
③ 所有通道的 VALID 置位后是否保持稳定直至握手完成。