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。这是为了防止因链路抖动或短暂的空闲窗口导致误判,确保链路确实处于稳定空闲状态。
TxIdle 状态机转换图 TxActive 发送数据中 TxIdle 发送空闲 TxL0sEntry 进入 L0s 连续 8 个 SKP OS 链路层请求 L0s L0s 入口失败/退出 缓冲区非空 说明: TxIdle 状态是进入 L0s 的必要条件,但非充分条件;还需 RxIdle 确认。 连续 8 个 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 符号时立即清零。
RxIdle 状态机转换图 RxActive 接收数据中 RxIdle 接收空闲 RxL0sEntry 进入 L0s 连续 8 个 SKP OS 对端确认进入 L0s L0s 入口失败/退出 收到非 SKP 符号 说明: RxIdle 状态机使用独立的 SKP OS 计数器,与 TxIdle 计数器互不干扰。 接收端在检测到非 SKP OS 符号时立即清零计数器,防止误判。

4.3 TxIdle 与 RxIdle 的协同关系

TxIdle 与 RxIdle 状态机虽然独立运行,但在 L0s 入口流程中必须协同工作。链路层在收到两端同时处于空闲状态的指示后,才会发起 L0s 入口请求。这种“双端确认”机制确保了链路在进入低功耗状态前,两端都已停止数据传输。

常见设计陷阱: 如果仅依赖 TxIdle 状态就发起 L0s 入口,而接收端仍在接收数据,会导致数据丢失或链路错误。因此,PCIe 规范要求链路层必须同时检查 TxIdle 和 RxIdle 状态,且两者均为“真”时才能启动 L0s 入口序列。

TxIdle 与 RxIdle 的协同流程如下:

  1. 发送端检测: Tx 状态机检测到连续 8 个 SKP OS,进入 TxIdle 状态,并向链路层发送 tx_idle_assert 信号。
  2. 接收端检测: Rx 状态机检测到连续 8 个 SKP OS,进入 RxIdle 状态,并向链路层发送 rx_idle_assert 信号。
  3. 链路层仲裁: 链路层逻辑在收到 tx_idle_assert 和 rx_idle_assert 后,确认两端均处于空闲状态。
  4. 发起 L0s 入口: 链路层向 Tx 和 Rx 状态机同时发送 l0s_entry_request 信号,启动 L0s 入口序列。
TxIdle 与 RxIdle 协同流程图 Tx 状态机 TxIdle 状态 Rx 状态机 RxIdle 状态 链路层仲裁 发起 L0s 入口 连续 8 个 SKP OS 连续 8 个 SKP OS tx_idle_assert rx_idle_assert l0s_entry_request

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 个逻辑门以内,以实现纳秒级的快速退出响应。