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 图展示了这三种握手模型的时序波形:

AXI4-Lite 三种握手时序模型 AXI4-Lite 三种握手时序模型 CLK 模型1: VALID 先就绪 VALID READY 传输 模型2: READY 先就绪 VALID READY 传输 模型3: 同时就绪 VALID READY 传输

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 通道)的握手依赖关系与数据流:

AXI4-Lite 写事务握手依赖关系 AXI4-Lite 写事务握手依赖关系 主机 (Master) 从机 (Slave) 写地址通道 (AW) AWVALID → AWREADY 写数据通道 (W) WVALID → WREADY 写响应通道 (B) BVALID ← BREADY 依赖关系:从机必须在 AW 和 W 握手完成后,才能断言 BVALID

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 信号的不正确依赖关系。