你在实验室里有没有遇到过这种情景:DUT 已经接好,线缆已经固定,但测试项仍然是一个一个手动点下去的。每个速率都要重新设置时钟恢复,每个通道都要重新导出波形,最后再把几百张截图汇总成一份长报告发给验证同事。如果做的是 M-PHY v6.0 的 PAM4 测试,这种节奏基本撑不住。
M-PHY v6.0 是 MIPI 联盟在物理层接口上的一次重要升级。它对吞吐量的要求更激进,因此在规范里加入了 PAM4 调制方式,同时又保留了 NRZ 模式,方便已有产品平稳过渡。PAM4 带来的结果,是同样的带宽下面传输效率更高,单 lane 的速率上限明显上移,适合 UFS、摄像头、显示以及车载高速链路这些场景。代价则是测试环节的复杂度明显提高:波形余量更小、测量算法更复杂、夹具和线缆的影响也更需要严格处理。
这篇文章要讲的是是德科技(Keysight)围绕 M-PHY v6.0/PAM4 的自动化测试方法,重点回答三个问题:PAM4 让 M-PHY 测试难在哪?自动化测试把哪些环节串起来了?如果要在自己实验室落地,环境和流程要怎么准备?
1. M-PHY v6.0 自动化测试核心能力速览
| 项目 | 说明 |
|---|---|
| 测试对象 | MIPI M-PHY v6.0 发射机、接收机及链路一致性 |
| 调制方式 | PAM4 与 NRZ 双模式 |
| 核心功能 | 自动配置仪器、去嵌入、时钟恢复、PAM4 眼图/抖动测量、掩码判定、报告生成 |
| 硬件依赖 | 高速示波器、差分探头、测试夹具、信号源/BERT,具体以实验室设备为准 |
| 软件形态 | 基于示波器平台的自动化测试应用,支持项目保存和参数化调用 |
| 启动方式 | 图形界面选择测试项,或通过脚本触发批量回归 |
| 批量能力 | 支持多速率、多通道、多 DUT 的循环测试 |
| 输出能力 | 文本/PDF/HTML 等报告,具体格式以软件版本为准 |
| 适合场景 | 芯片验证、模组/主板研发、预一致性测试、产线抽检 |
这套方案的价值不在“某个单点测量更准”,而在于“把整条测试链路变成可重复执行的流程”。对一个有大量回归需求的实验室来说,这才是核心收益。
2. PAM4 让 M-PHY 测试难在哪
2.1 眼图从“一个眼”变成“三个眼”
NRZ 信号只有高低两个电平,一比特一个周期,眼图看起来就是一个矩形睁开。PAM4 每个符号承载 2 bit,电平变成四个,换来的是一张图里有三个垂直方向叠加的眼。电平间距变小,同样的噪声和串扰下,误码概率会明显上升。
PAM4 眼图里的三个眼睛并不意味着三份质量相同的数据。从上到下三个眼,垂直方向的可容忍噪声幅度并不相同,同一个带宽下外部串扰的影响也不一样。很多刚开始接触 PAM4 的工程师会习惯性看中间那个眼,但实际测试中上下眼的阈值和线性度同样关键。这也是为什么测试规范对 PAM4 的测量算法、均衡模型和去嵌入流程做了更细的要求,而不是简单复用 NRZ 的模板。
所以在 PAM4 测试里,眼高、眼宽、掩码余量、电平失配、跃迁行为这些指标都非常敏感。测量的口径稍有不同,结果可能就差出很多。
2.2 时钟恢复与均衡算法更依赖软件处理
PAM4 并不是简单地“告诉示波器开 PAM4 模式”就能测准。示波器需要根据测试要求选择时钟恢复算法,同时要把 DUT 的 Tx 均衡配置考虑到测量链路里。M-PHY 规范在不同速率档位下对均衡的要求不同,手动配置非常容易漏参数。
自动化测试应用的价值,就是把这类“和标准强相关的算法配置”固定成模板。测试人员不需要在菜单里逐层找“时钟恢复类型”“均衡系数”,只要确认被测对象和速率档位,软件会按标准加载对应配置。
2.3 夹具和线缆的影响不能再忽略
速率越高,测试夹具、连接线缆、探头的插入损耗就越明显。传统做法是尽量用短走线、高质量探头,靠硬件能力硬扛。到 PAM4 阶段,这套思路不够用了,必须通过去嵌入把夹具和线缆带来的幅频响应从测量结果里扣除。
自动化的好处在于,去嵌入文件、参考面定义、端口校准信息会被一起存入工程,这样批量测试不同 DUT 时不会忘记切换对应夹具。夹具的插入损耗曲线、接口定义、参考地位置都会影响测量。如果上一代夹具想继续在 v6.0/PAM4 场景里用,先要做频域验证,确认在高频点有没有明显谐振。没有验证之前,任何测试结果都不要下结论。
2.4 测试项数量明显增加
NRZ 时代的 M-PHY 一致性测试已经有不少项目,到了 v6.0 又多出 PAM4 相关的发射机、接收机、压力眼图、抖动容限等方向。测试项一多,手工操作的时间成本就指数级上升。更重要的是,手工操作还容易产生“这次和上次配置不一样”的问题,导致结果不可比。
自动化平台的第二个核心收益由此体现:测试配置被固定下来后,复测结果才有稳定基线。
3. 适用场景与使用边界
3.1 适合谁用
最需要这套自动化的是三类人:
- 芯片验证工程师:在流片后快速跑完大量 M-PHY 测试项,定位高速链路问题。
- 模组/主板研发:验证 UFS、相机、显示接口在真实板级链路下的裕量。
- 预一致性测试人员:在送第三方实验室之前,用自动化项目做一遍排查,减少排队次数。
3.2 不适合什么场景
如果只是偶尔测一两个信号,或者做阶段性的定性观察,自动化平台的配置成本偏高,不如手动示波器来得直接。另外,如果被测芯片还在早期调试阶段,很多 v6.0 功能尚未稳定,也不建议直接跑全量一致性测试,而是先用少量测试项解决收敛问题。
如果被测对象是某颗尚未量产的芯片,测试配置应当跟随芯片版本变化。自动化工程可以维护多套备份,但不要试图“一套配置测遍所有芯片”,因为寄存器配置、链路训练策略、量产脚本都可能不同。
3.3 使用边界与合规提醒
M-PHY 规范本身属于 MIPI 联盟的标准文档,实验室在部署测试时需要注意授权边界。测试夹具和参考设计可能涉及供应商的保密协议,输出波形、报告和日志不要随意上传到公开平台。使用任何自动化测试平台前,都应确认当前软件版本和仪器固件版本是否支持所需规范,以免静态配置与最新规范有差异。
4. M-PHY 本地部署环境准备与前提条件
4.1 需要一个怎样的环境
| 类别 | 检查项 | 说明 |
|---|---|---|
| 示波器 | 带宽/采样率 | 必须覆盖被测速率对应的谐波范围,越高阶调制要求越严 |
| 探头 | 差分探头/探头放大器 | 带宽要留余量,尽量用与夹具匹配的探头 |
| 测试夹具 | MIPI M-PHY 专用夹具 | 各速率档位、PAM4/NRZ 是否同一夹具需确认 |
| 时钟/触发 | 参考时钟、触发源 | 不同 DUT 的参考时钟源接口差别很大 |
| 信号源/BERT | 接收机测试用 | 用于生成压力信号、抖动注入 |
| 软件许可 | 测试应用 License | 需要覆盖 M-PHY v6.0 测试项 |
| 控制主机 | 安装自动化软件 | 建议固定 IP 连接仪器 |
不要套用 D-PHY 或 C-PHY 的设备夹具来替代 M-PHY。M-PHY 的差分信号定义、端接方式和速率范围都不同,夹具选错会导致测量结果系统性偏差。
4.2 软件与仪器连接
自动化测试应用通常随高速示波器平台提供,实验室部署时先确认软件版本、固件版本和 M-PHY 规范版本一致。连接方式一般是网线或 USB,建议固定仪器的 IP 地址。
连接完成后,先用一个通用指令确认仪器在线。下面是一个基于 PyVISA 的通用检查脚本:
import pyvisa rm = pyvisa.ResourceManager() res_list = rm.list_resources() print("资源列表:", res_list) if res_list: instr = rm.open_resource(res_list[0]) instr.timeout = 10000 print("仪器 IDN:", instr.query("*IDN?")) instr.close()不同实验室的资源地址不一定相同,实际运行时需要把res_list[0]替换成目标仪器地址。
4.3 磁盘与报告目录
自动化测试会保存波形、去嵌入文件、日志和报告。建议单独建一个测试数据目录,按日期和 DUT 编号分目录管理,避免多轮测试互相覆盖。结构可以按下面这样规划:
lab_data/ 2025-06-10/ DUT_01/ waveforms/ reports/ logs/ DUT_02/ waveforms/ reports/ logs/5. M-PHY v6.0 自动化测试流程
5.1 创建测试工程
在自动化测试应用里新建工程,命名建议带“标准版本 + 项目代号”,例如:
M-PHY_v6.0_UFS_Regression_2025工程里需要保存三个信息:被测对象说明、测试配置参数、输出报告位置。配置参数以 JSON 形式理解比较直观:
{ "project": "M-PHY_v6.0_UFS_Regression_2025", "dut": "UFS_controller", "speed_gears": ["HS-Gear4", "HS-Gear5", "PAM4-Gear6"], "channels": ["lane0", "lane1", "lane2", "lane3"], "fix_ref": "tx_deembed_s4p", "report_dir": "./reports", "pass_criteria": "mphy_v6.0_default" }这里面的目录名和速率档位只是示例,实际要以测试应用支持的枚举值和 DUT 支持的能力为准。
5.2 配置去嵌入文件
去嵌入文件通常由夹具或 PCB 仿真得到,常见格式是 Touchstone 的 .s4p 或类似文件。把去嵌入文件挂到对应通道后,建议先做一次“只去嵌入,不判定”的通路验证,确认 S 参数文件没有翻转端口、没有单位错误。
配置完成后,可以先跑一个短波形验证窗口,观察去嵌入前后的眼图是否发生合理变化。如果软件支持波形对比,可以保存一组去嵌入前后的频域曲线。去嵌入之后,插入损耗应该更平缓,波形幅频响应更接近 DUT 输出。如果去嵌入后的结果反而出现明显高频毛刺,大概率是文件挂错或端口定义反向。
5.3 选择测试项并执行
测试项按发射机和接收机分开看:
- 发射机:PAM4 眼图、RLM、跳变时间、抖动分量、掩码裕量、去嵌入后幅频响应。
- 接收机:抖动容限、压力眼图校准、误码率、链路训练相关。
选择测试项时可以先用 2~3 个“冒烟测试项”验证整套链路可通,再放开全量测试。例如第一次跑“单一通道 + 单一速率”,确认没问题后,再选择“4 通道 + 全速率档位”的全量模式。
5.4 自动判定与报告
测试完成后,软件会根据标准生成 PASS/FAIL/余量等结果。看到 FAIL 先不要急着调 DUT,先确认三条信息:
- 波形是否正常采集,有效记录长度是否足够。
- 去嵌入文件和通道是否对应。
- 环境(温度、电源)是否和上次一致。
报告建议按批次命名,并附上 DUT 版本号、固件版本、测试时间和仪器设置。这样才能在回归中快速定位“是代码改动引入的问题,还是仪器/夹具引入的问题”。
6. 功能测试与批量回归验证
6.1 单通道单速率验证
第一个目标是跑通一条链路。示例步骤:
- 连接 DUT 的一个 lane,挂上对应夹具。
- 在测试应用中创建单一测试项,只启用 PAM4 模式下一个速率档位。
- 执行采样,查看波形是否稳定,眼图是否能正常睁开。
- 如果软件支持自动判定,直接观察 PASS/FAIL。
这一轮的目的不是测全,而是确认“仪器、软件、夹具、去嵌入、DUT 信号”这些环节都正常。
6.2 多通道多速率回归
单通道单速率通过后,再扩展成回归矩阵。典型参数组合包括:
| 组合维度 | 示例 |
|---|---|
| 速率档位 | NRZ 低档 / NRZ 高档 / PAM4 档 |
| 通道数 | lane0 ~ lane3 |
| DUT 编号 | 多颗样品 |
| 测试项 | Tx 眼图、RLM、抖动、掩码等 |
批量执行时建议写一个外层控制脚本,统一触发整个工程。这里的“一键”不是指点击一个按钮,而是指把整轮任务封装成一条命令,按脚本自动完成配置加载、测试执行、报告导出。
典型的脚本流程如下:
#!/bin/bash # 批量回归脚本示意,请按实际软件接口替换命令 PROJECT="M-PHY_v6.0_UFS_Regression_2025" OUTPUT_DIR="./results_$(date +%Y%m%d_%H%M%S)" mkdir -p "$OUTPUT_DIR" # 这里只表达流程顺序,实际调用需要按测试应用的命令/API调整 run_regression --project "$PROJECT" \ --output "$OUTPUT_DIR" \ --dut-list dut_list.txt \ --gears "HS-G4,HS-G5,PAM4" \ --lanes 4DUT 列表不要散落在备注里,建议用一个文本文件或表格保存,至少包含 DUT 编号、固件版本、测试项目、预期速率和已启用通道。脚本读取这个文件后循环执行,每一步都留有日志,这样即使中途失败也可以直接从失败项继续。
6.3 回归结果如何判断
自动化测试的价值不在“跑得快”,而在“跑得可重复”。每次回归后,重点对比三类数据:
- 各测试项 PASS/FAIL 是否稳定。
- 关键余量是否有趋势性下降,比如眼高明显变小、掩码裕量收窄。
- 新增失败项和上次改动之间有没有关联。
如果同一 DUT 连续三次测试都存在同一现象,说明问题大概率出在 DUT 本身;如果结果忽好忽坏,先怀疑环境、夹具和仪器稳定性,而不是急着改芯片。
7. 接口 API 与脚本集成
7.1 通过 SCPI 控制仪器
很多高速示波器和测试应用支持 SCPI 指令。对实验室来说,SCPI 最大的好处是可以用一条指令触发当前测试项目,并把结果状态读回来。
import pyvisa import time rm = pyvisa.ResourceManager() scope = rm.open_resource("TCPIP0::192.168.1.100::INSTR") scope.timeout = 120000 # 触发测试应用,具体指令以实际手册为准 scope.write(":APPLy:TEST \"M-PHY v6.0 PAM4 Tx\"") # 顺序执行,轮询测试状态直到完成 while True: state = scope.query(":SYSTem:TEST:STATe?").strip() if state == "RUNNING": time.sleep(2) elif state == "COMPLETE": break else: raise RuntimeError(f"测试状态异常: {state}") status = scope.query(":TEST:RESult?") print("测试结果:", status) scope.close()这段代码只是表达“用程序触发测试并查询结果”的思路。实际指令名和状态返回格式需要配合实验室中的具体软件版本。
7.2 集成到 CI 或测试管理平台
如果实验室已经有自动化管理平台,可以把回归脚本挂到 CI 上。例如每次 DUT 固件更新后,自动触发 M-PHY 回归任务。这种集成方式特别适合需要频繁验证固件迭代的团队。
CI 流程里至少保留以下输出:
- 原始波形文件。容量大,但必须保留,用于后续问题回溯。
- 精简后的 CSV 汇总,包含每个测试项 PASS/FAIL/余量。
- 日志文件,用于定位测试执行中的异常。
7.3 报告中常见字段
一份合格的自动化报告至少要有:
| 字段 | 说明 |
|---|---|
| DUT 名称 | 被测对象型号/版本 |
| 测试日期 | 精确到时间 |
| 仪器信息 | 示波器型号、固件版本 |
| 夹具信息 | 夹具编号、去嵌入文件版本 |
| 测试项名称 | 与 M-PHY 标准对应 |
| 测量值 | 实际测量结果 |
| 限值/通过条件 | 标准或自定义限值 |
| 判定 | PASS/FAIL/Margin |
8. 资源占用与性能观察
8.1 测试时间会被什么吃掉
自动化测试不一定什么都快,它的收益是“总时间可控 + 并行度提升”。单条测试链路的时间主要被三部分吃掉:
- 波形采集时间:示波器需要足够采样点覆盖 PAM4 眼图和抖动测量。
- 去嵌入与算法计算:S 参数文件点数和 CPU 性能决定。
- 报告生成与文件保存:波形文件越大越明显。
PAM4 测试对示波器有效位数和本底噪声敏感。如果实验室的设备跨代较大,不建议把老一代设备和最新设备放在同一个回归矩阵里直接比较,先分别跑基线,再统一修正差异。
8.2 如何观察性能瓶颈
记录每次回归的耗时,最简单的方式是在脚本里加时间戳:
start=$(date +%s) run_regression --project "$PROJECT" end=$(date +%s) echo "本次回归耗时: $((end-start)) 秒"如果发现波形采集时间占比过高,可以调整采样长度和平均次数;如果去嵌入耗时过长,优先检查 S 参数文件是否点位数过大;如果连续多条通道测试时间线性增长,可以考虑在软件支持的情况下并行采集。
8.3 降低非必要时间
第一次做全量回归之前,先跑一遍冒烟用例,把整体时间预估出来。测试时建议用“先失败先停”的策略:某条 lane 的 PAM4 眼图如果直接 FAIL,可以先停掉同一 DUT 剩余项目,修复后再回归。避免花一整晚跑完全部测试,最终发现根本没有有效波形。
9. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 软件无法识别示波器 | 驱动未装、IP 地址错误 | 检查网络/IP 和资源列表 | 安装驱动、更新固件、固定 IP |
| 测试应用找不到 M-PHY 测试项 | 软件许可未覆盖 v6.0 | 检查授权列表 | 联系供应商确认许可证覆盖范围 |
| 波形能采但眼图打不开 | 触发设置不对或时钟恢复配置错误 | 观察原始波形是否有正常码型 | 改用标准推荐的时钟恢复方式 |
| 测试结果忽好忽坏 | 夹具接触不良、环境干扰 | 重新插拔夹具、检查接地 | 增加紧固力矩、更换线缆 |
| 去嵌入后眼图异常 | s4p 文件通道顺序错误 | 对比去嵌入前后幅频曲线 | 检查端口顺序和参考面 |
| 批量回归中途卡住 | 仪器超时、队列异常 | 查看日志和仪器状态 | 增加超时时间、加入失败重试 |
| 报告缺失部分测试项 | 项目配置不完整 | 检查测试项是否全部勾选 | 重新加载工程配置 |
| 输出结果不稳定 | 差分探头未校准 | 执行探头校准 | 校准后重新采集 |
10. 最佳实践与合规建议
10.1 配置即资产
把测试工程、去嵌入文件、DUT 信息、限值配置都纳入版本管理。推荐保留一份“最小可运行配置”,在平台升级或换新仪器时先跑这个配置验证环境。
git add mphy_v6.0_config.json deembed/ reports/base_summary.csv git commit -m "update M-PHY v6.0 regression baseline"测出来的波形文件和日志体积可能很大,可以只把配置、CSV 报告、失败项波形纳入版本目录,普通通过项波形放到归档存储。
10.2 建立测试数据基线
每次 DUT 硬件或软件版本更新,都先跑一次基线。只有基线稳定,后续改动产生的差异才有意义。报告命名建议统一:
项目名_标准版本_DUT版本_日期_批次10.3 合规与安全
在公开渠道分享测试结果时,要对波形、眼图、测试项名称做脱敏处理。芯片原厂提供的测试夹具和内部文档通常涉及保密协议,不能上传到公共服务或 AI 工具。涉及产品发布、合规认证前,应确认测试方案是否严格对应最新版 M-PHY 规范与目标行业要求。
10.4 测试环境的稳定性
高速信号测试非常看重环境一致性。测试时尽量固定温度、电源电压、线缆布局,减少人为绕线方式的差异。自动化平台只能保证“流程自动化”,不能保证“物理环境一致”,这部分要靠实验室管理规范补上。
11. 总结与下一步
M-PHY v6.0 自动化测试,核心价值不是“按钮从灰色变成彩色”,而是把 PAM4 时代真正变复杂的测量、去嵌入、判定和报告流程固化下来。最值得先做的事,是在实验室搭建一个最小闭环:一条 lane、一个速率档位、一个测试项,先确认自动化链路可用;验证通过后再扩大到多通道、多速率、多 DUT 的回归矩阵。最容易踩的坑是拿 NRZ 时代的夹具和思维去测 PAM4,配置缺失或去嵌入文件错误,测出来的结果再自动化也没有参考价值。
下一步建议顺着两条线走:一条是测试项覆盖的完善,逐步补齐 v6.0 的发射机与接收机用例;另一条是回归机制的落地,把自动化测试脚本接入到 DUT 版本更新流程里。自动化测试本身不是目的,能够稳定复现、快速定位问题的测试体系才是。