1. USB协议基础回顾:USB 2.0/3.0体系结构、主机控制器角色、控制传输在枚举过程中的核心地位

1.1 USB 2.0 与 USB 3.0 体系结构对比

USB(Universal Serial Bus)采用分层星形拓扑结构,由主机控制器(Host Controller)、集线器(Hub)和功能设备(Function Device)三级组成。USB 2.0 与 USB 3.0 在物理层、协议层和电气特性上存在显著差异,理解这些差异是进行 FPGA 验证故障排查的基础。

关键概念:USB 2.0 采用半双工、差分信号(D+/D-)传输,由主机轮询所有事务;USB 3.0 引入全双工、差分对(SSTX/SSRX)独立收发通道,并增加了基于包的路由和流控制机制。
特性 USB 2.0 (Hi-Speed) USB 3.0 (SuperSpeed)
信号线 D+, D- (差分对) D+, D- (兼容) + SSTX+, SSTX-, SSRX+, SSRX-
传输模式 半双工,主机轮询 全双工,异步通知
数据传输速率 480 Mbps 5 Gbps (Gen1) / 10 Gbps (Gen2)
编码方式 NRZI + 位填充 8b/10b (Gen1) / 128b/132b (Gen2)
电源管理 全局挂起/唤醒 链路级电源管理 (LPM, U0-U3)
事务协议 令牌包 + 数据包 + 握手包 链路层包 (LUP) + 事务层包 (TP)
端点寻址 设备地址 (7bit) + 端点号 (4bit) 设备地址 (7bit) + 端点号 (4bit) + 流ID (可选)
FPGA验证提示:USB 3.0 的链路训练和均衡(Equalization)过程在 FPGA 验证中极易出现时序问题,建议在仿真阶段重点覆盖 LTSSM(链路训练与状态机)的状态跳转。
USB 2.0 与 USB 3.0 拓扑结构对比 USB 2.0 拓扑 主机控制器 (HC) 根集线器 (Root Hub) 功能设备 (Device) 半双工 D+/D- 总线 主机轮询所有事务 USB 3.0 拓扑 主机控制器 (xHCI) 根集线器 (USB 3.0 Hub) SuperSpeed 设备 全双工 SSTX/SSRX 通道 异步通知 + 流控制

1.2 主机控制器的角色与职责

主机控制器是 USB 系统中唯一能发起事务的实体,负责管理总线带宽、调度传输事务、处理错误恢复以及维护设备状态。在 FPGA 验证中,主机控制器通常以 RTL 设计模块或 VIP(Verification IP)的形式存在。

  • 事务调度:按帧/微帧周期组织事务列表(TD/QH),确保周期性传输(等时、中断)的延迟满足要求。
  • 协议引擎:生成 SOF(帧起始包)、令牌包、数据包和握手包,解析设备返回的响应。
  • DMA 引擎:在系统内存与 USB 总线之间搬运数据,支持描述符链(Linked List)和 scatter-gather。
  • 电源管理:控制链路进入/退出挂起状态,响应远程唤醒事件。
  • 错误处理:检测 CRC 错误、超时、位填充错误、NAK/STALL 握手,并执行重试或报告软件栈。
常见故障点:在 FPGA 验证中,主机控制器的帧计数器(Frame Counter)与设备侧的 SOF 同步是高频故障区域。若帧周期偏差超过 ±1 个 bit 时间,可能导致设备枚举失败或周期性传输丢包。
主机控制器内部架构(xHCI 简化视图) 系统总线接口 (AXI/PCIe) DMA 引擎 / 描述符管理器 USB 协议引擎 事务调度器 (Scheduler) 帧计数器 / SOF 发生器 链路管理 / 电源控制 FPGA 验证关注点: 调度器优先级、帧计数器精度

1.3 控制传输在枚举过程中的核心地位

