时钟树抖动分解与时序裕量评估 - 第1节

一、抖动的定义——时钟的“心跳”并不完美

大家刚开始接触抖动的时候,可能都会被各种定义绕晕。我自己也是从懵懂状态里摸爬滚打过来的。说白了,抖动就是信号边沿偏离了它本该出现的位置。你想象一下,一个理想时钟,每次上升沿都精确地落在10ns、20ns、30ns……但在实际芯片里,由于噪声、工艺波动、电源纹波等各种因素,这个边沿会早到一点或晚到一点。早到的这个误差,就是抖动的本质。

讲个我在项目中遇到过的例子。之前做一颗高速SerDes芯片,芯片回来测试发现眼图闭合很厉害。刚开始怎么找原因都找不到,后来我用高精度示波器长时间捕获时钟边沿,才看到边沿的偏移量竟然达到几十皮秒。这就是典型抖动在作祟。从那之后,我对抖动就特别敏感。

关键定义:抖动是指数字信号在时间轴上偏离理想位置的偏差。它不是一个固定值,而是一个统计量。这点非常重要——我们衡量抖动,通常用峰峰值、RMS值、或者眼图上的抖动参数来描述。

二、抖动的分类——RJ、DJ、BUJ的区别

抖动的分类,大家一定要搞清楚。我见过不少工程师上来就说“抖动有随机和确定性两种”,这个说法不够准确。按照工程界的标准分类,抖动可以分成三大类:随机抖动(Random Jitter, RJ)、确定性抖动(Deterministic Jitter, DJ),和有界不相关抖动(Bounded Uncorrelated Jitter, BUJ)。下面我用表格来说清楚每个类别的本质。

抖动类型 英文缩写 根本来源 统计特征 是否可预测
随机抖动 RJ 热噪声、散弹噪声、1/f噪声 高斯分布,无界 不可预测
确定性抖动 DJ 码间干扰、占空比失真、开关噪声 有界,双峰或多峰分布 可预测/可重复
有界不相关抖动 BUJ 邻近电源域耦合、电源引线串扰 有界,但与数据不相关 部分可预测

2.1 随机抖动 RJ

RJ是没有任何规律的抖动。说白了,它来自物理世界最基础的热力学过程。电阻里的电子热运动、晶体管沟道里的散弹噪声,都会导致时钟边沿产生微小的随机偏移。RJ服从高斯分布,理论上它是无界的——你测的时间越长,看到的峰峰值就越大。这一点在做时序裕量计算时特别要小心。我个人习惯,对RJ的周期-周期抖动(Period Jitter)至少采集10万个边沿才能得到比较稳定的RMS值。

为什么RJ无法通过电路设计完全消除?因为它源于元器件本身的热噪声。你只能通过降低噪声系数、优化偏置电流来减小,但不能彻底去掉。我曾经在低抖动时钟缓冲器设计里花了整整两周尝试把RJ降到0,后来发现这是不可能的物理极限。

2.2 确定性抖动 DJ

DJ就好理解多了。它是有规律的、可重复的抖动。最常见的两种是:

  • 占空比失真(Duty Cycle Distortion, DCD):时钟高低电平宽度的不一致。比如一个50%占空比的时钟,实际高电平只占了48%,低电平52%。这个差值转移到边沿上,就产生了抖动。DCD通常由比较器阈值偏差或缓冲器上升/下降时间不匹配引起。
  • 码间干扰(Intersymbol Interference, ISI):数据模式不一样,导致信号边沿位置受影响。举个例子,连发一串“1111”后再接一个“0”,信号从高变低的时间会比连续“1010”切换时要长。这个时间差就是ISI引起的抖动。

DJ还有一个非常重要的特征——它有界。不管你测多长时间,DJ的峰峰值会收敛到一个固定值。这一点和RJ完全不同。所以做抖动分解的时候,我们正是利用这个有界特性来把DJ从总抖动里分离出来。

2.3 有界不相关抖动 BUJ

