五通道、握手与背压

返回 项目总览。

AXI4-Lite 面向单拍、无 ID 的寄存器访问。它没有 AXI4 的 burst、事务 ID 和乱序返回,但仍保留五条彼此独立的通道。

五条通道分别传什么

通道方向主要信号项目中的含义
AWmaster → slaveAWADDR/AWVALID/AWREADY写地址
Wmaster → slaveWDATA/WSTRB/WVALID/WREADY写数据和字节使能
Bslave → masterBRESP/BVALID/BREADY写响应
ARmaster → slaveARADDR/ARVALID/ARREADY读地址
Rslave → masterRDATA/RRESP/RVALID/RREADY读数据和响应

任何通道都只在时钟上升沿满足下面条件时完成一次传输:

handshake = valid && ready;

VALID=1 表示发送方已经提供有效 payload,READY=1 表示接收方可以接收。只看到其中一方拉高,不能宣称事务已经发生。

写事务为什么比读事务复杂

读路径是 AR 握手后产生 R 响应;写路径必须把 AW 和 W 两个独立通道配对,再产生 B 响应。

AW 与 W 没有固定先后顺序

master 可以先发地址、先发数据,或让两者同周期握手。slave 不能假设 AWVALID 与 WVALID 永远同时出现。

项目中的 DUT 分别记录 awaddr_valid 与 wdata_valid。只有地址和数据都已经保存或正在当前周期握手时,write_fire 才成立:

wire write_fire = !s_axi_bvalid &&
                  (awaddr_valid || aw_accept) &&
                  (wdata_valid  || w_accept);

这也是 driver 用两个并发线程分别发送 AW 和 W 的原因:验证环境要主动探索不同到达顺序,而不是只验证最理想的同周期情况。

背压是什么

如果接收方暂时不准备接收,就保持 READY=0。此时发送方必须保持 VALID 和 payload 稳定,直到握手完成。

  • AW 被阻塞时,AWVALID 和 AWADDR 保持稳定。
  • W 被阻塞时,WVALID、WDATA、WSTRB 保持稳定。
  • B 被阻塞时,slave 保持 BVALID 和 BRESP。
  • R 被阻塞时,slave 保持 RVALID、RDATA、RRESP。

项目的 axi_lite_backpressure_test 把 driver 的 ready 延迟上限从 3 个周期提高到 8 个周期,主要考察 DUT 能否在 master 暂不接收 B/R 响应时稳定保存输出。

当前实现的并发能力

通用 DUT 在前一笔 B 响应完成前不再接受下一笔 AW/W,在前一笔 R 响应完成前也不接受下一笔 AR:

assign s_axi_awready = !awaddr_valid && !s_axi_bvalid;
assign s_axi_wready  = !wdata_valid  && !s_axi_bvalid;
assign s_axi_arready = !s_axi_rvalid;

所以它支持读写通路彼此并行,但每个方向只保留一笔未完成事务。这是面积小、行为清楚的寄存器从设备实现,不应把它描述成高吞吐、多 outstanding 的总线桥。

常见误区

VALID 不能等待 READY 才拉高

如果发送方等 READY,接收方又等 VALID,双方可能永久等待。发送方应在 payload 准备好后独立拉高 VALID。

  • BVALID 不能只等 AW:写响应必须在 AW 和 W 都完成之后产生。
  • ARVALID && ARREADY 只是接受读地址,不代表 master 已接受返回数据。
  • backpressure 不是错误,它是协议允许的流量控制。
  • AXI4-Lite 没有 burst,不能直接套用 AxLEN、WLAST、ID 或乱序规则。

自测

  1. AW 在第 3 周期握手、W 在第 7 周期握手,最早什么时候可以产生 B 响应?
  2. RVALID=1、RREADY=0 连续三周期时,哪些信号必须保持不变?
  3. 为什么只在 monitor 看到 VALID 时采样会产生重复或虚假事务?

答案要点:完整写事务要等第二个通道完成;R payload 和 RVALID 必须稳定;采样点必须是 VALID && READY。

下一篇:通用寄存器 RTL。