news 2026/10/6 1:39:41

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
片上眼图技术详解:EOM与2D Eye Scan的原理与工程实践

把示波器接到高速串行链路上测眼图,是很多信号完整性工程师的常规动作。但有一个问题经常被忽略:当链路速率跑到几十Gbps,封装和板级走线带来的损耗已经让眼图闭合严重,外部探头点又不一定存在,这时候怎么判断芯片内部接收端真正看到的数据眼是什么样子?答案就是片上眼图(on-die eye)技术。这个方向的两种典型实现,一个是EOM(Eye 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×32=1280个扫描点。如果每个点统计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 和外部示波器结果对不上,先查这三处

不少人对完结果后会问,为什么片上扫描出来的眼宽比示波器眼图小?先检查三件事:一是示波器探头的带宽和负载,探头点在封装前的节点,和芯片内部接收管脚看到的信号本来就不是同一个物理点的信号;二是测量定义不同,示波器测的是波形张开幅度,片上统计的是某个误码率阈值下的判决裕量;三是码型是否一致,示波器跑的是用户自定义码流,片上扫描用PRBS,DFE滤波器状态不同,结果自然不同。通常我会建议各方把“目标误码率”先统一,再来比眼高眼宽,否则只会越比越糊涂。

如果对完还差很多,就要怀疑校准了。先用片上扫描测一个已知良品链路,如果测出来的眼高和外部示波器在同样目标误码率下对不上,优先查采样器失调和相位插值器的校准参数,而不是怀疑整个测量机制。片内测量结构本身是比较稳定的,问题出在校准流程上的概率通常更高。

6. 几点个人体会与后续扩展方向

实际上,把芯片内部的观察窗口扩展为产品化功能,是近几年高速接口领域很值得关注的一个方向。比如让片上眼图动态运行,在服务器系统中周期性报告PCIe链路健康度,或者用在车载高速SerDes链路上做在线寿命预测。我个人在实际调试中的体会是,EOM和2-D Eye Scan这类功能调试成功的关键在于“充分利用统计的力量”,不要试图在芯片内复刻示波器,而要看统计结果在时间维度上能不能稳定。还有一个很实用的小技巧,遇到链路间歇性误码时,与其被动抓示波器,不如让眼图扫描连续循环,把最高误码率的坐标读出来,再对着坐标排查时钟树或电源域,通常比盲扫高效得多。如果你正在做类似的设计,建议从校准逻辑和扫描状态机入手,先把一个lane调到稳定可复现,再去铺全芯片规模,顺序反了很容易陷入“到处看起来都在测,其实哪个结果都不可信”的局面。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 1:38:35

Allegro高速PCB设计:蛇形走线与差分等长全流程实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:38:11

NTC温度采样与TL431反馈分压电阻选型及功耗计算

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:37:11

硬件I2C与软件I2C深度对比:从AS5600磁编码器实战看嵌入式总线选型

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:36:53

IC测试向量Pattern转换全指南:从STIL/WGL到主流ATE平台

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:35:50

Virtuoso中主从式DFF设计:从原理图到仿真验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:35:34

用万用表判断电容好坏:电阻档、电容档与ESR检测实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华