4. Detect状态(退出条件):成功检测到远端设备或超时重试
Detect状态是PCIe链路训练状态机(LTSSM)的初始物理层状态。当链路从复位或低功耗状态进入Detect时,物理层尚未确认对端设备的存在。本章聚焦于Detect状态的两个退出条件:成功检测到远端设备(从Detect.Quiet迁移至Detect.Active)以及超时重试机制。
4.1 Detect状态子状态划分
Detect状态内部包含两个子状态:Detect.Quiet和Detect.Active。退出条件在这两个子状态中分别触发。
| 子状态 | 持续时间 | 行为描述 | 退出条件 |
|---|---|---|---|
| Detect.Quiet | 12 ms(典型) | 发送器保持电气静默(Common Mode电压),等待对端信号 | 检测到接收端阻抗变化(远端设备存在)→ 进入Detect.Active |
| Detect.Active | 最多2个训练序列(TS)周期 | 发送器发出脉冲探测信号,主动探测对端设备 | 成功检测到远端设备 → 进入Polling状态;超时 → 返回Detect.Quiet |
关键指标:Detect.Quiet的静默时间由PCIe Base Spec规定为至少12 ms,这是为了保证链路两端能够同步退出低功耗状态。实际硬件实现中,该时间可能略有浮动,但必须满足最小时间要求。
4.2 退出条件一:成功检测到远端设备(Detect.Quiet → Detect.Active)
当链路处于Detect.Quiet子状态时,接收器持续监测差分信号线上的阻抗变化。远端设备的存在会导致接收端差分阻抗从高阻(约10 kΩ)变为低阻(约100 Ω)。一旦检测到该变化,状态机立即从Detect.Quiet迁移至Detect.Active。
在Detect.Active中,发送器发出探测脉冲(Detection Pulse),该脉冲是一个宽度为2个UI(Unit Interval)的差分信号。接收器通过回波反射或信号完整性分析确认远端设备的存在。若确认成功,则退出Detect状态,进入Polling状态。
检测成功条件:
- 接收端阻抗从高阻(>10 kΩ)跳变至低阻(<150 Ω)
- 探测脉冲的回波幅度超过阈值(通常为200 mV差分摆幅)
- 连续2个探测脉冲均被正确识别
4.3 退出条件二:超时重试
若在Detect.Quiet中等待12 ms后仍未检测到远端设备,状态机不会无限等待,而是触发超时重试机制。此时状态机从Detect.Quiet直接返回Detect.Quiet(即重新开始静默等待),并递增内部重试计数器。
超时重试的典型流程如下:
- 进入Detect.Quiet,启动12 ms定时器
- 定时器溢出,未检测到远端设备
- 重试计数器加1
- 若重试次数 < 最大值(通常为3次),则重新进入Detect.Quiet
- 若重试次数达到最大值,则链路标记为链路失败(Link Down),上报错误
工程陷阱:某些早期PCIe实现中,Detect.Quiet超时时间被错误配置为10 ms,导致与对端设备时序不匹配,链路反复进入Detect状态无法建立。务必确认硬件设计中的定时器精度在±5%以内。
4.4 Detect状态迁移流程图
以下SVG图展示了Detect状态内部的两个子状态及其退出条件,包括成功检测路径和超时重试路径。
4.5 退出条件对比总结
| 退出条件 | 触发子状态 | 迁移目标 | 典型时间 | 失败处理 |
|---|---|---|---|---|
| 成功检测到远端设备 | Detect.Quiet → Detect.Active | Polling状态 | 12 ms + 2个TS周期(约2 μs) | 无失败路径(检测成功即迁移) |
| 超时重试 | Detect.Quiet | 重新进入Detect.Quiet | 12 ms(每次超时) | 重试3次后标记链路失败 |
4.6 硬件实现注意事项
- 阻抗检测精度:接收器必须能够区分高阻(>10 kΩ)和低阻(<150 Ω),建议使用比较器阈值设定在500 Ω左右以留出裕量。
- 定时器精度:12 ms定时器建议使用硬件计数器实现,避免软件延迟导致超时误判。
- 重试计数器:建议使用3位计数器(最大7次),但PCIe Base Spec推荐最大重试次数为3次,超过后上报链路失败。
- 探测脉冲宽度:必须严格保持2个UI宽度,过宽或过窄会导致对端设备无法正确识别。
实战案例:某FPGA实现PCIe EP时,Detect.Quiet定时器使用软件循环计数,由于中断延迟导致实际超时时间达到15 ms,与RC端12 ms不匹配,链路反复进入Detect状态。解决方案:改用硬件定时器,并将超时时间配置为12 ms ± 1%。