4、物理层测试实战:使用示波器抓取100BASE-TX眼图、配置模板、判断Pass/Fail
眼图测试,说白了就是看信号质量好不好。
我刚开始做通信芯片验证那会儿,总觉得眼图这东西玄乎。后来被老工程师按在示波器前调了一下午,才明白——眼图就是信号的“心电图”,一眼就能看出物理层有没有病。
4.1 为什么要测眼图?
100BASE-TX是百兆以太网,跑在125MHz的时钟上。信号经过变压器、PCB走线、连接器,到了对端芯片时,波形早就不是理想方波了。
眼图能告诉你三件事:
- 信号幅度够不够——眼睛睁得开吗?
- 抖动大不大——眼睛边缘糊不糊?
- 噪声高不高——眼睛里面干不干净?
IEEE 802.3标准里,对100BASE-TX的眼图有明确要求。不符合?那对不起,你的芯片过不了一致性测试。
核心要点:眼图测试是物理层验证的“一票否决项”。眼图不过,其他性能指标再好也没用。
4.2 测试环境搭建
先说说设备。你需要:
- 示波器:带宽至少1GHz,采样率至少5GSa/s。我个人习惯用4GHz带宽的,余量足一些。
- 差分探头:1.5GHz以上带宽,最好是焊入式的。别用夹子,夹子会引入额外抖动。
- 测试板:DUT(待测芯片)的评估板,带RJ45输出。
- 码型发生器:或者直接用芯片内部的PRBS(伪随机码)模式。
我的经验:测试前先让芯片跑10分钟预热。我遇到过一例,冷机时眼图完美,热机后抖动超标——原来是PLL温漂的问题。
4.3 抓取眼图的操作步骤
好,咱们一步步来。我以Tektronix MSO64为例,其他品牌操作类似。
- 连接探头:差分探头焊接到测试点。100BASE-TX的测试点在变压器和RJ45之间,通常是TP2或TP3。
- 设置示波器:
- 垂直刻度:500mV/div(看幅度范围)
- 水平刻度:2ns/div(一个UI是8ns)
- 触发方式:上升沿触发,阈值设在0V
- 打开眼图模式:按示波器上的“Eye”或“Mask”按钮。选择“100BASE-TX”模板。
- 调整采样:采集至少10000个UI(单位间隔)。我一般采50000个,数据更可靠。
- 观察眼图:屏幕上会出现一个类似“眼睛”的波形叠加图。
注意:探头接地线要尽量短。我曾经因为接地线长了3cm,测出来的眼图抖动多了20ps——全是地环路引入的噪声。
4.4 配置模板(Mask)
模板就是标准定义的“合格区域”。IEEE 802.3-2015第40.6.1.2节给出了100BASE-TX的模板参数。
模板由三个区域组成:
- 中心区域:信号必须穿过这里,不能碰到上下边界
- 左右区域:抖动不能超出这里
- 上下区域:幅度不能超出这里
具体参数如下表:
| 参数 | 最小值 | 典型值 | 最大值 |
|---|---|---|---|
| 差分输出电压 | ±0.95V | ±1.0V | ±1.05V |
| 上升/下降时间(20%-80%) | 3ns | 4ns | 5ns |
| 抖动(峰峰值) | - | 100ps | 140ps |
| 眼图模板余量 | 10% | 20% | - |
在示波器上配置模板:
1. 按“Mask”按钮
2. 选择“Standard Mask” -> “100BASE-TX”
3. 设置“Hit Count”为0(表示0次违规)
4. 设置“Margin”为0%(先看原始结果)
5. 按“Run”开始测试
避坑指南:我曾经遇到过模板参数不对的情况。示波器自带的模板有时是旧版标准,建议手动核对一下坐标值。IEEE标准里给的坐标是归一化的,要换算成实际电压和时间。
4.5 判断Pass/Fail
测试结果就两种:Pass或Fail。但判断标准没那么简单。
Pass的条件:
- 所有波形都在模板区域内
- 没有波形碰到模板边界
- 采集的UI数量达标(通常要求1e6个以上)
Fail的常见原因:
- 幅度不够:眼睛上下被压扁了。检查驱动电流设置、变压器匝比。
- 抖动过大:眼睛左右边缘模糊。检查时钟源、PLL环路带宽。
- 噪声过高:眼睛内部有“毛刺”。检查电源纹波、PCB布局。
- 模板违规:波形碰到了模板边界。这个最麻烦,需要逐项排查。
我的经验:有一次眼图总是Fail,查了三天发现是测试电缆的阻抗不匹配。换了根50Ω的SMA线,立马Pass。你想想看,测试环境本身也会引入误差。
4.6 实战案例分析
说个真实案例。去年我测一款新芯片,眼图长这样:
- 眼睛高度:1.8V(标准要求≥1.9V)
- 抖动:150ps(标准要求≤140ps)
- 模板余量:5%(标准要求≥10%)
三项都不合格。怎么办?
我做了三步排查:
- 先看电源:用示波器测了芯片的1.8V供电,纹波有80mV。换了LDO后降到20mV,眼图高度恢复到2.0V。
- 再看时钟:用频谱仪看125MHz时钟,发现有个-40dBc的杂散。调整了PLL的电荷泵电流,杂散降到-60dBc,抖动降到120ps。
- 最后看PCB:差分走线有一处间距不对称,导致共模噪声。改版后模板余量到了18%。
总结:眼图Fail不可怕,可怕的是不知道从哪里下手。按“电源→时钟→PCB”的顺序排查,90%的问题都能解决。
4.7 自动化测试脚本
手动测眼图太慢了。我写了个Python脚本,用PyVISA控制示波器自动跑。
import pyvisa
import time
# 连接示波器
rm = pyvisa.ResourceManager()
scope = rm.open_resource('TCPIP0::192.168.1.100::inst0::INSTR')
# 设置眼图模式
scope.write(':DISPlay:FORMat EYE')
scope.write(':EYE:ENable ON')
# 加载100BASE-TX模板
scope.write(':MASK:DATa:SOUrce CH1')
scope.write(':MASK:STAndard "100BASE-TX"')
# 开始采集
scope.write(':ACQuire:STATE RUN')
time.sleep(5) # 等待采集完成
# 读取结果
hits = scope.query(':MASK:COUNt?')
margin = scope.query(':MASK:MARGin?')
print(f'模板违规次数: {hits}')
print(f'模板余量: {margin}%')
# 判断Pass/Fail
if int(hits) == 0 and float(margin) >= 10:
print('结果: PASS')
else:
print('结果: FAIL')
scope.close()
建议:自动化脚本里加个截图功能。每次测试自动保存眼图截图,方便后续追溯。我习惯用“测试日期_芯片编号_结果”的命名格式。
4.8 常见问题与对策
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 眼图幅度偏低 | 驱动电流不足、变压器损耗大 | 调整寄存器、更换变压器 |
| 眼图抖动偏大 | 时钟源噪声、PLL带宽不当 | 优化时钟树、调整环路参数 |
| 眼图不对称 | 差分走线不等长、共模噪声 | 检查PCB layout、加共模扼流圈 |
| 模板频繁违规 | 信号反射、阻抗不匹配 | 检查端接电阻、优化走线阻抗 |
| 测试结果不稳定 | 探头接触不良、地环路 | 重新焊接探头、使用隔离变压器 |
最后提醒:眼图测试不是一次性的。芯片在不同温度、电压下表现不一样。我建议做三温测试(-40°C、25°C、85°C),确保全温范围都Pass。
好了,这一章就到这里。眼图测试说难不难,说简单也不简单。关键是理解原理、搭好环境、会看结果。下一章咱们聊聊抖动分解——眼图过了,抖动不一定合格。