4. TxIdle 与 RxIdle 状态机:发送端与接收端的空闲状态定义
在 PCIe 链路进入 L0s 低功耗状态之前,发送端(Tx)和接收端(Rx)必须分别确认其物理层逻辑处于“空闲”状态。TxIdle 与 RxIdle 状态机是链路空闲检测的核心组件,它们独立运行于链路的每一端,通过检测数据流中的特定条件来判定是否允许发起 L0s 入口请求。
4.1 发送端空闲状态机(TxIdle)
TxIdle 状态机位于发送端 MAC 子层,负责监控发送数据路径上的活动。当发送端连续发送特定数量的“逻辑空闲”(Logical Idle)符号,且没有待发送的 TLP/DLLP 时,状态机判定链路进入 TxIdle 状态。
关键判定条件: TxIdle 状态要求发送端连续发送 8 个 以上的 SKP Ordered Set(SKP OS),且发送缓冲区为空,无待处理的流量控制更新或数据包。
TxIdle 状态机的状态转换如下表所示:
| 当前状态 | 触发条件 | 下一状态 | 说明 |
|---|---|---|---|
| TxActive | 发送缓冲区非空,或正在发送 TLP/DLLP | TxActive | 正常数据发送阶段 |
| TxActive | 发送缓冲区为空,且连续发送 8 个 SKP OS | TxIdle | 进入发送空闲状态 |
| TxIdle | 发送缓冲区收到新数据(TLP/DLLP) | TxActive | 退出空闲,恢复发送 |
| TxIdle | 链路层请求进入 L0s | TxL0sEntry | 启动 L0s 入口序列 |
设计要点: TxIdle 状态机必须使用“连续 8 个 SKP OS”作为判定阈值,而非单个 SKP OS。这是为了防止因链路抖动或短暂的空闲窗口导致误判,确保链路确实处于稳定空闲状态。
4.2 接收端空闲状态机(RxIdle)
RxIdle 状态机位于接收端 MAC 子层,负责监控接收数据路径上的符号流。接收端通过检测接收到的符号序列是否连续为“逻辑空闲”符号,来判断链路对端是否已停止发送有效数据。
关键判定条件: RxIdle 状态要求接收端连续检测到 8 个 以上的 SKP Ordered Set,且接收缓冲区为空,无正在接收的 TLP/DLLP。
RxIdle 状态机的状态转换如下表所示:
| 当前状态 | 触发条件 | 下一状态 | 说明 |
|---|---|---|---|
| RxActive | 接收缓冲区非空,或正在接收 TLP/DLLP | RxActive | 正常数据接收阶段 |
| RxActive | 接收缓冲区为空,且连续收到 8 个 SKP OS | RxIdle | 进入接收空闲状态 |
| RxIdle | 接收缓冲区收到新数据(TLP/DLLP) | RxActive | 退出空闲,恢复接收 |
| RxIdle | 链路层确认对端已进入 L0s | RxL0sEntry | 启动接收端 L0s 入口 |
设计要点: RxIdle 状态机与 TxIdle 状态机在逻辑上是对称的,但 RxIdle 的判定依赖于接收到的符号序列,而非发送端自身的缓冲区状态。接收端必须使用独立的 SKP OS 计数器,且计数器在收到非 SKP OS 符号时立即清零。
4.3 TxIdle 与 RxIdle 的协同关系
TxIdle 与 RxIdle 状态机虽然独立运行,但在 L0s 入口流程中必须协同工作。链路层在收到两端同时处于空闲状态的指示后,才会发起 L0s 入口请求。这种“双端确认”机制确保了链路在进入低功耗状态前,两端都已停止数据传输。
常见设计陷阱: 如果仅依赖 TxIdle 状态就发起 L0s 入口,而接收端仍在接收数据,会导致数据丢失或链路错误。因此,PCIe 规范要求链路层必须同时检查 TxIdle 和 RxIdle 状态,且两者均为“真”时才能启动 L0s 入口序列。
TxIdle 与 RxIdle 的协同流程如下:
- 发送端检测: Tx 状态机检测到连续 8 个 SKP OS,进入 TxIdle 状态,并向链路层发送
tx_idle_assert信号。 - 接收端检测: Rx 状态机检测到连续 8 个 SKP OS,进入 RxIdle 状态,并向链路层发送
rx_idle_assert信号。 - 链路层仲裁: 链路层逻辑在收到
tx_idle_assert和rx_idle_assert后,确认两端均处于空闲状态。 - 发起 L0s 入口: 链路层向 Tx 和 Rx 状态机同时发送
l0s_entry_request信号,启动 L0s 入口序列。
4.4 快速退出设计:从 Idle 到 Active 的快速恢复
TxIdle 和 RxIdle 状态机不仅负责进入空闲状态,还必须支持从空闲状态快速恢复到 Active 状态。当链路处于 L0s 状态时,一旦发送端或接收端检测到新的数据需要传输,状态机必须能够在极短的时间内(通常为几个符号周期)退出空闲,恢复数据通路。
快速退出关键指标: 从 TxIdle/RxIdle 状态恢复到 TxActive/RxActive 状态的时间应小于 4 个符号周期(约 4 ns @ 2.5 GT/s),以确保链路延迟不会因低功耗管理而显著增加。
快速退出设计的实现要点:
- 旁路路径: 在 TxIdle 状态下,发送端保持 PLL 和 SerDes 的快速唤醒能力,不关闭时钟恢复电路。
- 优先级中断: 当新数据到达时,TxIdle 状态机立即中断空闲计数,直接跳转到 TxActive 状态,无需等待任何确认。
- 符号同步: 接收端在 RxIdle 状态下持续监控链路符号流,一旦检测到非 SKP OS 符号,立即退出 RxIdle 状态。
- 无握手延迟: 快速退出不需要与对端进行握手,状态机独立决策,减少退出延迟。
设计建议: 在实现 TxIdle/RxIdle 状态机时,建议使用组合逻辑直接检测退出条件,而非依赖时钟同步的状态机轮询。组合逻辑路径的延迟应控制在 1-2 个逻辑门以内,以实现纳秒级的快速退出响应。