拿到56G PAM4 SerDes RX链路那天我就知道CDR这块比以往NRZ设计敏感得多。速率到了28GBd之后一个UI只有35.7ps左右PAM4的三只眼睛里面中间眼对应的电平间距最小直接在噪声边缘上挣扎。这时候如果沿用模拟鉴相器加PI相位插值器的老办法不仅均衡器和CDR之间的交互说不清楚PVT下环路参数漂移、电荷泵失配这些旧账也都要一起算。所以当时选型讨论到最后ADC-DSP接收机里面基本就落到了BBCDR波特率时钟恢复配DCO数控振荡器这套组合上。这篇把我在这个项目里对RX侧BBCDR数字环路和DCO控制设计的完整思考做个梳理从原理拆到电路实现再讲实测里踩过的坑给同样在做56G PAM4 SerDes的朋友一个可以照着推演的设计框架。1. 为什么在ADC-DSP接收机里CDR最终选了BBCDR方案1.1 模拟PI型CDR在PAM4下的三个绕不开的短板传统NRZ SerDes里最常见的CDR方案是Alexander/Hogge鉴相器加电荷泵环路滤波器最后用相位插值器PI去微调采样时钟相位。这套方案工艺成熟、模型清楚在56G以下统治了很多年。但放到56G PAM4场景第一个绕不开的问题是鉴相器本身。PAM4一个符号携带两个bit判决电平从两电平变成四电平模拟鉴相器要从高低电平跳变里提取提前/滞后信息一旦数据图案集中在中间眼或者同向跳变鉴相增益就不稳定。第二个问题是电荷泵漏电和上下电流失配即使做到0.1%级别的匹配在PAM4那种很紧的抖动预算下也会转化成一个固定的静态相位偏置直接吃掉眼图裕量。第三个问题是联调困难RX侧DFE的抽头自适应和CDR环路是互相影响的模拟环路里想按不同阶段切换带宽、想观测内部误差信号都非常别扭。这些短板不是修修补补能解决的所以当时整个系统架构一确认走ADC-DSPCDR几乎必然要数字化。1.2 BBCDR的核心逻辑一个符号采一次照样能把时钟恢复出来BBCDR波特率时钟恢复本质是Mueller-Muller类型的定时误差检测。它的核心洞察在于如果你已经对每个符号采了一个点那么相邻两个采样点之间的幅度变化方向就能告诉你采样时刻是偏早了还是偏晚了并不需要像过采样CDR那样在符号周期内采集多个点去比较跳变沿。接收信号经过ADC采样再经过前馈均衡FFE和判决反馈均衡DFE处理之后输出序列x[k]已经消除了大部分符号间干扰。这时候对每个UI计算一个误差量e[k]它正比于当前采样点相对眼图中心的时间偏差。这个误差量进数字环路滤波器输出一个频率控制字控制DCO调整采样时钟的相位和频率。整个过程里CDR从模拟电路里的连续时间反馈变成了数字电路里的离散时间反馈每个符号周期更新一次误差信号、环路状态、控制字全部是寄存器里可以随时拉出来看的数字量。这是BBCDR在工程上最大的红利可观测、可配置、可调试。1.3 数字环路加DCO谁管相位谁管频率BBCDR的环路落到电路实现是数字环路滤波器DCO这个组合。这里要讲清楚分工误差提取和环路滤波全部在数字域它们决定的是DCO应该工作在什么频率上DCO本身就是一个频率到相位的积分器——控制字给定一个频率振荡器输出相位就随时间线性累积。换句话说数字环路滤波器管频率误差而相位误差是DCO天然积分出来的。这和模拟VCO的模型完全一致只是把压控增益Kvco换成了数字增益Kdco每LSB控制字对应多少Hz。我在这个项目里最深的体会是这种分工一旦建立环路的很多设计自由度就完全打开了你可以随时调整比例积分系数来改变带宽可以在失锁时直接把控制字钳位在某个安全值也可以把DCO控制字的采集记录通过debug总线送出来做频谱分析。这些都是传统模拟CDR给不了的。2. 数字环路从算术到电路MM鉴相、环路滤波、控制字生成2.1 Mueller-Muller鉴相器的PAM4实现与归一化处理BBCDR的鉴相器在工程上最常用的形式是Mueller-Muller算法的一个简化版本。NRZ下的经典公式长这样[ e[k] x[k]\cdot \hat{x}[k-1] - x[k-1]\cdot \hat{x}[k] ]其中x[k]是均衡器输出采样点\hat{x}[k]是判决值。这个式子的物理意义很直观如果当前采样点和前一个判决值的相关关系与对称期望有偏差就说明采样时刻偏离了眼图中心。拿到e[k]的正负号就有了超前/滞后的方向信息幅度则代表偏离程度。PAM4情况下公式形式不变但判决值\xhat[k]变成四电平-3、-1、1、3实现时要考虑乘法开销。我的做法是把判决值拆成符号、数值两路把乘法简化为开关和移位相加因为PAM4电平只有四种组合起来也就16种可能性用查找表也能直接算。还要注意一点PAM4三个眼如果电平幅度不一致比如因为发射机线性度或者信道非线性那么同一个定时误差量在不同眼上对应的增益是不同的。所以环路里要做归一化常见做法是分别统计三眼的误差除对应的眼高再合并如果只图简单取中间眼的误差做主环路也要在系数上留出裕量避免增益波动把环路带宽拉偏。2.2 比例积分DLF的参数标定把带宽要求翻译成系数数字环路滤波器我用的是一阶比例积分结构很简单[ \begin{aligned} a[k] a[k-1] e[k] \ c[k] K_p \cdot e[k] K_i \cdot a[k] \end{aligned} ]a[k]是积分器输出用来消除静态频率误差Kp通路提供相位裕度Ki通路保证频率跟踪。标定Kp和Ki之前要先看抖动容忍模板要求的行为带宽。环路带宽定了再用连续时间近似反推系数。把DCO看成增益Kdco的积分器开环传递函数可以写成一阶比例积分加一个积分器[ G(s) \left(K_p \frac{K_i}{s}\right)\cdot \frac{K_{dco}}{s} ]闭合之后是标准的二阶系统自然频率和阻尼系数分别满足[ \omega_n \sqrt{K_i K_{dco}}, \quad \zeta \frac{K_p}{2}\sqrt{\frac{K_{dco}}{K_i}} ]所以流程是由抖动模板确定目标f_n由稳定性要求确定目标ζ一般取0.7到1之间再根据Kdco的实际标定值反推Kp、Ki。这里Kdco的单位要注意如果DCO标定结果是用MHz/LSB表示的要换算成rad/(s·LSB)再代入。我自己习惯先做一个Python模型把连续域参数算出来再丢进SystemVerilog仿真里看离散效应两个结果对得上才敢往下走。2.3 从频率字到DCO控制字接口同步与饱和保护DLF输出的c[k]是一个频率控制字但DCO往往不止一个bank所以c[k]要拆成粗调字、细调字细调字低位还可能送进ΣΔ调制器。拆字的关键是保证单调性和无重叠粗调的步进要小于细调的最大覆盖范围不然会出现某一段控制字上频率跳变甚至倒挂。拆字本身是纯组合逻辑但DCO控制字的跨时钟域同步必须认真处理。DCO跑的可能是28GHz或者14GHz的采样时钟域而DLF通常在一个分频后的低频时钟域里更新控制字直接跨过去容易采到亚稳态导致DCO瞬时频率毛刺。我的做法是控制字在数字域先打拍同步粗调位用格雷码编码后再跨域细调位用双触发器同步确保同一拍到来的控制字各位不会错开。还有一个很容易忽略的点是积分器溢出。如果Kdco标定偏差大或者中心频率离目标很远积分器a[k]可能累到寄存器边界再反号环路直接就崩了。所以必须在积分器后面加饱和钳位钳位范围结合DCO细调覆盖范围来定宁可让控制字贴着边界停住也不要让积分器翻转。3. DCO像一台精密仪器调谐范围、增益校准与低噪声3.1 环形DCO还是LC-DCO56G场景下怎么选DCO的选择直接影响CDR的抖动底噪这一步不能拍脑袋。环形振荡器调谐范围宽、面积小、集成容易数字控制也很方便但相位噪声在高频段通常比LC振荡器差一个量级以上。在28GBd的符号率下如果采样时钟直接由DCO输出28GHz环形DCO的抖动很难压进预算如果把DCO频率降半速或者四分之一速再倍频相位噪声又要打折。LC振荡器正好相反Q值高、相位噪声好但调谐范围窄一般也就百分之十上下而且需要电感面积、要仔细做电源去耦。我实际的项目里用的是LC-DCO粗调靠开关电容阵列细调靠变容管加数字控制流片前专门给DCO出了独立版图和带隙基准去耦方案。如果你的系统有现成的时钟倍频链路DCO可以做在较低频率再倍频到采样率同时用分频器反馈做闭环这种情况下环形DCO的劣势会被环路压掉一部分选择可以再权衡。但单就56G PAM4这个量级我的建议是优先LC。3.2 粗调细调双bank架构与调谐曲线非线性DCO内部一般分粗调、细调两级。粗调覆盖工艺角和温度造成的频率漂移细调负责在CDR工作范围内提供足够的线性增益。粗调我用thermometer编码单位是阵列里一个开关电容细调我用二进制加权加一点thermometer混合兼顾面积和单调性。选thermometer而不是纯二进制的原因很简单粗调每步改变频率大二进制权重在翻转高位时容易出现毛刺而thermometer每次只多开一个单位单调性好DCO控制字在换挡时不会出现瞬态频率反跳。调谐曲线上还有一个常见坑粗调和细调的交界处细调增益会因电容阵列寄生而发生变化Kdco不再是一个常数。如果环路设计时把Kdco当常数实际带宽就会在这里偏移严重的时候相位裕度不够锁定后出现极限环。所以我在校准流程里专门要求对整个控制字空间做分段标定交界处的增益单独记录DLF的Kp、Ki在上电时按当前所在段做一次查表修正。3.3 上电增益校准流程计数器测频法实操DCO增益校准的工程实现我建议用最朴素的计数器测频法。流程是初始化时把DCO控制字设成某个已知值然后用一个相对精确的参考时钟比如系统里的低速参考晶振开一个测量窗口统计DCO输出在这个窗口内有多少个边沿频率就等于计数结果除以窗口时间。控制字从低到高扫描几个点每点测一遍用最小二乘拟合成直线斜率就是Kdco。测量窗口越长频率分辨率越高但校准时间也越长。可以参考这个折衷符号率28GBd如果希望校准分辨率到0.1%窗口至少要数到1000个DCO周期大概几十微秒量级一个Lane上电做一次完全来得及。校准精度我一般要求做到±10%以内因为环路的f_n和ζ都跟Kdco的平方根相关10%的Kdco误差换算下来带宽偏差大约5%在设计预留范围内。还有一个细节校准要在DCO频率稳定之后再做不要在刚上电电源还没稳的时候测否则数据全是废的。3.4 ΣΔ调制与dithering细调分辨率不够怎么办如果细调步进太大CDR锁定之后控制字可能在两个相邻值之间反复跳对应到采样相位就是持续的高频抖动。解决思路有两个一个是把细调单位做小但太小以后受工艺失配限制电容最小尺寸到一定程度就做不下去了另一个是用ΣΔ调制对低位控制字做噪声整形让DCO在多个控制字之间快速切换平均出一个更高的频率分辨率。我的做法是细调的最低3到4位进一个一阶ΣΔ调制器输出一个高速的高低控制序列DCO输出频谱里的量化噪声被推到高频段落在CDR环路带宽之外的越多越好。这样做的代价是DCO带外噪声会变差如果后面跟着的时钟分频器或采样电路带宽很宽这些高频噪声依然会漏到采样点上。所以ΣΔ阶数和过采样率的选取要跟DCO噪声预算一起仿真不能只看环路锁定精度。实践上一阶ΣΔ加三四倍的过采样率在大部分56G场景够用二阶效果更好但要注意稳定性。4. 稳定性和收敛性数字CDR的离散域账本4.1 连续时间近似什么时候失效很多做模拟CDR的朋友上手数字环路第一件事就是拿二阶锁相环的公式去套Kp、Ki这不奇怪因为低频段两者确实等价。但数字环路每个UI才更新一次更新率就是28MHz环路带宽如果设得很高比如几兆赫兹那连续时间近似就开始失真了。判断标准很简单f_n如果超过更新率的十分之一离散延迟带来的相位损失就不能忽略。这时候要么在DLF里面加一个超前补偿项要么直接把模型拿到z域去验证。我习惯把DLF写成z域的转移函数用双线性变换把连续域系数映射过去再画一遍开环Bode图看相位裕度。这样做出来的参数跟实测吻合度很高比单纯在连续域调系数省很多硅后调试时间。4.2 环路运算延迟、字长与饱和数字域独有的三个坑环路运算延迟是数字CDR和模拟CDR最大的区别之一。从ADC采样到均衡器、鉴相器、环路滤波器、控制字同步中间至少有一到两个符号周期的流水延迟。这个延迟等效于在环路里插入了一个额外的相位滞后带宽越高影响越明显。设计时要把这条延迟路径的拍数精确数出来加到仿真模型里。字长问题同样重要。比例路径的Kp、积分路径的Ki都是定点数字长不足会让误差信号在小相位偏差时被量化掉表现为锁定后控制字微小抖动。我的经验是环路滤波器内部至少用24位整数积分累加器用32位输出截位之前先做饱和判断。饱和保护前面提过这里再强调一遍积分器钳位范围要跟DCO细调覆盖范围联动宁宽勿窄宽了只是收敛慢一点窄了会直接失锁。4.3 频率牵引与两段式启动策略CDR上电如果直接闭环保相DCO起始频率和目标采样频率差太远鉴相器给不出有效的误差方向环路会拖着拖着就失锁了。工程上标准做法是两段式启动第一段是频率粗捕获。上电后先断开DLF用计数器测DCO频率通过粗调bank的二分搜索把它拉进细调覆盖范围之内判断标准是频率误差小于细调范围的一半。第二段是相位闭环。切到DLF通路先用一个较小的Ki让频率缓变收敛再逐步加大Kp建立相位裕度最后等误差信号的方差降到阈值以下切换到目标带宽。这个切换点怎么判断我建议在数字域里直接监测误差信号e[k]的符号翻转频率如果它在一个固定窗口内正负交替次数超过某个比例说明相位已经收敛到眼图中心附近可以放手切带宽了。这套流程看起来多花了点时间但能避免流片回来之后在上电时序上反复扯皮。4.4 抖动容忍、锁定时间与DCO噪声的三角权衡环路带宽不是越大越好也不是越小越好。带宽调高对低频抖动的跟踪能力强环路锁定快但高频段的抖动容忍会被环路自身的噪声和采样量化拖累带宽调低DCO带内噪声被压制得更狠但锁定慢而且对温度漂移、电源慢变的跟随能力差。在56G PAM4设计中抖动容忍模板通常由协议定义比如IEEE 802.3cd或者CEI-56G的模板会在低频给出较高的容忍值高频逐渐滚降。我的做法是先把模板折算成环路带宽的下限再把DCO相位噪声预算折算成带宽的上限两个限之间如果留不出余量就要回头改DCO设计。这个三角权衡往往要到整机仿真阶段才能完全定下来但因为BBCDR的系数是可编程的同一个芯片可以在不同速率模式下切换带宽回旋余地比模拟CDR大很多这也是数字环路让我觉得真正值钱的地方。5. PAM4特有的坑三只眼睛的数据并不公平5.1 三个电平眼的SNR差异与定时误差加权PAM4眼图里有上、中、下三只眼睛幅度上中间眼对应的电平间距最小。在没有非线性失真的时候三眼理论上等高等宽但实际信道里因为发射端线性度、接收端量化噪声、信道损耗等因素三眼的信噪比差异非常大。BBCDR的MM鉴相器如果一视同仁地去统计所有跳变结果会被信噪比更差的那只眼拖着走定时误差里混进大量噪声。所以设计MM鉴相器时要做一个加权合并策略对每个跳变方向分别统计误差然后按照对应眼高或者历史误码率给权值。具体权值可以通过片上眼图计量模块在线测得也可以在链路训练阶段固定。我自己的实现里保留了三个误差累加器最后的e[k]是它们按权值合出来的这样即使信道状态变化环路也不至于被某个劣势眼带崩。5.2 电平失配与眼图不对称如何骗过MM算法PAM4发射机的四个电平如果没调准比如1电平偏低、-1电平偏高接收端眼图看起来会整体歪斜。这时候MM算法的对称性假设被破坏误差信号里会掺入一个电平相关的偏置项等效于一个静态相位偏置。更麻烦的是这种偏置不是常数跟数据图案有关段时间内可能表现为抖动长时间内又像固定偏移。处理办法有两类一类是模拟端配合发射机或者接收机的电平校准尽量把电平失配压到最低另一类是数字端补偿在鉴相器里对每种跳变组合的误差做在线去偏比如维护一个图案相关的查找表不断更新偏置校正值。我踩过的坑是只做了接收端线性化忽略了发射端电平校准的残余误差导致低温下明明链路误码率正常抖动容忍测试却不过。后来把图案相关的去偏加上问题才消失。这类问题隐蔽性很强排查时一定要想到MM算法的对称性假设被电平分布破坏这个方向。5.3 与FFE/DFE的联合收敛次序PAM4链路里均衡器和CDR不是两个独立模块它们都在调整同一个采样点的质量。DFE削掉post-cursor ISI之后采样点附近波形的对称性会改变直接影响MM鉴相器看到的误差方向反过来CDR把采样相位挪了DFE的最优抽头也会变。如果两者同时自适应很容易出现跷跷板式的慢振荡。我的做法是分优先级先让CDR用一个中等带宽做初步收敛锁到一个相对稳定的相位然后冻结CDR方向调整让DFE抽头自适应收敛最后再放开CDR微调并把环路带宽切回目标值。简单说就是CDR先粗锁、DFE再精调、CDR再细调的次序。很多仿真环境里两个环一起跑没出问题是因为信噪比留了余量到了真实信道这个次序设计不好就会表现为偶发抖动或误码突增。5.4 片内眼图计量怎么给CDR验证提供线索提到PAM4眼图计量很多人第一反应是拿高速示波器在片外测。但到了56G这个量级封装、走线、探针都会影响真实眼图片外测量看到的很多时候不是硅片内部的工作状态。片上眼图计量模块这时候价值很大它通过控制采样相位和判决阈值在片内直接统计每个电压、相位点上的误码概率最后画出一张二维眼图或者浴盆曲线。这张图能直接告诉你当前CDR锁定的采样点是不是真的在三眼的重心位置也能看出中间眼的闭合程度。我在调试BBCDR时特别喜欢看片上眼图计量输出的BER contour配合数字环路里的误差信号方差一起分析如果眼图中间眼明显塌陷但误差方差不大说明均衡和CDR没问题问题在前端线性度如果眼图看着可以但误差方差很大那多半是鉴相器归一化没做好。这套环路数字量片上眼图的组合比单纯看误码率高到不知道哪里去了。6. 实测中的翻车现场与排查路径6.1 锁定后误码率居高不下控制字却有规律扰动第一块样片回来的时候56G PAM4链路能锁定但误码率一直下不去。拉出数字环路的控制字日志看发现控制字在一个固定频率上做正弦状扰动频率大概几百千赫兹。我当时第一反应是外部电源噪声或者接地问题但查了一圈电源纹波很正常。后来把DCO控制字的低频扰动做频谱分析发现它正好和供电网络上一个开关频率的谐波对上而那片区域的LDO去耦电容因为封装走线关系实际效果远没有仿真里那么好。定位之后两个动作一是把DCO供电改到独立的干净电源域二是把CDR环路带宽略微收窄让电源耦合进来的噪声落在环路补偿范围之外。这个现象提醒我数字CDR的调试里控制字本身是一个极其敏感的探针它能帮你把链路内部的微弱周期性干扰暴露出来这是纯模拟环路很难做到的。6.2 低温能锁、高温失锁最后查到粗调bank头上另一个案例是样片在常温下一切正常放进高低温箱低温能锁定高温就失锁。排查到DCO粗调bank发现高温下振荡器频率整体走低粗调控制字已经被环路推到了最大边界但细调字也已经接近上限整条调谐曲线都被推出工作区间。原因清楚后就好办了。我没有去重新拉宽粗调范围因为那会影响Kdco和面积而是在启动流程里加了一个低频温度监测温度变化超过一定阈值就暂停数据面重新做一次DCO频率粗校准把粗调字拉回中间位置再恢复闭环。这个思路实际上是把粗调问题从连续跟踪问题变成了事件触发问题因为链路里本来就有动态信道重训练机制借过来用就行。要是不做这个处理高温场景下产品可靠性根本没戏。6.3 多lane并行时控制字互相拍动电源串扰的锅多lane SerDes里面每个lane的CDR都是独立环路但DCO或者时钟分配器往往共用一个电源域。实测四lane并行时从debug总线看到相邻lane的DCO控制字在低频上彼此拍动而且拍频正好是两个lane频率的差值。这是典型的注入牵引现象一个lane的DCO能量通过电源或者衬底耦合到另一个lane弱振荡器被强振荡器拉过去一点环路感知到频率变化又往回推结果控制字就一会往上走一会往下走。应对办法有几个方向时钟分配上用隔离buffer电源上做深度滤波或者从系统层面错开各lane的DCO工作频率让拍频远离环路带宽。最后我们选择了电源深滤波加digital控制字扰动检测的组合同时在布局上让相邻lane的LC振荡器距离拉远。这个问题的排查心得是看到DCO控制字拍动别只盯着环路参数先想想物理耦合路径。6.4 一套可复用的排查清单以下是几次流片测试之后沉淀下来的排查清单每次遇到CDR相关异常我基本都按这个顺序走一遍能省掉很多重复劳动。现象优先检查点典型结论锁定后BER高DCO控制字频谱、误差信号方差电源耦合、鉴相器归一化、眼图偏置高低温失锁粗调bank位置、细调字余量调谐范围不足需要事件触发重新粗校多lane互相拍动控制字拍频、供电隔离注入牵引物理隔离或错频上电偶尔锁不住复位时序、控制字初始值上电清零缺失、粗校窗口太短抖动容忍不过环路带宽是否匹配模板、DLF延迟路径带宽过高或离散延迟未补偿Debug总线的设计值得多花一点面积。我习惯把误差信号e[k]、积分输出a[k]、控制字c[k]、锁定指示都挂到专用的debug寄存器组里测试模式下可以通过低速接口实时搬出来。这套东西在实验室里能解决的问题比多设计一块测试板要有效得多。最后再分享一个细节DCO控制字初始化和复位释放时序。我在第一版设计里忘了做上电清零复位释放瞬间DCO控制字是随机态导致CDR粗校会从完全不确定的频率开始搜有概率撞到一个错误的粗调挡位上又因为调谐曲线重叠而锁进旁瓣。后来加了一个上电清零模块复位释放后先把控制字打到已知中间值再开始频率粗校这个坑就再也没有出现过。56G PAM4的BBCDR设计一半功夫在算法另一半在给算法兜底的电路和时序细节希望这篇能帮后面的朋友少走几步弯路。