PCIe电气层测试:发送端眼图、抖动、电压摆幅测试方法

电气层测试,说白了就是看你那个高速信号在物理链路上到底跑得怎么样。我这些年做PCIe合规测试,最深的体会就是:协议握手没过可以查逻辑,电气层没过那就是物理硬伤,返修成本极高。所以这一章,咱们就把发送端眼图、抖动、电压摆幅这三个硬指标掰开揉碎了讲清楚。

核心测试目标: 确保PCIe发送端(TX)输出的信号在接收端(RX)能够被正确采样,不出现误码。

3.1 眼图测试——信号质量的“体检报告”

眼图是什么?说白了就是把很多个bit的波形叠加在一起,看看信号的“眼睛”睁得多大。你想想看,眼睛睁开得越大,信号的噪声裕量和时间裕量就越好。

我个人习惯在测试前先做一件事:确认测试夹具和线缆的插损。有一次我在实验室测一个Gen3的板卡,眼图怎么测都不合格,折腾了半天,结果是那条SMA线缆老化了,插损多了2dB。从那以后,我每次测眼图之前,都会先用矢量网络分析仪扫一下夹具通道。

测试步骤

  1. 连接设备: 把被测设备(DUT)的PCIe TX端通过合规测试夹具接到示波器上。示波器带宽必须足够(Gen3建议≥16GHz,Gen4建议≥23GHz)。
  2. 设置示波器: 打开眼图模板(Mask)测试功能,调出PCIe特定速率的模板文件(.msk文件)。
  3. 捕获波形: 采集至少10⁶个UI(单位间隔)的波形,确保统计稳定性。
  4. 测量参数: 读取眼高(Eye Height)、眼宽(Eye Width)、模板余量(Mask Margin)。
  5. 判断结果: 模板内不能有波形触碰或落入,否则判为不合格。
PCIe代际 数据速率 (GT/s) 眼高最小值 (mV) 眼宽最小值 (UI)
Gen1 2.5 ≥ 200 ≥ 0.75
Gen2 5.0 ≥ 150 ≥ 0.75
Gen3 8.0 ≥ 120 ≥ 0.70
Gen4 16.0 ≥ 80 ≥ 0.65
注意: 眼图模板并不是固定的。不同速率的PCIe有不同形状的Mask,而且有的测试规范要求用“数据相关抖动(DDJ)”补偿后的模板。我曾经见过一个案例,工程师用Gen2的模板去测Gen3的信号,竟然过了,但实际跑起来就报错。千万要核对模板文件!

3.2 抖动测试——别让信号“晃来晃去”

抖动,就是信号的边沿在理想时间点上发生了偏移。它分为随机抖动(RJ)和确定性抖动(DJ)。为什么要注意这个?因为抖动会吃掉眼宽,导致接收端采错数据。

我记得有一次帮客户调试一个NVMe SSD,主机读数据偶尔会断流。示波器一看,眼图挺好的,但接过抖动分析软件一跑,发现周期性抖动(PJ)的峰值特别大。最后找到了板上的一个DC-DC电源模块,它的开关频率耦合到了信号线上。你想想看,供电噪声居然能串进PCIe高速通道里,排查起来真费劲。

抖动分类与来源

  • 随机抖动(RJ):符合高斯分布,主要来自热噪声、散弹噪声。无法消除,只能通过增加链路裕量来忍受。
  • 确定性抖动(DJ):有具体物理原因,可预测可分离。包括:
    • 数据相关抖动(DDJ):由码间串扰(ISI)引起。
    • 占空比失真(DCD):由时钟占空比不对称引起。
    • 周期性抖动(PJ):由电源耦合、电磁干扰引起。
    • 有界不相关抖动(BUJ):由相邻通道串扰引起。

测试方法

我用的是Tektronix或Keysight的示波器,自带的抖动分析软件(如EDA或DJA)非常方便。核心做法是:让DUT发送指定的测试码型(比如PRBS7或者PCIe标准规定的CBB码型),然后用软件分离出TJ、RJ、DJ、DDJ。PCIe规范对总抖动(TJ)有要求:

  • Gen1/2: TJ < 0.25 UI(误码率BER=10⁻¹²)
  • Gen3: TJ < 0.3 UI(BER=10⁻¹²)
  • Gen4: TJ < 0.3 UI(BER=10⁻¹²)
我个人的小技巧: 做抖动分离时,一定要确认示波器捕获的波形数量足够多。少于20万个UI的统计,分离出来的RJ结果可信度不高。至少取50万个UI,才能让计算结果接近实际系统表现。

3.3 电压摆幅测试——信号“声音”要够大

电压摆幅就是信号的高低电平之差。PCIe规范对此有严格的界线。信号太低,接收端就听不见;信号太高,打坏接收端不说,还会产生严重的电磁辐射。

在PCIe Gen2之后,还有一个叫做去加重(De-emphasis)的技术。简单说,就是在发送端先刻意提高第一个bit的电压,后面接着压缩,用来平衡传输链路的频率衰减。测摆幅时,需要分别测测试码型下不同连续相同位(CBB)长度时的峰值电压。

电压参数要求(Gen3 ×1为例)

参数 最小值 典型值 最大值
差分峰峰值电压(Vtx-diffpp) 800 mV 1000 mV 1400 mV
去加重量(最小编码长度下的压降比) 3.0 dB – 6.0 dB
预加重(Pre-shoot)允许范围 – 0% 5%

测试操作

  1. 将示波器设置为差分测量模式,或者用单端探头分别测P/N,然后软件做差分运算。
  2. 锁定一个稳定的数据段,比如CBB为“1111100000”切换的地方。
  3. 读取第一个bit和第七个bit的差分幅值。去加重量 = 20 × log(V₁ / V₇)。
  4. 做至少10次独立测量,取最差情况。
特别提醒: 我曾经遇到过一个非常迷惑的问题:测出来去加重量明明只有2.5dB,但PCIe链路还能稳定跑。后来发现是测试码型没对——DUT发送的是一种“Turbo模式”下的静默信号,那个模式下去加重算法是关闭的。所以电压摆幅测试必须要求DUT发送标准合规测试码型,不能用正常业务流量的信号代替。这是合规测试中最容易被忽略的陷阱。
PCIe发送端电气层测试流程框架 PCIe发送端电气层测试流程框架 开始测试准备 眼图测试 抖动测试 电压摆幅测试 测量眼高、眼宽 验证Mask Margin 分离RJ/DJ/TJ 用PRBS7/CBB码型 测量Vtx-diffpp 确认De-emphasis 结果综合判断:是否通过?
补充一点: 电气层测试不能孤立地看某一个参数。眼图通过但抖动超标、或者摆幅达标但去加重不够,都不能说链路合格。我通常把这三项结果整理到一个对照表里,逐项排查。合规测试的目的,不是让示波器出来一个漂亮数字,而是确保在各种温度、电压、工艺下系统都能稳定工作。所以有时候,我甚至会故意把环境温度升到85°C再做一次全测试。嗯,那才是真正的压力测试。