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)
信号调制NRZNRZNRZ / PAM4
单端摆幅0.4~0.6 V0.4~0.6 V0.4~0.6 V(NRZ)/ 0.3~0.5 V(PAM4)
位错误率< 1e-12< 1e-12< 1e-12
最大信道损耗35 dB @ 16 GHz35 dB @ 16 GHz40 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 和时钟选择器。

CXL 物理层结构图 加扰 + 128b/130b 编码 串行器(Ser) 驱动 + 预加重 解扰 + 128b/130b 解码 解串器(Des) 均衡 + 采样 发送 PLL 接收 CDR 时钟选择器 图例说明 蓝色: 发送路径 红色: 接收路径 橙色: 发送 PLL / 青色: 接收 CDR 紫色: 时钟选择器 — 决定使用 Common Refclk 还是 SRIS 箭头方向: 数据流 / 时钟分配方向

你可以看到,时钟选择器是关键交汇点。如果选择 Common Refclk,发送 PLL 和接收 CDR 共用同一个参考时钟输入;如果选择 SRIS,接收 CDR 完全靠数据本身的跳变来恢复时钟。我曾经在项目中同时测试两种模式,发现 SRIS 模式下的 Jitter 峰峰值比 Common Refclk 大 40%,FEC 纠错率也更高。所以 SRIS 虽然布线方便,但系统误码率预算要更苛刻。

调试验证建议:流片前,我会在 IP 的环回模式(Loopback)下注入已知的 PRBS-31 序列,然后检查接收端解扰后的误码率。如果链路损失在 35 dB 以内,误码率应该低于 1e-12。如果高于这个数,先查发送端预加重/去加重配置,再查接收端均衡滤波器设置。

嗯,物理层这部分讲到这里差不多了。记着,物理层是协议栈的脊梁骨,电气参数、编码、时钟,三个缺一个系统都跑不起来。调试时多用眼图仪 + 误码仪,别光靠仿真。