控制传输是 USB 协议中唯一由主机主动发起、设备必须响应的传输类型。在设备枚举过程中,主机通过控制传输完成以下关键步骤:

  1. 获取设备描述符(Get Device Descriptor):主机读取设备的基本信息(USB 版本、最大包大小、厂商/产品 ID)。
  2. 复位并分配地址(Set Address):主机向设备发送 Set Address 请求,设备进入地址状态。
  3. 获取配置描述符(Get Configuration Descriptor):主机读取设备的配置、接口、端点信息。
  4. 设置配置(Set Configuration):主机选择设备的运行配置,设备进入配置状态,枚举完成。
枚举失败的直接后果:若控制传输在任意步骤中因 CRC 错误、超时、STALL 握手或数据阶段长度不匹配而失败,主机将复位总线并重试枚举。在 FPGA 验证中,控制传输的 Setup 阶段是最容易出错的环节,尤其是令牌包(SETUP PID)的发送时序。
控制传输在枚举过程中的核心流程 1. 获取设备描述符 2. 复位并分配地址 3. 获取配置描述符 4. 设置配置 控制传输阶段 • Setup 阶段:8 字节 请求包 • Data 阶段(可选): 数据包传输 • Status 阶段: 握手确认 FPGA 验证关键: • Setup 令牌 PID 正确 • Data 阶段长度匹配 • Status 阶段 ACK 时序

1.4 控制传输的事务结构

控制传输由三个阶段组成,每个阶段包含一个或多个 USB 事务。在 FPGA 验证中,需要精确控制每个阶段的包格式和时序。

阶段 方向 包序列 关键字段
Setup 阶段 主机 → 设备 SETUP 令牌 + DATA0 (8字节) + ACK bmRequestType, bRequest, wValue, wIndex, wLength
Data 阶段 主机 ↔ 设备 IN/OUT 令牌 + DATA1/DATA0 + 握手 数据包 PID 翻转 (DATA0/DATA1)
Status 阶段 设备 → 主机 IN 令牌 + DATA1 (0长度) + ACK 零长度数据包 (ZLP)
验证技巧:在仿真环境中,建议使用断言(Assertion)检查 Setup 阶段的 wLength 字段是否与后续 Data 阶段的实际数据长度一致。长度不匹配是导致设备 STALL 的常见原因。

1.5 枚举过程中的常见故障模式

基于 FPGA 验证经验,控制传输在枚举过程中最容易出现以下故障:

  • Setup 令牌 PID 错误:主机发送的 SETUP 令牌包 PID 被误识别为 OUT 或 IN,导致设备忽略请求。
  • Data 阶段 PID 翻转错误:控制传输要求 Data 阶段使用 DATA1,而 Status 阶段使用 DATA0。若 PID 翻转逻辑错误,设备将丢弃数据包。
  • Status 阶段超时:设备在 Status 阶段未及时返回 ACK,主机超时后复位总线。
  • 描述符长度不匹配:设备返回的描述符实际长度与 Setup 阶段 wLength 字段不一致,主机可能截断或重试。
故障排查优先级:当枚举失败时,应首先检查 Setup 阶段的令牌包波形,确认 PID 为 0x2D(SETUP),且 CRC5 校验正确。其次检查 Data 阶段的 DATA PID 是否为 DATA1(0x4B)。这两个检查点覆盖了 80% 以上的控制传输故障。
控制传输包序列时序(Setup + Data + Status) SETUP 令牌 DATA0 (8B) ACK IN/OUT DATA1 (nB) ACK IN 令牌 DATA0 (0B) ACK Setup 阶段 Data 阶段 Status 阶段

1.6 小结:控制传输验证的关键检查点

在 FPGA 验证环境中,针对控制传输的故障排查应建立以下检查清单:

检查项 预期值 验证方法
Setup 令牌 PID 0x2D (二进制 0010 1101) 波形检查 / 协议分析器
Setup 数据包长度 8 字节 计数器断言
Data 阶段 PID DATA1 (0x4B) 或 DATA0 (0xC3) 按规则翻转 PID 序列检查
Status 阶段数据长度 0 字节 (ZLP) 长度检测
ACK 握手超时 ≤ 16 bit 时间 (HS) / ≤ 512 bit 时间 (FS) 时序检查
CRC5 / CRC16 与包内容匹配 CRC 计算器断言