BUJ这个名字,说实话在行业里大家说得不多。但我个人觉得它值得单独拿出来讲。BUJ的来源通常跟电源有关。比如相邻模块在某个频率上产生开关噪声,通过电源网络或者衬底耦合到时钟路径上。这个噪声跟当前数据传输模式不相关——这就是“不相关”的含义。但它又有界,因为电源噪声幅度不可能无限大。所以BUJ在统计分布图上,往往表现为高斯分布的尾部出现了一个矮平台(Plateau)。识别出这个平台,就能判断出可能存在BUJ问题。

技巧:很多人把BUJ跟电源引起的DJ搞混。一个简单的区分方法是:将时钟或数据信号锁定时钟恢复器,然后长时间捕获抖动分布。如果抖动分布的尾部呈现平坦状(不是高斯平滑降低),大概率是BUJ在捣乱。

三、抖动对时钟和数据的影响——为什么我们必须在乎

抖动的根本危害,在于它偷走了时序裕量(Timing Margin)。一个时钟系统,抖动越大,留给建立时间和保持时间的余量就越小。下面我简单梳理一下。

3.1 对时钟的影响

  1. 周期抖动(Period Jitter):单个时钟周期长度的变化。它对同步逻辑的建立时间、保持时间裕量产生直接影响。
  2. 相位抖动(Phase Jitter):多个周期累积出来的抖动。锁相环闭环带宽内的低频抖动会严重影响时钟的长期稳定性。
  3. 周期-周期抖动(Cycle-to-Cycle Jitter):相邻两个周期的长度之差。这个是衡量时钟短期稳定性的重要指标。我设计PLL的时候,特别关注这个参数——它直接反映锁相环的相位对噪声的抑制能力。

3.2 对数据的影响

数据通道上的抖动最直接的结果就是码元错误。具体又分两个场景:

  • 接收端采样错误:数据边沿和采样时钟边沿的相对位置被抖动扰乱,时钟采到错误的数据电平。拿DDR接口来说,时钟和数据之间的抖动如果超过0.5个UI(单位间隔),就会触发数据采集错误。
  • 眼图闭合:抖动导致眼图横向变窄,最终闭合。眼图闭合意味着可以保证无错的比特率窗口变小,整个系统必须降速运行。

我记得之前处理一个PCIe Gen3的链路训练失败问题。示波器抓出来的眼图看起来还行,但接收端的均衡器无论如何都无法收敛。后来仔细测了时钟抖动,发现27MHz附近的周期性抖动分量异常大,导致CDR的锁相环不断失锁。最终找到原因是一颗DC-DC转换器的开关频率正好落在27MHz附近,通过电源网络耦合到了时钟路径上。就是这微小的BUJ,差点让整个板卡回炉重烧。

注意:不要轻视哪怕是1皮秒左右的DJ。我见过一个项目,抖动总量只有4ps RMS,对大多数设计来说这个值看起来很低。但那颗芯片运行在28Gbps的NRZ链路里,UI只有35.7ps。直接算一下,4ps RMS的抖动换算成峰峰值大约是±12ps,已经占据了约1/3的UI宽度。最终链路容限为零,流片回来没法用。

抖动分类与影响框架图 抖动(Jitter) 随机抖动(RJ) 确定性抖动(DJ) 有界不相关抖动(BUJ) 来源 热噪声 / 散弹噪声 / 1/f噪声 来源 码间干扰 / 占空比失真 / 开关噪声 来源 邻近域耦合 / 电源噪声 对系统的影响 对时钟的影响 建立/保持时间裕量减小 PLL失锁 / 频率稳定度恶化 对数据的影响 采样错误 / 码元错位 眼图闭合 / 误码率升高 总抖动 TJ = RJ ⊗ DJ(卷积模型) 抖动分解是分离RJ与DJ含量的关键步骤

上面这张图,可以帮你快速建立抖动知识的基本框架。中心是抖动定义,左侧RJ、中间DJ、右侧BUJ,各自向下方展开常见来源;再往下进入影响层面:时钟、数据。最终我们追求的总抖动,是这几个分量按卷积模型组合出来的结果。下一段我们从这里的“抖动分解”思路开始——把RJ和DJ从总抖动里逐层剥离出来。这是后面几章的核心内容。