时钟树抖动分解与时序裕量评估 - 第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 对时钟的影响
- 周期抖动(Period Jitter):单个时钟周期长度的变化。它对同步逻辑的建立时间、保持时间裕量产生直接影响。
- 相位抖动(Phase Jitter):多个周期累积出来的抖动。锁相环闭环带宽内的低频抖动会严重影响时钟的长期稳定性。
- 周期-周期抖动(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宽度。最终链路容限为零,流片回来没法用。
上面这张图,可以帮你快速建立抖动知识的基本框架。中心是抖动定义,左侧RJ、中间DJ、右侧BUJ,各自向下方展开常见来源;再往下进入影响层面:时钟、数据。最终我们追求的总抖动,是这几个分量按卷积模型组合出来的结果。下一段我们从这里的“抖动分解”思路开始——把RJ和DJ从总抖动里逐层剥离出来。这是后面几章的核心内容。