3. AXI握手机制:VALID/READY握手协议、依赖关系、传输类型

AXI总线协议的核心在于其高效的通道分离与握手机制。所有事务(读地址、读数据、写地址、写数据、写响应)均通过独立的通道进行传输,每个通道都使用一套统一的VALID/READY握手协议来协调主从设备之间的数据流。理解这一机制是进行AXI接口封装与仿真调试的基础。

3.1 VALID/READY握手协议

VALID/READY握手协议是一种点对点的、基于令牌的流控机制。它通过两个控制信号来管理数据传输的启动与完成:

  • VALID:由发送方驱动。当发送方将数据、地址或控制信息稳定地放置在通道总线上时,将VALID置为高电平,表示当前数据有效。
  • READY:由接收方驱动。当接收方准备好接收数据时,将READY置为高电平,表示当前周期可以完成一次传输。

一次成功的握手(即一个传输节拍)发生在时钟上升沿,且VALID和READY同时为高的时刻。根据VALID和READY的时序关系,握手过程存在三种基本场景:

场景 VALID READY 说明
标准握手 先高 后高 发送方先准备好数据,等待接收方就绪后完成传输。这是最常见的场景。
提前握手 后高 先高 接收方提前声明就绪,等待发送方提供有效数据。此场景下,数据一旦有效即可立即传输,零等待。
同时握手 同时高 同时高 双方在同一周期内同时声明有效和就绪,传输立即完成,无气泡周期。
验证要点:在UVM验证环境中,必须覆盖所有三种握手场景,特别是“提前握手”和“同时握手”的边界情况,以确保DUT的流控逻辑正确。建议使用断言(SVA)来检查VALID在未握手成功前不得撤销(即保持稳定)。
AXI VALID/READY 握手时序与依赖关系 VALID/READY 握手时序与依赖关系 CLK 标准握手 VALID 先高 READY 后高 传输完成 提前握手 READY 先高 VALID 后高 传输完成 依赖关系规则 • 发送方不能等待READY才置VALID • 接收方可以等待VALID再置READY • 握手成功后,双方必须更新状态

3.2 握手依赖关系

VALID/READY协议虽然简单,但其背后的依赖关系是验证中容易出错的地方。协议规范定义了严格的依赖规则,以防止死锁和未知状态:

  • VALID不得依赖READY:发送方在置位VALID时,不能等待接收方的READY信号。VALID必须仅依赖于发送方内部的状态(如数据已准备好、地址已计算完毕)。这是防止死锁的核心规则。
  • READY可以依赖VALID:接收方可以选择在检测到VALID有效后再置位READY,也可以提前置位。这种灵活性允许接收方实现不同的流控策略(如按需接收、预取等)。
  • 握手成功后必须更新:一旦VALID和READY同时为高,本次传输完成。发送方必须在下一个周期更新数据或撤销VALID;接收方必须更新其内部状态,并可以调整READY信号。
常见验证陷阱:在编写UVM driver时,如果driver在置位VALID后,错误地等待DUT的READY才更新内部状态,会导致仿真死锁。正确的做法是:driver在置位VALID的同一周期就准备好下一笔数据,但仅在握手成功后(即采样到READY为高)才将下一笔数据驱动到总线上。

3.3 传输类型

AXI协议支持多种传输类型,以满足不同应用场景的需求。其中,突发传输和非对齐传输是验证中的重点和难点。

3.3.1 突发传输(Burst Transfer)

突发传输是AXI协议提高总线带宽的核心特性。它允许主设备在一次地址相位后,连续传输多笔数据,而无需为每笔数据重新发送地址。突发传输由以下信号控制:

信号 宽度 描述
AxLEN 8 bits 突发长度。定义突发中传输的数据节拍数。实际节拍数 = AxLEN + 1。支持1~256笔传输。
AxSIZE 3 bits 突发大小。定义每笔传输的字节数。编码:0=1B, 1=2B, 2=4B, 3=8B, 4=16B, 5=32B, 6=64B, 7=128B。
AxBURST 2 bits 突发类型。定义地址递增方式:0=FIXED(固定地址),1=INCR(递增),2=WRAP(回环),3=保留。

三种突发类型的地址计算规则如下:

  • FIXED:每次传输使用相同的地址。适用于对同一端口进行多次操作(如FIFO)。
  • INCR:每次传输后,地址递增 AxSIZE 字节。适用于顺序内存访问。
  • WRAP:地址递增,但到达边界后回环到起始地址。边界 = AxLEN * AxSIZE。适用于缓存行填充。
AXI 突发传输地址计算示例 突发传输地址计算示例 (AxLEN=3, AxSIZE=4B, 共4笔传输) INCR 递增 0x100 0x104 0x108 0x10C WRAP 回环 0x10C 0x100 0x104 0x108 边界计算 • 边界 = AxLEN * AxSIZE = 3 * 4 = 16B • WRAP起始地址 = 0x10C • 回环后地址 = 0x10C + 4 = 0x110 → 0x100 • 地址对齐要求:起始地址必须对齐到边界

3.3.2 非对齐传输(Unaligned Transfer)

AXI协议原生支持非对齐传输,即起始地址不必与传输大小(AxSIZE)对齐。这是通过字节通道选通信号(WSTRB)和地址的低位来实现的。

非对齐传输的关键规则:

  • 地址低位指示偏移:对于写传输,地址的低位(AxADDR[1:0] 对于32位总线)指示了第一个有效字节在数据总线上的位置。
  • WSTRB决定有效字节:写数据通道的WSTRB信号,每一位对应一个字节通道。非对齐传输时,WSTRB的起始位与地址低位对齐。
  • 读传输自动对齐:对于读传输,从设备必须返回对齐的数据,主设备根据地址低位自行提取有效字节。
UVM验证策略:在构建AXI sequence时,必须随机化地址的低位,以覆盖非对齐场景。建议使用约束:
class AxiUnalignedSeq extends uvm_sequence #(AxiTx);
    rand bit [1:0] addr_offset;
    constraint c_unaligned {
      addr_offset inside {1, 2, 3}; // 非对齐偏移
      m_axi_tx.addr[1:0] == addr_offset;
    }
    // ...
  endclass

3.4 传输类型总结

下表总结了不同传输类型的核心特征及其在验证中的关注点:

传输类型 地址变化 典型应用 验证关注点
单次传输 固定 寄存器访问 握手时序、响应信号
突发-FIXED 不变 FIFO操作、状态寄存器轮询 地址保持、WSTRB稳定性
突发-INCR 递增 DMA传输、内存拷贝 地址边界跨越、数据连续性
突发-WRAP 回环 Cache line fill 回环边界计算、地址对齐
非对齐传输 任意 协议栈处理、数据包解析 WSTRB生成、地址低位解析
调试建议:在仿真调试阶段,建议在monitor中打印完整的握手信息,包括VALID/READY的时序关系、突发参数(LEN/SIZE/BURST)以及地址变化轨迹。使用UVM的`uvm_info`配合`AXI_TRACE`冗余级别,可以快速定位握手死锁或地址计算错误。