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在未握手成功前不得撤销(即保持稳定)。
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。适用于缓存行填充。
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`冗余级别,可以快速定位握手死锁或地址计算错误。