五通道、握手与背压
返回 项目总览。
AXI4-Lite 面向单拍、无 ID 的寄存器访问。它没有 AXI4 的 burst、事务 ID 和乱序返回,但仍保留五条彼此独立的通道。
五条通道分别传什么
| 通道 | 方向 | 主要信号 | 项目中的含义 |
|---|---|---|---|
| AW | master → slave | AWADDR/AWVALID/AWREADY | 写地址 |
| W | master → slave | WDATA/WSTRB/WVALID/WREADY | 写数据和字节使能 |
| B | slave → master | BRESP/BVALID/BREADY | 写响应 |
| AR | master → slave | ARADDR/ARVALID/ARREADY | 读地址 |
| R | slave → master | RDATA/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 或乱序规则。
自测
- AW 在第 3 周期握手、W 在第 7 周期握手,最早什么时候可以产生 B 响应?
RVALID=1、RREADY=0连续三周期时,哪些信号必须保持不变?- 为什么只在 monitor 看到
VALID时采样会产生重复或虚假事务?
答案要点:完整写事务要等第二个通道完成;R payload 和 RVALID 必须稳定;采样点必须是 VALID && READY。
下一篇:通用寄存器 RTL。