第2章:UCIe物理层基础:电气特性、通道编码与时钟恢复
聊UCIe协议层调试,很多人一上来就盯着Transaction层或者Link层的状态机。但我个人的习惯是:先回头看物理层。
你想想看,协议层再复杂,最终都要通过物理层那一根根差分线跑出去。物理层不稳,上层分析得再漂亮也是白搭。我在项目中遇到过好几次,LTSSM训练死活不过,最后发现是物理层的TX摆幅设错了。
所以这一章,咱们把物理层的三个核心支柱——电气特性、通道编码,还有时钟恢复机制——拆开揉碎了讲清楚。
2.1 电气特性:信号完整性的起点
UCIe作为Chiplet间的Die-to-Die接口,电气特性和板级SerDes有很大不同。信号在封装基板上走,距离短,损耗小,但噪声环境和信号密度要求更高。
核心参数速览表(我调试时经常回头翻的几个数)
| 参数 | Standard Package | Advanced Package | 说明 |
|---|---|---|---|
| 数据速率 | 4.0 / 8.0 GT/s | 16.0 / 24.0 GT/s | 取决于封装和信道 |
| TX摆幅 (差分) | 200-400 mVppd | 100-200 mVppd | 高级封装摆幅更低 |
| RX共模电压 | 0V (AC耦合后) | 0V | 必须AC耦合 |
| 眼图开度 (BER=1e-15) | ≥ 0.3 UI | ≥ 0.2 UI | 这个值太小就要警惕 |
| 阻抗要求 | 单端50Ω ±10% | 差分85Ω ±10% | 模具有差异,设计时确认 |
眼图开度这个指标,我建议新手调试时多留意。UI是单位间隔,0.3 UI看起来不大,但换算成时间,在8 GT/s下也就37.5 ps。
我曾经遇到一个案子,眼图余量只有0.18 UI,竟然也能跑完LTSSM训练,但跑压力测试时随机冒CRC Error。没办法,只能回去改RX CTLE均衡参数。
避坑指南:TX摆幅不是越大越好
我曾经和某家IP厂商联调,看到TX摆幅给的很大(接近400 mVppd),心想信号质量肯定好。结果接收端饱和了,眼图反而闭合更严重。后来把摆幅降到280 mVppd,配合RX均衡才稳定下来。记住,UCIe对功耗和信号完整性有严格折中。
2.2 通道编码:从数据到线路的搬运工
原始数据是不能直接在差分对上传输的,需要有直流平衡和时钟信息。UCIe物理层要求编码后数据流中连续相同符号的个数必须受限,否则CDR会丢锁。
2.2.1 使用的编码方式
UCIe支持两种编码模式,取决于所选的PHY类型:
- 128B/130B编码:主要用于标准封装的高性能场景。编码效率高(98.5%),只需要很小的冗余做直流平衡和同步。
- 8B/10B编码:老牌编码,用于长距离或低功耗模式。冗余大(20%),但运行不运行能力强。
为什么128B/130B编码效率高?说白了,130个bit里只有2个bit是额外开销。一个是同步头,另一个是直流平衡标志。我在调试时遇到过一种情况:同步头错位,导致整个数据流错位,解码器全线崩溃。
重要提醒:编码器状态机
UCIe要求发送端每16384个UI必须插入至少一个同步头。这是硬规定。如果上游数据流有长时间IDLE,物理层必须强制插入。我曾经在Trace里看到过连续8万个UI没有任何同步头翻转,结果接收端CDR频率偏移到了1000ppm以上——直接导致链路断开。
2.2.2 编码过程的数据流示意图
为了更直观地理解数据从应用层到物理线路的变换,我画了下面这个流程图。调试时对照这个图,能快速定位是编码前还是编码后出了问题。
2.3 时钟恢复机制:CDR怎么干活
UCIe接收端没有独立的参考时钟(或者有,只是作为晶振启动辅助),真正的时钟是从数据流里“挖”出来的。这个过程叫CDR(Clock Data Recovery)。
CDR的核心是个锁相环(PLL)加上一个鉴相器。鉴相器比较数据边沿和本地时钟边沿,产生相位误差,然后PLL的环路滤波器去平滑这个误差,最后调整VCO的频率。
说白了,就是本地时钟在不停地追着数据跑。如果数据里长期没有电平跳变,这个环路就会“迷失方向”——频率跑偏。
2.3.1 CDR锁定时间
UCIe规范对CDR锁定时间有明确要求:从有效数据序列开始,到CDR输出稳定的恢复时钟,必须在规定时间内完成。
- 标准封装:小于 500 ns
- 高级封装:小于 200 ns
这个数字我建议你在做PHY合规测试时重点关注。我遇到过一种情况:CDR锁定时间长了10%,但在ATE测试时刚好过线。结果系统联调时因为温度变化,锁定时间漂到了600 ns,导致Link Training总是在PHY Init阶段超时重试。
2.3.2 相位余量与抖动
CDR可以容忍一定量的输入抖动。UCIe规范定义了两个关键参数:
| 参数 | 标准封装 | 高级封装 | 我的建议调试值 |
|---|---|---|---|
| DJ (确定性抖动) | < 0.17 UI | < 0.15 UI | 留30%余量 |
| RJ (随机抖动, rms) | < 0.03 UI | < 0.025 UI | 看眼图直方图 |
| PLL BW (带宽) | 5-15 MHz | 10-20 MHz | 越快越容易丢锁 |
避坑指南:PLL带宽
我曾经调一个Advanced Package设计,把PLL带宽设得很宽(25 MHz),想着能快速锁定。结果数据流里一有低频抖动(比如来自电源噪声,100 kHz附近),CDR就直接跟着抖,导致恢复时钟的相位噪声急剧恶化,误码率瞬间飙升。后来把带宽降到12 MHz,配合一个大的去耦电容,问题才解决。
2.4 综合调试要点:物理层三板斧
总结一下,如果物理层出了问题,我一般按下面顺序排查:
- 测量眼图:看眼图开度是否满足最小UI要求,有没有明显的ISI或串扰。
- 检查编码状态:用示波器抓差分对上的信号,确认有足够多的边沿跳变(128B/130B的同步头必须存在)。
- 评估CDR锁定质量:观察恢复时钟的抖动频谱,看低频抖动是否被有效抑制。
一个小技巧
很多仿真工具可以导出CDR相位误差的直方图。如果这个直方图呈双峰或多峰分布,说明CDR在多个相位锁定点之间跳变。这往往是跟数据中长连“1”或长连“0”出现频率过高有关——编码器没正常工作,或者加扰器多项式用错了。
这一章讲的是物理层的硬件行为。理解了信号是怎么从数字码流变成模拟波形,又怎么被恢复成数字码流,你才能看懂后面那些复杂的协议层Trace——比如为什么LTSSM训练会卡在Polling.Reset或者为什么Link Layer会收到连续的CRC Error。
嗯,物理层就是整个链路的根。根稳了,上面的叶子才能长好。