ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

片上眼图技术详解:EOM与2D Eye Scan的原理与工程实践

片上眼图技术详解:EOM与2D Eye Scan的原理与工程实践 把示波器接到高速串行链路上测眼图是很多信号完整性工程师的常规动作。但有一个问题经常被忽略当链路速率跑到几十Gbps封装和板级走线带来的损耗已经让眼图闭合严重外部探头点又不一定存在这时候怎么判断芯片内部接收端真正看到的数据眼是什么样子答案就是片上眼图on-die eye技术。这个方向的两种典型实现一个是EOMEye Opening Monitor另一个就是二维眼图扫描2-D Eye Scan。这篇文章想把它们的原理、架构和落地中的坑从头到尾讲清楚适合做SerDes验证、高速接口调试或者对PCIe/USB/以太网接收端测试感兴趣的朋友。1. 为什么要在芯片内部做眼图1.1 外部示波器在高速链路面前的三重局限如果只做芯片功能验证外部示波器加上高速探头已经能解决很多问题。可一旦进入量产测试或者系统级调试外部仪器的局限性会越来越明显。第一高速信号在PCB走线、连接器、封装基板上都会产生反射和损耗越靠近接收管脚信号越接近芯片真正看到的样子而示波器探头点往往离接收器输入还有一段无法消除的物理距离。第二现代封装越来越倾向于把高速串行接口封装到内部甚至有些信号不引出封装根本没有外部观测点尤其是3D封装或者带硅中介层的chiplet方案测量点就被完全封死在系统内部。第三示波器带宽和探头负载会改变信号完整性本身探头焊点、地线长度、输入电容都会引入额外的谐振测出来的眼图不一定代表真实工作状态。把这个问题放到量产测试场景里会更鲜明。一颗交换机芯片有几十甚至上百个SerDes lane如果每个lane都靠外部示波器去点测测试时间完全不可接受。而且很多场景的误码是间歇性的几分钟甚至几小时才出现一次外部示波器很难做到长时间无人值守采集。片上眼图技术正好弥补这些短板它直接放进接收机内部测量的是真正到达数据采样器的信号质量不需要外部探头也不受测试夹具限制还能通过寄存器接口随时启动、随时读取。从验证、量产筛选到在线健康监测它都能发挥作用。1.2 片上观测不是示波器而是一套统计采样式仪表这里想强调一个经常被误解的点片上的观测点和实验室里的高带宽示波器是两种完全不同的测量设备。片内观测不需要高带宽模拟前端也更不需要每秒几百Gsps的ADC它更像一个带可调判决门限和可调采样相位的“滑动采样器”配合后端的误码统计逻辑用统计方式重建眼图。这样虽然不能像示波器那样看到单次波形却能直接回答接收机最关心的问题当前数据采样点的电压余量和时间余量还有多少哪些区域的误码率已经高到不可接受。这正好是数字通信接收链路的核心指标比单纯观察波形形状更贴近工程决断的依据。换句话说片上眼图技术把“测量”这件事情从模拟域搬到了数字统计域。它不再追求把波形完整采下来而是把问题拆成一个一个“在这个电压、这个相位下数据能不能被正确判决”的二元测试。每一次测试只回答对错但把整个二维空间里的所有点都测一遍后我们就能拼出一张完整的高分辨率误码率地形图。这个思路是EOM和二维眼图扫描共同的基石下面的内容都是围绕这个统计测量思想展开的。1.3 EOM与2-D Eye Scan的定位差异EOM和2-D Eye Scan并不是两种互相替代的方案它们处在同一思想的不同粒度上。EOM通常只沿着某一个方向做扫描比如固定采样相位只扫描判决电压或者固定判决电压只扫描采样相位。这样得到的是两个一维曲线一个描述电压余量一个描述时间余量。2-D Eye Scan则是把电压和时间两个维度同时铺开形成一张二维的误码率等高线图视觉上就更接近示波器上看到的眼图。这个差异直接决定了硬件复杂度。EOM只要一个可调的判决电压源、一个可调的相位控制单元再加一个误码统计模块寄存器控制简单测量速度也快2-D Eye Scan需要二维的扫描控制、更细的相位插值器以及能存下整张误码率矩阵的内存。代价是更大的面积和功耗好处是能看到“眼睛”的形状而不仅仅是一条曲线。实际项目中很多芯片会把两种功能做在一套硬件里固件决定是只扫一条线还是铺开成一张网。2. EOM的核心原理一个采样器如何画出“眼睛”2.1 从接收机基础结构理解可调采样窗口要理解EOM先得理解接收机的基础结构。常规的高速串行接收机里数据采样器是一个电压比较器输入信号和某个参考电压比较在时钟边沿到来时判决当前电平是0还是1。这个时钟通常由CDR电路锁定到输入数据相位上保证采样点落在眼图的中间位置也就是理论上误码率最低的那个点。如果在这个基础上把采样器的参考电压从固定的最佳阈值改成可编程把采样时钟的相位也改成可编程那么我们就得到了一套可以“自由移动”的采样窗口。用这套窗口去扫描不同的电压、相位组合并统计每种组合下误码数就能画出接收机眼图的“水文学地形图”。这是EOM最本质的原理没有复杂的ADC也没有高速采集存储一切靠“反复采样加误码计数”。你甚至可以把它理解成一台极其慢速但极其精确的扫描电子显微镜只不过它观察的对象是抽象的判决裕量。2.2 电压扫描与时间扫描的一维解读一次典型的电压扫描是这样做的先让CDR锁定在正常数据相位上然后把采样阈值从信号摆幅的下端一直扫到上端。阈值很低的时候采样器几乎总把它判成1误码率很高阈值很高的时候几乎总判成0误码率也很高只有当阈值落在眼图中心的电平范围内误码率才很低。把误码率随阈值变化的曲线画出来曲线的底部宽度就反映了当前电压余量。这就是常说的BER浴盆曲线的“电压版”。时间扫描同理固定住最优阈值让采样时钟相对数据眼图的相位从左边扫到右边误码率会在眼图中心区域很低在靠近数据跳变沿的位置快速抬升。这个曲线就是时间方向的浴盆曲线曲线中间那段“盆底”的宽度就是眼睛的水平张开度。EOM固件最终返回给用户的往往是这两个方向上的余量数值比如“电压余量120mV”“时间余量0.32UI”。这些数值比一个模糊的“信号质量好”要硬核得多也是寄存器测试中用来判断链路健康状况的重要依据。工程上做EOM测量时还有一个容易被忽略的细节电压扫描和时间扫描之间不是完全独立的。采样相位没对准最优位置的时候测出来的电压余量自然会变小同理判决阈值偏了时间余量也会变小。所以严格的EOM流程应该是先粗扫电压找到最优阈值再在最优阈值下细扫时间然后回到电压维度微调一次形成两轮迭代。高速链路对参数比较敏感的时候这个过程多做几轮才能拿到一个稳定的数值。2.3 为什么用误码率替代幅度有人会问既然片内看不到完整波形为什么还能算“眼高”这里的关键设计思路是用误码率替代幅度信息。误码率本身就是接收链路质量最真实的度量因为最终衡量一个链路能不能用的标准就是比特错误数够不够少。小幅度的眼图如果噪声裕量充足误码率可以很低而幅度很大的信号如果伴随大量抖动误码率反而很高。EOM把传统示波器上“电压/时间/幅度”的图像转换成了“某一点上能否正确判决”的概率问题这是它能够用简单硬件实现复杂功能的基础。另一个角度是误码率阈值直接对应系统设计要求。PCIe、以太网等协议都会指定一个目标误码率比如1e-12。如果你能在片上扫描中找到“误码率低于1e-12”的闭合区域那就说明链路满足协议要求。外部示波器测出来的“眼图看起来很大”并不代表误码率达标反过来眼图看起来不大只要采样点处误码率足够低照样是合格设计。所以片上EOM实际上是一个更贴近协议语义的测量方案。3. 从EOM到2-D Eye Scan的实现路径3.1 为什么要铺开成二维一维EOM已经能给出电压余量和时间余量两个数值但当芯片需要做更精细的故障分析时这两个数值不够用。例如一个链路电压余量偏小到底是由于眼图整体幅度变小还是因为特定码型引起的ISI在某个相位区域形成了“塌陷”一维曲线很难定位这种局部问题。二维扫描则以网格方式把整个单位间隔UI内的误码率逐点测出来得到类似地形图的眼图轮廓。你不仅能判断余量大小还能看到眼睛左眼宽、右眼窄或者某个角落存在异常误码岛。这种排查能力在数据中心交换芯片、存储控制器、CPU与PCIe Switch互连的调试中尤其有价值。二维扫描的另一个价值是做“链路老化”和“边际分析”。芯片出厂时眼图余量可能很宽但运行一段时间后电源老化、电容退化、散热不均都会让眼图慢慢变窄。二维眼图扫描能把这些变化量化比如某个相位区域的误码率从1e-10恶化到1e-6说明时钟树或者特定数据通路的时序余量在衰减。这是传统外部测试很难发现的趋势性变化也是片内测量最大的好处之一。3.2 实现架构核心模块怎么搭二维眼图扫描模块的典型架构可以拆成几块可调阈值判决器通常复用接收机数据通路中的比较器或者增加一个辅助误差采样器阈值由一个片上DAC控制步进精度决定了电压分辨率。相位插值器从CDR或本地时钟生成一个可连续移相的采样时钟步进精度决定时间分辨率。误码计数器与比较逻辑在每个扫描点统计一段时间内的比特错误数。扫描控制状态机负责二维网格的遍历顺序、驻留时间、数据读取。寄存器接口与扫描结果缓冲区给固件暴露配置项和读取结果。这里电压分辨率的设计需要和信号摆幅匹配。如果是PCIe Gen4级别20Gbps左右信号幅度在差分400mV左右用10mV的电压步进可以扫40个电压点。时间分辨率要在1UI内做到足够的细节至少需要扫32个相位点折合每个点约1/32UI。两者铺开来就是40×321280个扫描点。如果每个点统计1e6个比特在20Gbps下约0.05ms但考虑状态机切换和寄存器访问开销实测一个完整二维扫描往往在秒级甚至分钟级具体取决于误码率目标和扫描点数。3.3 扫描流程的四个阶段一个完整的2-D Eye Scan流程大致分四步。第一配置扫描范围。固件根据链路速率、信号摆幅、当前链路均衡参数算出电压最小值/最大值、相位起点/终点、步长。带宽有限时也可以只扫一个局部区域比如只看眼图右上角这在高阶调制或异常定位时很常用。第二执行扫描。状态机按“电压外层循环、相位内层循环”或者反过来逐点设置判决阈值和采样相位在每个点驻留固定时间让误码计数器累计足够的比特数然后读出误码数。控制逻辑要处理一个重要细节扫描过程中不能让CDR失锁。通常做法是先让CDR锁定到数据相位再切换成“冻结相位”或者跟随模式否则采样相位被扫描干扰误码率数值会完全失真。第三结果写入缓冲区。每个扫描点对应一个误码率样本最终形成二维数组。因为片上看不到连续波形这个数组本身就是“原始眼图数据”。有些实现还会在硬件里做一级滤波比如丢弃因为外部干扰产生的瞬时高误码避免单一毛刺拖垮整个统计。第四固件后处理。计算出每个点的对数误码率用软件画等高线并提取眼宽、眼高、眼闭合位置等指标。对应到寄存器控制逻辑核心循环大致长这样for (row 0; row N_voltage; row) { set_voltage(v_min row * v_step); for (col 0; col N_phase; col) { set_phase(ph_min col * ph_step); reset_bit_counter(); start_counting(test_interval); wait_for_count_done(); eye_map[row][col] get_bit_error_count(); } }实际代码当然更复杂但核心逻辑就是这样。复杂度主要在于状态机里对“统计时间”的管理以及扫描速度与误码率置信度的权衡。寄存器设计上还需要一个“当前扫描坐标”的只读寄存器这样固件可以随时知道扫描到哪一行哪一列同时在读取结果时避免篡改正在更新的缓冲。3.4 后处理与指标换算采集到二维误码矩阵后第一件事是把误码数换算成误码率。比如某个扫描点统计了1e8比特出错10个那误码率就是1e-7。工程上更常见的是把每个点的对数误码率画成热力图颜色越深代表误码率越高然后在图里找“误码率≤某个目标值比如1e-12的区域”这块区域就是可用余量。眼高通常取最优相位位置上的电压范围眼宽取最优电压位置上的相位范围。这里有个细节常规示波器测的眼高是上下沿分开的距离而片上EOM计算的眼高是误码率≤目标时对应的阈值范围两者数值上不一定相等这是由测量原理决定的不是bug。尤其在带有DFE的长走线链路上残余ISI会让两种定义差距拉大。所以任何基于片上眼图的结果都要在测试报告里写清楚“目标误码率是多少”否则数字没有可比性。4. 校准与抖动处理仿真不会告诉你的工程细节4.1 电压轴校准片内DAC和比较器都有失调直接按理论值设定阈值画出来的眼图往往上下不对称。对策是在进入测量模式之前先对每个lane做一次失调校准。常见做法是利用接收机的DC均衡特性发送一个已知的直流信号或低频方波然后调整DAC码值把比较器输出固定在0/1变化的中点。高端芯片还会内置内部校准电阻网络把比较器输入短接到自身参考电平直接测出失调并存储到寄存器中。校准精度直接决定电压余量测量误差我个人见过比较极端的case没做校准时测出来的眼高比实际值偏了接近30%做完校准后差异立刻降到几个百分点以内。电压校准还需要注意温度和电源电压的漂移。实验室里校完的数据在温箱里跑到85℃可能又偏了所以量产芯片里很多固件会周期性地暂停测量并重新校准。这个周期不能太短否则测量结果一直在跳固件自己也分不清是链路变差了还是校准在抖动。4.2 相位轴校准相位插值器PI也存在非线性理想情况下每步相位增量应该完全相等实际上由于工艺偏差和时钟树不平衡前几级步长和后几级往往不同。如果不校准时间余量可能偏差一个甚至几个UI。校准方法听起来不难用芯片内部产生的已知高频方波作为参考扫描相位找出与实际边沿位置对应的码值再用软件做线性化。但在分级时钟架构下不同时钟域接口处的相位毛刺非常麻烦通常需要先粗扫、再细扫两级校准。更麻烦的是相位插值器的码值和真实相位的映射关系会随频率和电压变化。所以成熟的实现不会只做一次校准而是会针对不同速率档位存一张校准查找表。每次切换链路速率之后固件重新加载对应速率的校准参数再启动眼图扫描。我踩过的坑是一套校准参数在不同速率下直接用测出来的眼宽差异巨大后来把校准表分开存问题才消失。4.3 抖动如何影响测量结果二维扫描的结果和抖动有密切关系。随机抖动RJ和高斯噪声会让眼图边缘模糊表现为误码率等高线向外扩散成圆弧确定性抖动DJ特别是数据相关抖动DDJ会造成眼图左右不对称或者上下沿错位。理解了这一点你就能从二维眼图形态反推链路问题如果眼图上半部分的1电平边界线是斜的而0电平边界线很整齐大概率是有符号相关的干扰或被射频噪声干扰如果整个眼图在水平和垂直方向均匀变窄多半是随机抖动和随机噪声变大了这时候先查电源噪声再复查时钟抖动。测量结果还会受到扫描顺序的干扰。如果你从眼的左侧开始扫到右侧电源噪声或者时钟抖动可能产生慢变漂移导致左半部分和右半部分的误码率不等。这时候可以换一个扫描方向比如从中间往两边扫或者打乱顺序随机扫对比一下结果。如果方向和顺序影响很大说明测量过程中存在低频干扰不一定是被测链路本身的问题也可能是扫描控制逻辑触发了电源域噪声这在片内测量里是很常见的伪象。5. 常见问题与排查技巧实录5.1 现象速查表这里直接列一张我自己用过的排查表适合现场照抄现象可能原因排查方向眼图整体形状正常但整体变小均衡器设置偏弱信号幅度不足提高CTLE增益增大DFE tap眼图上下不对称1电平侧明显塌陷DFE第一抽头系数异常或通道存在符号相关干扰用PRBS模式反复对比微调DFE反馈系数扫描结果中有离散的误码孤岛扫描期间电源噪声或地弹检查VRM纹波扫描时锁相环是否抖动眼宽远小于理论值相位插值器非线性或者CDR采样点偏移重新做相位校准确认CDR锁定位置二维图出现“双瞳”反射或串扰导致额外脉冲检查PCB过孔残桩、连接器回流路径高误码率点集中在特定码型后ISI/DDJ明显看跑了哪个PRBS序列换码型验证这张表最常用的场景其实是“现场排查看不见的间歇性误码”。有一次我们在调试一块PCIe Gen4 Retimer板卡时外部示波器抓了很久没抓到异常但链路总报CRC错误。后来让片上二维眼图连续扫描发现右上角有一小片误码岛坐标正好对应低速I/O引脚切换时产生的耦合噪声。这种问题用二维扫描定位起来比示波器盲扫快得多。5.2 扫描时间太长怎么办二维扫描最让工程团队头疼的就是时间。为了提高置信度每个点都想统计足够多的比特但网格一大总时间可能几分钟甚至更久。我的三个经验第一不要盲目设置很低的误码率目标。只要测量目的是对比链路健康度用1e-8甚至1e-6就够了注意“在同一水平上对比”而不是测绝对值。第二用分层策略。先用粗网格全眼扫描快速定位高误码区再对关键区域用细网格精扫。第三如果硬件支持多个lane并行扫描。很多芯片的EOM后端是分lane独立的固件可以把四个lane的扫描状态机同时跑起来总时间几乎不变。还有一个容易被忽视的技巧扫描前把测试码型固定成短周期PRBS。PRBS7比PRBS31周期短得多造出的码型覆盖度和频率分布都不同。如果只是想看眼图基本健康度用PRBS7足够扫描时每个点的误码累计可以更早达到统计置信需要压测最差场景时才切PRBS31。这样的话你不用为了一个1e-12的目标在PRBS31上等太久。5.3 和外部示波器结果对不上先查这三处不少人对完结果后会问为什么片上扫描出来的眼宽比示波器眼图小先检查三件事一是示波器探头的带宽和负载探头点在封装前的节点和芯片内部接收管脚看到的信号本来就不是同一个物理点的信号二是测量定义不同示波器测的是波形张开幅度片上统计的是某个误码率阈值下的判决裕量三是码型是否一致示波器跑的是用户自定义码流片上扫描用PRBSDFE滤波器状态不同结果自然不同。通常我会建议各方把“目标误码率”先统一再来比眼高眼宽否则只会越比越糊涂。如果对完还差很多就要怀疑校准了。先用片上扫描测一个已知良品链路如果测出来的眼高和外部示波器在同样目标误码率下对不上优先查采样器失调和相位插值器的校准参数而不是怀疑整个测量机制。片内测量结构本身是比较稳定的问题出在校准流程上的概率通常更高。6. 几点个人体会与后续扩展方向实际上把芯片内部的观察窗口扩展为产品化功能是近几年高速接口领域很值得关注的一个方向。比如让片上眼图动态运行在服务器系统中周期性报告PCIe链路健康度或者用在车载高速SerDes链路上做在线寿命预测。我个人在实际调试中的体会是EOM和2-D Eye Scan这类功能调试成功的关键在于“充分利用统计的力量”不要试图在芯片内复刻示波器而要看统计结果在时间维度上能不能稳定。还有一个很实用的小技巧遇到链路间歇性误码时与其被动抓示波器不如让眼图扫描连续循环把最高误码率的坐标读出来再对着坐标排查时钟树或电源域通常比盲扫高效得多。如果你正在做类似的设计建议从校准逻辑和扫描状态机入手先把一个lane调到稳定可复现再去铺全芯片规模顺序反了很容易陷入“到处看起来都在测其实哪个结果都不可信”的局面。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进