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(链路训练与状态机)的状态跳转。
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 时间,可能导致设备枚举失败或周期性传输丢包。
1.3 控制传输在枚举过程中的核心地位
控制传输是 USB 协议中唯一由主机主动发起、设备必须响应的传输类型。在设备枚举过程中,主机通过控制传输完成以下关键步骤:
- 获取设备描述符(Get Device Descriptor):主机读取设备的基本信息(USB 版本、最大包大小、厂商/产品 ID)。
- 复位并分配地址(Set Address):主机向设备发送 Set Address 请求,设备进入地址状态。
- 获取配置描述符(Get Configuration Descriptor):主机读取设备的配置、接口、端点信息。
- 设置配置(Set Configuration):主机选择设备的运行配置,设备进入配置状态,枚举完成。
枚举失败的直接后果:若控制传输在任意步骤中因 CRC 错误、超时、STALL 握手或数据阶段长度不匹配而失败,主机将复位总线并重试枚举。在 FPGA 验证中,控制传输的 Setup 阶段是最容易出错的环节,尤其是令牌包(SETUP PID)的发送时序。
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% 以上的控制传输故障。
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 计算器断言 |