4、AXI4-Lite从机握手协议:VALID与READY信号的握手时序与依赖关系
AXI4-Lite 接口的核心通信机制建立在 VALID 与 READY 两个控制信号的握手协议之上。无论是读地址通道、写地址通道、写数据通道还是写响应通道,均遵循相同的握手规则。理解这两个信号的时序关系与依赖条件,是设计可靠 AXI4-Lite 从机接口的前提。
4.1 握手协议的基本规则
AXI4-Lite 的每个通道都使用 VALID/READY 握手机制来协调主从设备之间的数据传输。其基本规则如下:
- VALID:由源端(发送方)驱动,表示当前通道上的地址、数据或控制信息有效。
- READY:由目的端(接收方)驱动,表示目的端已准备好接收数据。
- 数据传输发生的条件:当 VALID 和 READY 同时为高电平 时,在时钟上升沿完成一次数据传输。
设计要点: 在从机接口设计中,VALID 信号通常由从机逻辑产生(如写响应通道的 BVALID),而 READY 信号则由主机提供。从机必须正确采样主机的 READY 信号,并据此控制自身 VALID 信号的断言与撤销。
4.2 三种握手时序模型
根据 VALID 和 READY 信号到达的先后顺序,握手时序可分为三种基本模型。下表总结了这三种模型的特点:
| 模型名称 | VALID 先就绪 | READY 先就绪 | 同时就绪 |
|---|---|---|---|
| 描述 | 源端先断言 VALID,等待目的端断言 READY | 目的端先断言 READY,等待源端断言 VALID | VALID 和 READY 在同一时钟周期内同时断言 |
| 传输延迟 | 至少 1 个时钟周期(等待 READY) | 至少 1 个时钟周期(等待 VALID) | 0 个等待周期,立即传输 |
| 从机设计关注点 | VALID 不能依赖 READY 再断言 | 从机需在 READY 有效时准备好数据 | 最理想情况,但需同时满足条件 |
下面的 SVG 图展示了这三种握手模型的时序波形:
4.3 信号依赖关系与从机设计约束
在 AXI4-Lite 从机接口设计中,VALID 与 READY 信号之间存在明确的依赖关系,这些关系决定了从机状态机的设计方式。
4.3.1 VALID 信号的依赖规则
- VALID 不能依赖 READY:源端在断言 VALID 时,不能 等待目的端的 READY 信号。VALID 必须在数据有效时立即断言,无论 READY 状态如何。
- VALID 必须保持稳定:一旦 VALID 被断言,它必须保持高电平,直到握手发生(VALID 和 READY 同时为高),然后才能在下一个时钟周期撤销。
- 例外情况:如果源端无法继续提供有效数据,可以在握手发生前撤销 VALID,但 AXI 协议不推荐这种做法,因为它可能导致死锁。
4.3.2 READY 信号的依赖规则
- READY 可以依赖 VALID:目的端可以等待 VALID 断言后再断言 READY,这是最常见的从机设计方式。
- READY 也可以提前断言:目的端可以在 VALID 断言之前就断言 READY,表示“我随时可以接收”。这种方式可以减少传输延迟。
- READY 的撤销:一旦握手发生,READY 可以在下一个时钟周期撤销,但通常建议保持到下一次需要时再断言。
常见设计陷阱: 从机在写响应通道(B通道)中,BVALID 必须在从机完成写操作后才能断言。如果从机在 BVALID 断言后等待 BREADY 期间又收到新的写请求,必须确保不会覆盖尚未完成响应的写事务。建议使用 FIFO 或状态机来管理多个未完成事务。
4.4 握手协议在 AXI4-Lite 各通道中的应用
AXI4-Lite 的五个独立通道均使用 VALID/READY 握手,但每个通道的依赖关系略有不同。下表总结了各通道的握手特点:
| 通道 | 源端 | 目的端 | VALID 信号 | READY 信号 | 特殊依赖 |
|---|---|---|---|---|---|
| 读地址 (AR) | 主机 | 从机 | ARVALID | ARREADY | 从机可在 ARVALID 有效时再断言 ARREADY |
| 读数据 (R) | 从机 | 主机 | RVALID | RREADY | 从机必须在读数据准备好后才断言 RVALID |
| 写地址 (AW) | 主机 | 从机 | AWVALID | AWREADY | 从机可在 AWVALID 有效时再断言 AWREADY |
| 写数据 (W) | 主机 | 从机 | WVALID | WREADY | WLAST 信号标识最后一个数据 |
| 写响应 (B) | 从机 | 主机 | BVALID | BREADY | 从机必须在写事务完成后才断言 BVALID |
下面的 SVG 图展示了 AXI4-Lite 从机接口中,写事务(AW、W、B 通道)的握手依赖关系与数据流:
4.5 从机握手状态机设计示例
以下是一个典型的 AXI4-Lite 从机写事务状态机 Verilog 代码片段,展示了 VALID/READY 握手的实现方式:
// AXI4-Lite 从机写事务状态机示例
localparam IDLE = 2'b00;
localparam WAIT_AW = 2'b01;
localparam WAIT_W = 2'b10;
localparam RESP = 2'b11;
reg [1:0] state, next_state;
// 状态转移逻辑
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
state <= IDLE;
else
state <= next_state;
end
// 下一状态组合逻辑
always @(*) begin
next_state = state;
case (state)
IDLE: begin
if (AWVALID && AWREADY) // 地址握手成功
next_state = WAIT_W;
end
WAIT_W: begin
if (WVALID && WREADY) // 数据握手成功
next_state = RESP;
end
WAIT_AW: begin
if (AWVALID && AWREADY) // 地址握手成功
next_state = WAIT_W;
end
RESP: begin
if (BVALID && BREADY) // 响应握手成功
next_state = IDLE;
end
endcase
end
// 输出信号生成
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
AWREADY <= 1'b0;
WREADY <= 1'b0;
BVALID <= 1'b0;
BRESP <= 2'b00;
end else begin
case (state)
IDLE: begin
AWREADY <= 1'b1; // 从机准备好接收地址
WREADY <= 1'b0;
BVALID <= 1'b0;
end
WAIT_W: begin
AWREADY <= 1'b0;
WREADY <= 1'b1; // 从机准备好接收数据
BVALID <= 1'b0;
end
RESP: begin
AWREADY <= 1'b0;
WREADY <= 1'b0;
BVALID <= 1'b1; // 从机断言写响应
BRESP <= 2'b00; // OKAY 响应
end
endcase
end
end
设计要点总结:
- 从机的 AWREADY 和 WREADY 可以独立于主机的 VALID 信号提前断言,以减少等待周期。
- BVALID 必须在写操作完成后才能断言,且不能依赖 BREADY 的状态。
- 在 RESP 状态中,BVALID 保持高电平直到 BREADY 有效,完成握手后返回 IDLE。
- 如果从机需要处理多个未完成事务,必须使用更复杂的 FIFO 或流水线结构。
4.6 握手协议的死锁避免
AXI4-Lite 协议在设计上避免了死锁,但不当的从机实现仍可能导致死锁。以下是一些关键避免策略:
- 避免循环依赖:确保从机不会在等待一个通道的 READY 时,阻塞另一个通道的 VALID 断言。例如,不要在断言 BVALID 之前等待 AWREADY。
- 使用超时机制:在复杂系统中,建议为每个通道添加超时计数器,防止主机或从机无限期等待。
- 遵循协议顺序:写事务必须遵循 AW → W → B 的顺序,读事务必须遵循 AR → R 的顺序。从机不应在未收到地址时断言数据或响应。
- 正确处理 WLAST:在写数据通道中,WLAST 信号标识最后一个数据。从机必须等待 WLAST 有效后才能断言 BVALID。
调试建议: 在 Vivado 仿真中,使用
AXI Verification IP (VIP) 可以自动检查握手协议违规。建议在仿真阶段启用协议检查器,捕获 VALID/READY 信号的不正确依赖关系。