抖动测试与分析:随机抖动、确定性抖动、TIE、周期抖动

抖动这东西,说白了就是信号边沿偏离了它本该出现的位置。我做了这么多年高速测试,见过太多人一上来就抱着频谱仪抓图,结果根本分不清抖动类型。今天咱们把这事彻底理清楚。

抖动的两大类:RJ 和 DJ

所有抖动都能归到两个源头:随机抖动(RJ)和确定性抖动(DJ)。记住这个二分法,后面分析就有方向了。

随机抖动(RJ),来自器件的热噪声、散粒噪声。它没有上限,符合高斯分布。嗯,这里要注意——RJ 是无限的,你测量时间越长,测到的峰值越大。所以 RJ 通常用均方根值(RMS)来表达。

确定性抖动(DJ),有明确原因,而且是有界的。包括以下几类:

  • 数据依赖抖动(DDJ)——跟前一比特相关。例如长串 0 或 1 之后的跳变,因为带宽限制导致边沿移位。
  • 占空比失真(DCD)——上升沿和下降沿的阈值不一样。发相同宽度的 0 和 1,出来的高电平脉宽却不一致。
  • 周期抖动(PJ)——来自电源噪声或时钟耦合。通常表现为某个固定频率的抖动分量。
  • 有界不相关抖动(BUJ)——来自邻近串扰或其他同频干扰,跟数据流无关。

核心记忆点:RJ 用 RMS,DJ 用峰峰值。二者叠加得到总抖动(TJ)时,不能简单相加。BERT 扫描出的浴盆曲线,就是把 RJ 和 DJ 按统计学模型联合算出来的。

TIE(时间间隔误差)

TIE 是抖动分析的基础。它测量的是实际信号边沿与理想时钟边沿之间的时间差。为什么呢?因为所有其他抖动指标——包括周期抖动、cycle-to-cycle抖动——都是从 TIE 导出的。

拿着波形看,TIE 就是每个数据眼交叉点的左右偏移量。我建议你用 TIE 做第一轮评估,因为这个指标能直接反映信号的整体相位噪声水平。

常见的 TIE 分析方法:

  1. 直方图法——把 TIE 值拉成直方图,看分布。高斯形状说明 RJ 主导;双峰或多峰说明 DJ 占优。
  2. 频谱分析法——对 TIE 序列做 FFT。特定频率的尖峰就是 PJ。
  3. 眼图法——TIE 展现在眼图水平方向上,就是眼宽和眼交叉点的发散程度。

个人经验:我习惯先看 TIE 直方图。有一次客户报告说眼张不开,我直接拉了个 TIE 直方图,发现双峰分布,峰值距离正好是 UI 的一半——典型 DCD。最后查出来是 TX 输出级的阈值电压偏差,省了整整两天的排查时间。

周期抖动与 Cycle-to-Cycle 抖动

周期抖动,测量的是每个时钟周期实际宽度跟理想周期的偏差。公式很简单:T_jitter = T_actual - T_ideal。

Cycle-to-Cycle 抖动,上一层楼——它看相邻两个周期之间的差异:C2C_jitter = T_n - T_(n-1)。

两者选哪个更合适?看场景:

指标 测量对象 典型应用 风险点
周期抖动 单周期偏差 PLL 锁定精度验证 低频噪声容易被低频偏移掩盖
C2C 抖动 相邻周期偏差 时钟树稳定度、PLL 瞬态响应 测短样本时偏差会被低估

我给你的建议是:PLL 评估看周期抖动,芯片级时钟分配网络测 C2C 抖动。这是一条经验法则,至少我还没踩过坑。

抖动分离实操:双狄拉克法

教科书里最经典的分离方法是双狄拉克模型(Dual-Dirac Model)。它的逻辑是说:当 DJ 成分大于 RJ 时,TIE 直方图会出现左右两个高斯峰的包络。

步骤:
1. 从眼图或 BERT 中采集 TIE 原始数据
2. 做直方图,识别左右峰的位置(DJ_δ)
3. 分别拟合左右峰的高斯标准差(σ_RJ)
4. 总抖动 TJ(ΒER=10^-12)  = DJ_δ + 14.0 × σ_RJ
(14.0 是 BER=10^-12 时的 Q 因子值)

避坑指南:我曾经碰到过一个案例——测试结果显示 DJ 为零,但眼图明显示意存在 DCD。后来发现采样点数不够,直方图没有收敛。双狄拉克法要求足够的统计样本,否则右边峰根本没出现,算法错把所有抖动算成 RJ。实测时务必将采样量拉到 100M 以上才算可靠。

抖动分析方法对比

不同的分析手段适合不同的场景,我把常见的方法整理成一个表格:

方法 优势 局限 最适合
直方图法 直观、快速、视觉判断 RJ/DJ 比例 低频抖动无法分离,依赖经验 初步诊断
频谱分析法 能精确定位 PJ 的频率来源 不擅长分离 DDJ 和 DCD 电源噪声、串扰诊断
双狄拉克法 行业标准方法,兼容大多数合规测试标准 统计样本要求高,非线性 DJ 误差大 标准合规测试
时钟恢复法 贴近接收端实际工作方式 依赖 PLL 模型,带宽设置影响结果 接收端容忍度测试

我用过的 TIE 测量代码示例

下面是我在实测时用的一段 Python 脚本片段,用来快速从波形里提取 TIE。你可以把它当作一个出发点,按自己的仪器格式调整。

import numpy as np
import matplotlib.pyplot as plt

def compute_tie(signal, threshold, sample_rate, ideal_period):
    # 找过阈值点(线性插值提高精度)
    crossings = []
    for i in range(len(signal)-1):
        if signal[i] < threshold and signal[i+1] >= threshold:
            t = i + (threshold - signal[i]) / (signal[i+1] - signal[i])
            crossings.append(t)
    crossings = np.array(crossings) / sample_rate  # 转换成时间

    # 理想边沿时间(基于第一边沿)
    first_cross = crossings[0]
    ideal_edges = first_cross + np.arange(len(crossings)) * ideal_period

    # TIE
    tie = crossings - ideal_edges
    return tie * 1e12  # 转到皮秒

# 用法示例(示意)
# tie_ps = compute_tie(waveform, threshold=0.5, sample_rate=40e9, ideal_period=100e-12)
# np.std(tie_ps) —— RJ RMS
# (np.max(tie_ps) - np.min(tie_ps)) —— DJ + RJ 峰峰值

注意:real_world 的信号几十 GHz,真实的硬件采样率很高,插值精度取决于你的 ADC 有效位数。我曾遇到一个场景,8 位 ADC 带来的量化噪声反而贡献了额外的 RJ,结果误判了信号质量。如果发现 RJ 偏大,先确认仪器噪声基底。

你想想看,抖动这件事说到底就是信号质量的时间域体现。掌握 RJ 和 DJ 的分类,学会从 TIE 推导出各种衍生指标,再配合时钟恢复和浴盆曲线,高速链路的决策一清二楚。

下面这张图把抖动分类、分析方法以及指标之间的流程关系串起来了,方便你对照理解。

抖动分析知识结构图 总抖动(TJ) 随机抖动(RJ) 确定性抖动(DJ) DDJ DCD PJ BUJ 直方图法 频谱分析法 双狄拉克法 TIE 分析 周期抖动 C2C 抖动 核心概念:RJ 用 RMS 描述 DJ 用峰峰值描述