3. 物理层
物理层这事,说白了就是让数据能在铜线上跑起来,跑得稳、跑得准。CXL 物理层直接复用了 PCIe 的物理层,但这不代表你能掉以轻心——真要调试眼图闭合时,可没人管你用的是 CXL 还是 PCIe。我记得刚参与第一个 CXL 项目时,总觉得物理层是“成熟技术”,直接拿 IP 搭就行了,结果板子回来后链路死活练不上,最后发现是差分对间距没控好。从那以后,我对物理层的敬畏心就上来了。
3.1 电气特性
CXL 1.1/2.0 使用 PCIe 5.0 的电气规范,差分信号幅度在 800 mV pp~1.2 V pp 之间。3.0 版本虽然支持 PCIe 6.0 的 PAM4 信号,但目前主流还是 NRZ(不归零码)。
我建议重点关注以下几个电气参数:
- 差分阻抗 — 100 Ω ± 10%
- 眼高 — 接收端最小允许 100 mV
- 眼宽 — 0.5 UI 以上
- 差分偏置电压 — 0 V ± 50 mV
关键参数表:不同 CXL 版本对应的物理层电气规范
| 参数 | CXL 1.1(PCIe 5.0) | CXL 2.0(PCIe 5.0) | CXL 3.0(PCIe 6.0) |
|---|---|---|---|
| 信号调制 | NRZ | NRZ | NRZ / PAM4 |
| 单端摆幅 | 0.4~0.6 V | 0.4~0.6 V | 0.4~0.6 V(NRZ)/ 0.3~0.5 V(PAM4) |
| 位错误率 | < 1e-12 | < 1e-12 | < 1e-12 |
| 最大信道损耗 | 35 dB @ 16 GHz | 35 dB @ 16 GHz | 40 dB @ 32 GHz |
有个坑我遇到过:实际板级链路中,过孔 stub 会在 16 GHz 附近产生谐振,导致眼图塌陷。我曾经就因为走线换层没背钻,眼高直接掉到 80 mV 以下,系统误码率飙到 1e-7。
注意:CXL 物理层对参考时钟的精度要求是 ±300 ppm(Common Refclk 架构),如果是 SRIS(独立参考时钟)架构,允许扩大到 ±2500 ppm,但必须配套 SSC(展频时钟)。
3.2 信号编码
物理层编码有两个目的:一是直流平衡,二是时钟嵌入。PCIe 2.0 之前用 8b/10b,PCIe 3.0~5.0 改用 128b/130b,CXL 1.1/2.0 也继承 128b/130b 编码。每 128 比特数据加 2 比特同步头,编码效率高达 98.4%。
为什么不用 8b/10b?因为 8b/10b 只有 80% 效率,在 32 GT/s 速率的时代,浪费的带宽太心疼了。128b/130b 通过加扰器实现直流平衡,而不是像 8b/10b 那样做符号替换。加扰器的多项式是固定的,发送端和接收端必须初始同步。
小技巧:仿真时,我习惯在加扰器输出插入一个位反转测试向量,检验接收端解扰是否正确。网上有现成的 PRBS 生成代码,但 CXL 用的是 LFSR 多项式 x23 + x21 + 1,别搞混了。
CXL 3.0 引入 PAM4 信号后,编码层多了一层 FEC(前向纠错)—— 因为 PAM4 的信噪比天生比 NRZ 低 9.5 dB。FEC 用的是 Reed-Solomon(544,514),码长 512 字节 + 30 校验字节。这玩意以前只在光口中见过,现在铜缆上也用了。
// 128b/130b 编码流程图(简化)
Input: 128b scrambled data
Output: 2 sync header + 128 scrambled bits -> 130b block
Sync header: 01 (data block) / 10 (control block)
// FEC 在 PAM4 模式下 (CXL 3.0)
Symbol: 6b/7b 映射到 2 个 PAM4 符号
FEC 码块: 544 symbols -> 514 data + 30 parity
3.3 时钟同步
时钟同步决定了一根线路上两个芯片能不能“对上拍子”。CXL 支持两种时钟架构:
- Common Refclk (SRC) — 发送端和接收端共用同一参考时钟。优点是 jitter 传递小,缺点是 PCB 要专门布线送时钟。
- SRIS (Separate Refclk with Independent SSC) — 两边各用自己的参考时钟,每个时钟都可以独立叠加 SSC。这省了布线,但要求 CDR 能容忍较大频率差。
我个人习惯:如果板子空间够,优先用 Common Refclk,省心。但要小心差分时钟走线等长——我曾经吃了这个亏,时钟走线比数据线长了 200 mil,skew 太大导致 CDR 失锁。
CDR(时钟数据恢复)是物理层的核心。它从接收到的数据流中提取时钟,再采样数据。对于 128b/130b 编码,数据跳变密度本来就低(平均每 130 比特只有 2 个跳变边沿),所以 CDR 必须用相位插值器(PI)做精细跟踪。
CXL 物理层时钟同步指标
| 架构 | 频率精度 | SSC 调制 | CDR 捕获范围 |
|---|---|---|---|
| Common Refclk | ±300 ppm | 无 / 可选 -0.5% | ±300 ppm |
| SRIS | ±2500 ppm | 必要 -0.5%~0% | ±2500 ppm |
为什么要这么宽的范围?因为 SSC 会把时钟频率拉低 0.5%,CDR 必须跟踪这个缓慢的摆幅。注意,SRIS 架构下,两边 SSC 的调制波形可能不同步,CDR 要处理的频率变化就更复杂了。
避坑指南:我曾经遇到 SRIS 链路在低温(-40°C)下频繁报 CRC 错误。查了半天,发现是晶振温漂太大,两边参考时钟的频率差超出了 CDR 的跟踪范围。后来把晶振换成温补型(TCXO),问题解决。记住,SRIS 的精度是 ±2500 ppm,但那是“常温 + 全寿命”字头,实际得留 20% 裕量。
3.4 物理层核心结构图
我把物理层的发送、接收、时钟域画成了一个框图,你在设计时可以直接对标。图里标出了信号编码模块、串行器/解串器、CDR 和时钟选择器。
你可以看到,时钟选择器是关键交汇点。如果选择 Common Refclk,发送 PLL 和接收 CDR 共用同一个参考时钟输入;如果选择 SRIS,接收 CDR 完全靠数据本身的跳变来恢复时钟。我曾经在项目中同时测试两种模式,发现 SRIS 模式下的 Jitter 峰峰值比 Common Refclk 大 40%,FEC 纠错率也更高。所以 SRIS 虽然布线方便,但系统误码率预算要更苛刻。
调试验证建议:流片前,我会在 IP 的环回模式(Loopback)下注入已知的 PRBS-31 序列,然后检查接收端解扰后的误码率。如果链路损失在 35 dB 以内,误码率应该低于 1e-12。如果高于这个数,先查发送端预加重/去加重配置,再查接收端均衡滤波器设置。
嗯,物理层这部分讲到这里差不多了。记着,物理层是协议栈的脊梁骨,电气参数、编码、时钟,三个缺一个系统都跑不起来。调试时多用眼图仪 + 误码仪,别光靠仿真。