1. 224Gbps时钟链路为什么QEC和DCC成了绕不开的坎1.1 先看清楚224Gbps到底意味着什么224Gbps高速SerDes这个数字对做模拟/混合信号设计的人来说第一反应不是快而是惨。因为224Gbps通常不是NRZ而是PAM4调制换句话说符号率是112Gbaud一个UI只有8.93ps左右。NRZ时代还能靠更陡的边沿和更高的信噪比吃饭PAM4直接把眼高砍掉三分之二时序裕量也被压缩到极限。我经常跟团队里刚入行的同事说不要把224Gbps当成一个抽象的带宽数字你要把它换算成具体的时间。8.93ps是什么概念光在硅片里走一个毫米级别的距离差不多就要花掉十几个皮秒所以一根时钟走线的长度、一个缓冲器的延时偏差、一个反相器上升沿和下降沿的不对称统统都会变成吃掉时序预算的隐形杀手。也正因为UI小到这种程度时钟设计在整个SerDes链路里的地位就变得极其关键。传统的做法是让锁相环输出一个干净的低抖动时钟然后分频、整形、分配给采样器。但现在光有低抖动不够了你还得保证分配出去的时钟在相位关系上是严格准确的。这里面有两个最常见的误差源一个叫正交误差一个叫占空比失真对应到设计上就是QEC和DCC。1.2 QEC和DCC在时钟树里的位置先看时钟树结构。对112Gbaud的PAM4 SerDes来说主流架构是quarter-rate时钟方案也就是说VCO工作在28GHz附近产生0度、90度、180度、270度四个相位。每个相位的间隔正好是8.93ps左右等于一个UI。采样器靠这四个相位去抓数据眼图的中心任何一个相位的偏移都会直接变成采样点偏移。问题就出在这里。四个正交相位的正交只是理想情况。实际芯片里分频器、缓冲器、相位插值器都是晶体管搭出来的工艺角偏差、版图失配、电源电压梯度、温度梯度都会让90度间隔变成89度或者91度。这个偏差就是quadrature error正交误差。如果不做校正采样点就会系统性偏离眼图中心BER直接恶化几个数量级。另一个问题是占空比失真。28GHz的时钟周期是35.7ps理想情况下高电平17.85ps、低电平17.85ps。但实际电路里pMOS和nMOS的驱动能力不可能完全匹配上升沿和下降沿的延时天然就不相等出来的时钟占空比可能就是46%或者53%。对于只用单沿采样的系统占空比稍微偏一点还能忍可对于高速SerDes通常上下沿都要用或者要靠时钟的高/低电平时间来决定数据采样窗口的宽度占空比一旦偏了奇数UI和偶数UI的宽度就不一样表现为一种确定性的码间干扰也就是DCDDuty Cycle Distortion。我一直觉得QEC和DCC在SerDes时钟设计里就像两个搭台和唱戏的关系。DCC先把时钟脉冲的宽度修对称让每个UI的起点和终点都站在该站的位置上QEC再修正四个采样相位之间的间隔确保每个UI的中心都被准确命中。少了任何一个另外一边做得再好也是白搭。2. 正交误差校正(QEC)让I/Q时钟严格正交的幕后功夫2.1 正交误差的来源没有无缘无故的相位偏移做QEC之前得先搞清楚正交误差到底从哪来。我在几个项目里反复踩过类似的坑归纳起来无非这么几类。第一类是完全避免不了的工艺失配。90度和270度这两路时钟物理上一定走的是不同的晶体管、不同的走线。哪怕版图画得再对称光刻、刻蚀、离子注入的随机涨落也会让两边的阈值电压、载流子迁移率有细微差别。这个差别在低频下无所谓在28GHz下就会被放大成几度的相位差。第二类是负载不均衡。四个相位的时钟要送给不同的采样器、不同的锁存器每一路负载的寄生电容、走线阻抗天然不可能完全一致。负载不一样缓冲器的延时就不一样哪怕输入是完美正交的时钟输出端也会歪掉。这一点在顶层集成的时候特别容易出问题因为时钟模块的设计者往往管不到后级采样器怎么摆、走线怎么拉。第三类是电源和地网络引入的调制。时钟缓冲器对电源噪声非常敏感电源电压的微小波动会转化为相位调制。如果四个相位的缓冲器离电源pad的距离不同它们感受到的局部电源噪声就不一样正交误差会随PVT变化而漂移这也是为什么QEC不能只在出厂校准一次最好能自适应跟踪。实际项目里第四类来源也不少见就是分频器本身的质量。有些架构里四个正交相位是从25%占空比的四分频信号产生的分频器内部触发器的建立保持时间如果余量不足输出的相位间隔就会不均匀。这种误差往往表现为某一个相位的偏移特别大其他三个还凑合。2.2 QEC校正环路从检测到修正的完整闭环QEC的基本思想并不复杂本质上就是一个带反馈的相位校准环路核心由三部分组成相位误差检测器、环路滤波器/积分器、相位调整执行器。检测器负责判断I/Q两路时钟之间的相位差到底偏了多少。常见的做法是用过一个bang-bang类型的相位检测器比较90度时钟的边沿和0度时钟的边沿之间的时间间隔是不是等于四分之一周期。如果间隔偏大或偏小检测器输出一个正或负的误差信号。这个误差信号经过积分器累加变成一组数字控制码去调整相位插值器或者可变延迟线的抽头最终把相位差拉回目标值。相位调整执行器有两种主流实现。一种是数字控制的相位插值器把0度和90度两个基准时钟按不同权重合成得到中间任意相位另一种是可变延迟线通过控制电流或负载电容来微调某一相时钟的延时。前者在CMOS工艺下更容易做高精度、线性度也更好后者在高频下寄生更少。具体选哪个取决于架构和工艺。这里有一个关键细节误差检测器的精度和线性度直接决定QEC能校到什么程度。我用过最简单的一版bang-bang检测器精度勉强在1度左右但环路会有一个小的极限环抖动。后来改成线性度更好的三态相位检测器加高增益积分器锁定后的残余误差能压到0.3度以内。代价是多花了点功耗和面积但对224G SerDes来说完全值得。2.3 QEC的精度需求一度误差等于多少时间做QEC设计时最先要回答的问题是到底要校到多准这个不能拍脑袋得换算成时间。因为一个UI是8.93ps对应360度所以1度相位误差对应的时间大约是Δt 8.93ps / 360 ≈ 24.8fs24.8飞秒单看这个数字可能没概念。但要知道224G PAM4接收机里即使经过最好的CTLE和DFE均衡眼图的水平张开度也不会超过0.5个UI。也就是说整个发送端抖动、信道ISI、接收端时钟抖动加起来要在4.5ps左右的窗口里保证误码率低于1e-6甚至1e-9。这里每1度的正交误差就白占掉25fs的预算。听起来还是小可如果正交误差到了3度到5度就是75到125fs这在预算表里已经是一笔不能忽视的开支。所以我在项目里通常把QEC的目标定在1度以内如果有余量就做到0.5度以内。下面这张表是我做预算时常用的换算参考正交相位误差度对应时间偏差fs占UI比例0.512.40.14%124.80.28%249.60.56%374.40.83%51241.39%有同事问过我QEC环路带宽取多少合适。我的经验是如果只需要上电校准一次带宽可以做得很窄比如几十千赫兹这样对噪声的抑制最好如果要跟踪电源噪声和温度漂移带宽就得放宽到几百千赫兹但这时候要小心环路稳定性避免和时钟数据恢复环路之间发生相互牵扯。带宽的大小本质上是一个噪声抑制vs跟踪速度的折中。3. 占空比校正(DCC)50%占空比为什么如此重要3.1 占空比失真对误码率的定量伤害DCC要做的事情翻译成人话就是让时钟高电平持续时间和低电平持续时间尽量相等。听起来简单但它的重要性经常被低估。我见过不止一个项目前期仿真里把DCC忽略掉结果到了芯片回来测试BER怎么都压不下去查了半天最后定位到时钟占空比偏了5%。这个教训非常贵。到底5%的占空比失真有多大影响我们来算一笔账。假设28GHz的half-rate时钟周期35.7ps理想高电平是17.85ps。如果占空比变成45%高电平就是16.07ps比理想情况短了1.78ps如果占空比变成55%高电平又长了1.78ps。1.78ps是个什么量级一个UI才8.93ps也就是说仅仅5%的占空比偏差就大概吃掉了UI的20%。在双沿采样或者使用多相位时钟的架构里占空比失真直接表现为相邻UI宽度交替变化奇数UI比偶数UI宽或者窄。这个误差是确定性的、和输入数据pattern相关的所以它不会像随机抖动那样通过增大采样点数来平均掉它会稳定地、持续地消耗时序裕量直到把你的BER打穿。DCD最麻烦的地方是它会和其他误差源叠加。随机抖动是统计性的ISI是有记忆的DCD是周期性的。三者叠加之后眼图的水平张开度会被压缩得非常难看。我在硅后调试时经常看浴盆曲线DCD严重的时候浴盆曲线的两翼会明显不对称这就是一个典型的判断信号。3.2 DCC的实现方式从模拟到数字的几种路子DCC的实现方法业内主流的大致有三种思路各有各的适用场景。第一种是模拟开环DCC原理是把这个时钟信号经过一个RC低通滤波取平均值。因为方波的平均电压等于VDD乘以占空比系数D所以只要把滤波后的直流电压和VDD/2比较就能得到占空比是偏大还是偏小。然后用这个误差信号去调节后级整形电路的翻转阈值或者调节反相器链里pMOS和nMOS的尺寸偏置就能把占空比拉回50%。这种做法的好处是电路简单、带宽高、功耗低适合在频率非常高的地方做第一级的粗调。缺点也很明显RC滤波需要很大的时间常数才能把28GHz的纹波滤干净硅片面积成本高而且比较器的失调会直接变成占空比误差很难做到非常高的精度。第二种是数字闭环DCC。思路是把占空比误差检测出来经过ADC或者量化器送给数字逻辑数字逻辑算出一个控制字驱动一个DAC去控制可调延时单元或者可调充放电电流。这种做法精度高、可控性好还可以通过数字滤波来抑制噪声是目前中高端SerDes的主流选择。第三种是混合式前面用模拟检测器做一个快速粗调后面用数字环路做精调。我实际项目里最喜欢用的是这种方案因为纯数字闭环需要一来一回好几个周期才收敛上电时间可能变得不可接受而加上模拟粗调之后可以先把占空比从55%拉到51%附近再让数字精调慢慢收尾速度和精度都能兼顾。3.3 占空比检测器设计影响精度的核心细节DCC环路的精度上限很大程度上取决于占空比检测器本身。这个模块看似简单实际坑非常多。首当其冲的是检测器的固有失调。如果用一个简单的差分对来比较V_avg和VDD/2那么差分对的输入失调电压会直接折算成占空比误差。举个例子假设时钟摆幅是1V比较器有5mV的失调折算成占空比误差就是0.5%。在224G SerDes的时钟链路上0.5%的占空比误差意味着大约0.18ps的宽度偏差这已经快赶上预算的零头了。所以检测器的版图必须做认真的匹配设计必要的时候要用chopping或者auto-zero技术把失调消掉。第二个坑是检测带宽和纹波的矛盾。要检测28GHz时钟的平均值低通滤波器的截止频率要远低于28GHz但又要保证环路有足够的带宽去做校正这两个要求是冲突的。工程上通常用两个办法缓解一个是使用采样保持式的检测器在特定相位点采样电压避开时钟翻转的瞬间另一个是使用差分检测结构把时钟信号经过两个对称的滤波支路用差分方式来抵消共模纹波。还有一个常被忽略的点DCC检测器应该放在时钟树的哪个位置。放在源头可以保证所有后级都能受益但时钟经过多级缓冲之后占空比又会再次退化。所以更稳的做法是分层DCC主时钟源做一次校正在关键的使用点附近再做一次局部校正。多花一点功耗换来的是全链路的鲁棒性。4. QEC与DCC的协同设计与实测数据4.1 校准顺序为什么必须先DCC后QECQEC和DCC不是两个独立的模块放在一起就完事。它们在同一个时钟树上工作环路口之间会互相影响。我在前两个项目里摸索出来的经验是上电校准的顺序必须严格遵循先DCC后QEC的流程。原因很简单正交相位检测器比较的是0度时钟和90度时钟之间的边沿间隔。如果这两个时钟本身的占空比不对检测器看到的时间间隔就会混入占空比误差的成分检测结果就不干净。比如0度时钟的上升沿偏早、下降沿偏晚90度时钟的上升沿正常那么检测器会误以为两路之间的相位差偏大给出一个错误的误差信号。QEC环路就会朝着错误的方向校正甚至可能在校完之后把真正的误差弄得更糟糕。反过来DCC检测器对正交误差并不敏感它只看单路时钟的高低电平时间所以先做DCC不会受到QEC状态的干扰。这就是为什么顺序必须是DCC在前、QEC在后。我常用的校准状态机是这样的PLL锁定等待时钟频率稳定关断QEC环路让DCC环路先运行粗调收敛DCC精调收敛锁定占空比校正码打开QEC环路进行正交相位校准QEC锁定后进入正常CDR工作模式这个流程看起来简单但工程上要注意校准用的参考时钟和正常工作时的数据时钟切换时可能会引入瞬态扰动。所以状态机里必须加上足够长的settling时间确保两个环路都真正稳定了再切换不然锁到假锁点上排查起来会很痛苦。4.2 实测/仿真对比校准前后的关键数据下面这组数据来自我参与的一个基于先进FinFET工艺的224G SerDes测试芯片DCC和QEC模块都带旁路开关方便对比。参数校准前校准后改善量时钟占空比54.6%50.1%4.5%正交相位误差3.4度0.4度3度采样时钟抖动RMS268fs204fs64fs数据眼图水平张开度0.42 UI0.49 UI0.07 UIBER1e-6对应电压裕量486mV531mV45mV校准后的占空比从54.6%压到50.1%正交误差从3.4度压到0.4度。单看这两个数字可能觉得改善也不算大但放到整体链路预算里0.07个UI的水平张开度改善往往就是BER从1e-4降到1e-8的决定性因素。还有一点值得注意校准后RMS抖动反而变小了这也符合预期。因为DCD和正交误差本质上都是确定性抖动它们会以某种方式叠加到总抖动上。把这些系统性偏差去掉之后测到的抖动就更接近真实的随机抖动反而能更好地反映电路本身的噪声底。如果你测出来的抖动在校准后没有改善那可能说明你的DCC或者QEC根本没校到点子上。4.3 协同设计时容易被忽略的害群之马QEC和DCC做得再好如果周围的环境不给力照样白搭。几个经常被忽略的点我在这里专门提醒一下。第一个是电源域隔离。QEC和DCC的模拟环路对电源噪声特别敏感尤其是VCO和时钟缓冲器的电源最好用独立的低噪声LDO供电。如果和数字逻辑共用一个电源域数字电路翻转时产生的电源毛刺会直接调制到时钟相位上校准环路精度再高也追不上这种高频扰动。我见过一个案例DCC环路在仿真里收敛得很好一到系统联调就锁不住最后定位到是数字NoC的开关噪声通过电源网络耦合进来了。第二个是版图的对称性。QEC的核心是四个相位之间的匹配所以从VCO输出到四个相位缓冲器的路径必须尽量保证对称。走线长度、过孔数量、负载电容都要匹配差分信号要保持等长。哪怕其中一个相位多了一个不必要的过孔在高频下都可能带来不可忽略的相位差。第三个是校准环路的数字接口。很多校准环路会在锁定后把控制码冻结节省功耗。但如果芯片有动态电压频率调节DVFS切换之后PVT条件变了冻结的校准码可能就失效了。在支持DVFS的系统中QEC和DCC最好能定期重新校准或者在频率切换后触发一次快速重校。5. 工程实现中的常见问题与排查技巧实录5.1 问题排查速查表硅后调试阶段QEC和DCC相关的问题往往很难一眼定位因为现象都表现为眼图变差、BER劣化但根源可能各不相同。我把这些年遇到过的问题整理成一张速查表很有参考价值。现象可能原因排查方法和解决思路眼图两翼不对称DCD严重占空比失真旁路DCC测量时钟占空比检查检测器失调四个采样相位中某一个特别差单相负载不匹配或QEC未收敛查看QEC控制码确认环路是否锁定重点检查该相位的走线和负载校准环路始终锁不定电源噪声耦合或环路带宽设置不当检查校准时段内是否有数字模块工作尝试降低环路带宽低温正常、高温BER恶化PVT变化导致校准码失效确认校准码是否随温度更新增加温度补偿或周期性重校校准收敛但误码率没改善校准位置不对后级链路再次退化检查后级缓冲链的占空比/相位必要时增加局部DCC/QEC校准结果受数据pattern影响校准期间仍有数据翻转干扰检测器校准阶段必须让数据通道处于静默状态或使用专用参考时钟第三点我特别想多说一句校准环路的假锁问题。DCC和QEC环路本质上都是反馈系统如果初始误差太大环路可能收敛到错误的稳定点。比如正交误差超过45度时某些简单检测器的输出极性会翻转环路会把90度相位差校到270度去。解决办法是在粗校阶段先做一个范围检测确认误差方向再启动细校这样能规避假锁。5.2 几个值得坚持的工程习惯最后分享几个我这些年养成的习惯不一定写在文档里但对项目进度非常有用。第一上电流程里一定要有校准状态的可观测性。把DCC控制码、QEC控制码、环路锁定标志这些信号通过寄存器暴露出来调试时可以直接读。不要问我为什么强调这个等你遇到BER问题却不知道芯片内部到底校到什么状态的时候你就懂了。第二仿真阶段至少要跑PVT角点加失配的蒙特卡洛不要只跑典型角点。QEC和DCC最怕的就是失配而失配只有蒙特卡洛能看出来。我通常的做法是先用蒙特卡洛找出最差情况的初始误差拿这个误差去约束DCC环路的调节范围和QEC检测器的动态范围确保芯片在极端情况下也能校准回来。第三如果你在写系统集成文档务必把校准顺序、校准时间、校准功耗和对外部环境的要求写清楚。很多系统级问题其实是集成时把校准顺序弄反了或者校准期间没静默数据导致的。把这个流程固化下来能省掉后面大量联调时间。我个人在实际操作中最深的一点体会是QEC和DCC这两个模块单看都不算难难的是它们在整个时钟链路里的位置感。做设计的时候一定要跳出来想从VCO到分频器从分频器到相位调整从相位调整到采样器每一个环节都在消耗预算。DCC把宽度修准QEC把位置修对这是两条线但最终都在为同一件事服务——让采样器在正确的时间看到正确的电平。最后再分享一个小技巧芯片回来做测试时我会第一时间把DCC和QEC的旁路开关玩一遍先记下校准前后的全部寄存器值。这个动作能帮你在十分钟内判断芯片的健康状态也能在后续debug时提供一个非常干净的对比基线。这个小习惯帮我省下过不少排查时间。
