4. Polling 超时定义:规范规定与计数器实现

Polling 状态是链路训练状态机(LTSSM)中用于检测接收器是否存在、并建立初始位锁和符号锁的关键阶段。PCIe Base Spec 对 Polling 状态的总驻留时间有严格限制,一旦超时,LTSSM 必须跳转到 Detect 状态重新开始训练。理解超时定义和计数器的硬件实现机制,是定位 Polling 超时失败案例的理论基础。

4.1 规范规定的 48ms 超时阈值

根据 PCIe Base Spec 6.0/5.0/4.0/3.0 的通用定义,Polling 状态的总超时时间规定为 48 ms。这个时间窗口覆盖了从进入 Polling.Active 子状态开始,到成功完成位锁和符号锁建立、并准备进入 Configuration 状态的全部过程。

参数名称 规范符号 规定值 说明
Polling 总超时 T_POLLING 48 ms 从进入 Polling.Active 到超时跳转的最大允许时间
Polling 活动超时 T_POLL_ACT 24 ms Polling.Active 子状态内等待接收器就绪的最大时间
Polling 配置超时 T_POLL_CONFIG 24 ms Polling.Configuration 子状态内等待 TS1/TS2 交换的最大时间
设计要点: 48 ms 是总超时上限,硬件设计通常将两个子状态(Active 和 Configuration)各分配 24 ms 计数器,两者独立运行,任一超时都会触发整个 Polling 状态的超时退出。

4.2 超时计数器的硬件实现机制

在物理层(PHY)的数字逻辑中,超时计数器通常采用以下两种实现方式:

  • 基于参考时钟的递减计数器: 使用 100 MHz 或 125 MHz 的参考时钟作为计数时钟源,计数器初始值装载为 48 ms 对应的时钟周期数(例如 100 MHz 下为 4,800,000 个周期),每个时钟周期减 1,减到 0 时产生超时标志。
  • 基于状态机循环计数的分阶段计数器: 将 48 ms 拆分为 Active 和 Configuration 两个阶段,每个阶段使用独立的 24 ms 计数器,当状态机在子状态间切换时,计数器复位并重新装载。
// 伪代码示例:Polling 超时计数器逻辑(Verilog 风格)
module polling_timer (
    input  wire        clk,          // 100 MHz 参考时钟
    input  wire        rst_n,        // 异步复位
    input  wire        start_poll,   // 进入 Polling 状态
    input  wire        poll_done,    // 成功完成训练
    output reg         timeout_flag  // 超时标志
);

    parameter TIMEOUT_CYCLES = 4_800_000; // 48 ms @ 100 MHz
    reg [22:0] counter;

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            counter <= 0;
            timeout_flag <= 0;
        end else if (start_poll) begin
            counter <= TIMEOUT_CYCLES;
            timeout_flag <= 0;
        end else if (poll_done) begin
            counter <= 0;
            timeout_flag <= 0;
        end else if (counter > 0) begin
            counter <= counter - 1;
            if (counter == 1)
                timeout_flag <= 1; // 超时触发
        end
    end
endmodule

4.3 超时计数器的状态机集成架构

下图展示了 Polling 超时计数器在 LTSSM 中的集成位置和信号交互关系。计数器由 Polling 状态机控制启动和复位,超时标志直接驱动状态跳转逻辑。

Polling 超时计数器与 LTSSM 集成架构 Polling 超时计数器与 LTSSM 集成架构 LTSSM 主状态机 Detect / Polling / Config ... Polling 子状态机 Polling.Active Polling.Configuration Polling.Loopback 超时计数器模块 48 ms 总超时计数器 24 ms Active 计数器 24 ms Config 计数器 时钟 / 复位 100 MHz Refclk 状态跳转逻辑 超时 → 跳转 Detect 进入 Polling 启动 / 复位 时钟输入 超时标志 跳转 Detect 说明:超时计数器由 Polling 子状态机控制启动,在 48 ms 内未完成训练则产生超时标志,驱动状态跳转逻辑强制回到 Detect 状态。

4.4 超时计数器的关键设计参数

在实际芯片设计中,超时计数器的实现需要关注以下参数,这些参数直接影响超时判断的准确性和硬件开销:

参数 典型值 设计考量
计数时钟频率 100 MHz / 125 MHz 频率越高,计数器位宽越大,但精度更高
计数器位宽 23 bit(48 ms @ 100 MHz) 需满足最大计数值,留有余量
复位方式 异步复位 / 同步清零 异步复位确保上电后计数器立即归零
超时标志输出 单脉冲 / 电平保持 单脉冲方式避免状态机重复触发
计数器复用 与其它状态共享 / 独立 独立计数器逻辑简单,但面积略大
工程经验: 在 FPGA 原型验证中,建议将 Polling 超时计数器设计为可读/可写的寄存器,便于调试时动态修改超时阈值(例如缩短为 10 ms 以加速测试),同时保留硬件默认的 48 ms 值。

4.5 超时与链路训练失败的关联

当 Polling 超时计数器触发时,意味着链路在 48 ms 内未能完成以下任一关键步骤:

  • 接收器检测失败: 对端设备未上电、链路断开或电气特性不满足要求,导致无法检测到接收器存在。
  • 位锁未建立: 时钟恢复电路(CDR)无法锁定输入数据流的频率和相位,通常由参考时钟偏差过大或信号质量差引起。
  • 符号锁未建立: 无法从串行数据流中正确识别 10-bit 符号边界,通常与 COM 字符检测失败有关。
  • TS1/TS2 有序集交换失败: 在 Polling.Configuration 子状态中,双方无法完成训练序列的握手,导致无法进入 Configuration 状态。
注意: 48 ms 超时是 PCIe 规范定义的硬性上限。如果系统软件在驱动初始化时发现链路训练超时,通常会记录“Polling Timeout”错误,并触发链路复位或端口禁用。在调试过程中,通过逻辑分析仪捕获 LTSSM 状态跳转和计数器溢出信号,是定位超时根因的最直接手段。