为什么物理层是CXL的基石

说实话,刚接触CXL协议那会儿,我第一反应是——先把应用层搞清楚再说。后来踩了坑才发现,链路训练没搞明白,后面的东西全是空中楼阁。你想想看,CXL要跑在PCIe 5.0/6.0的电气层上,物理层如果训练失败,事务层连握手的机会都没有。

这一章我们就把物理层的基础打牢,再把链路训练到底在做什么讲透。嗯,我习惯先画一张整体的关系图,让你一眼看清各层之间的位置。

核心认知:CXL物理层直接继承PCIe物理层,但增加了与CXL协议相关的初始化握手和状态协商。链路训练是物理层最关键的“开机自检”过程。

1. 物理层的分层结构

物理层往下走是电气层(Electrical Sublayer),往上走是逻辑层(Logical Sublayer)。逻辑层里又分MAC、PCS、PMD……听起来很绕,但你记住一句口诀就行:电气负责“跑信号”,逻辑负责“管握手”。

子层 职责 我注意到的坑
PMD(物理介质相关) 差分信号驱动、接收均衡 曾经一根连接器接触不良,训练死在Polling.Compliance阶段
PMA(物理介质附加) 串行化/解串、时钟恢复 SerDes极性搞反,训练死活过不了Detect
PCS(物理编码子层) 128b/130b编码、扰码、块同步 扰码种子不匹配,接收端一直报编码错误
MAC(介质访问控制) 链路训练状态机、Flit打包 这才是CXL训练的核心战场

我个人习惯把物理层想象成一个快递分拣中心。电气层是传送带和扫码枪,逻辑层是分拣规则和异常处理。CXL的物理层就相当于给这个分拣中心额外加了“冷藏运输”能力——多了CXL特有的初始化和仲裁机制。

2. 链路训练到底在做什么

链路训练说白了就是两端互相“认识”的过程。一根CXL链路,从不通电到能传Flit,中间经历了好几个阶段。我总结成三个关键词:发现、握手、确认。

  • 发现(Detect):判断对端是否存在,接收器有没有信号
  • 握手(Polling & Config):协商速率、宽度、扰码器状态、极性反转
  • 确认(L0):发送训练序列(TS1/TS2),确认双方进入正常操作状态

你可能会问:“为什么PCIe的链路训练就可以,CXL还需要单独一章?” 关键在于CXL在L0之后多了一个CXL初始化阶段——要交换设备能力、协商虚拟通道映射、还有一致性域绑定。这个流程如果物理层不配合,后面的状态机根本跑不动。

我的经验:调试CXL链路训练,一定要先确认物理层是否跳过了Polling –> Configuration –> L0这个PCIe标准路径,再去看后续的CXL Capability交换。曾经有一板卡,收端报告Link Up了,但CXL的MLD始终发不出,查了三天——结果是物理层在L0的协商里漏了Flit模式使能。

3. 训练序列(TS1/TS2)的功能

链路训练的核心消息就是训练序列。TS1和TS2是一组固定格式的符号序列,承载了速率协商、链路宽度协商、极性、扰码器重置等关键信息。我当年做设计时,经常用逻辑分析仪抓TS1来确认链路是否进入了正确的协商步。

字段 含义 典型值
速率标识 指示对端支持的速率 5 GT/s, 8 GT/s, 16 GT/s, 32 GT/s
链路宽度 协商的通道数 x1, x2, x4, x8, x16
扰码器控制 是否启用扰码及种子 Disabled / Scrambler-0
极性反转 是否交换差分对正负 0 或 1(由硬件自动协商)
热复位指示 是否发起热复位 Hot Reset / Normal

千万不要以为TS1/TS2只是PCIe的事。CXL物理层沿用了同样的训练序列,但利用了预留字段来传输CXL特有的信息,比如Flit模式使能、备用通道映射。所以你在分析训练日志时,必须区分哪些位是物理层协商,哪些位是CXL扩展。

4. 链路训练状态机(LTSSM)速览

CXL的链路训练状态机基本就是PCIe LTSSM + CXL扩展。状态机主要包括:

  • Detect:检测接收端是否有阻抗匹配、是否存在远端正点
  • Polling:发送TS1,确认对端能正确接收并回应
  • Configuration:通过TS2协商最终的速率和宽度,完成位锁定和符号锁定
  • L0:进入正常操作,数据开始传输
  • L0s / L1 / L2:低功耗状态(CXL也支持快速唤醒)

这里的重点在于:CXL在L0之后并不是直接收发Flit,而是先进入一个CXL Initialization子状态——交换Device Capability、协商VC map、配置一致性基地址。这步走完,才算真正的链路就绪。

注意:我曾经在系统集成时遇到过一个问题:A端报告L0了,B端也报告L0了,但CXL事务层就是发不出去。后来定位发现——A端认为链路宽度是x8,但B端在Configuration阶段误判为x4,两端宽度不同,物理层Link Up了但数据无法对齐。根源是接收端均衡参数微调导致采样窗口偏移,把TS2的宽度字段读错了。所以记住:训练完成后一定要双端交叉校验协商结果。

5. 一张图看懂本章脉络

物理层基础与链路训练核心流程 电气子层 PMD/PMA 逻辑子层 PCS/MAC CXL扩展初始化 训练序列 TS1 / TS2 Detect Polling Configuration L0 CXL 初始化 (Capability交换) 低功耗 L0s / L1 / L2 避坑提醒 训练完成后必须双端交叉校验协商宽度/速率,防止假Link Up

6. 物理层测试与调试要点

最后聊点实战的。我在多个CXL项目里都吃过物理层训练的亏,总结几个必查点:

  1. 链路宽度和速率:用训练序列记录核对两端寄存器的Negotiated Link Width和Speed
  2. 极性反转:差分对在PCB布线阶段可能反接,训练时TS1/TS2会协商修正,但有时修正失败不会报错——需要看PHY层状态寄存器中的Polarity字段
  3. 均衡系数:CXL 5.0/6.0需要预设均衡,尤其是接收端的CTLE和DFE。我建议在Polling阶段就抓一下Preset/Hinting值
  4. CXL扩展状态:物理层报告Link Up后,一定要读CXL Device Capability Extension寄存器来验证Flit模式、备用通道映射等

小技巧:调试时先让两端都进入L0,然后各发一个TLP Flit看看对端是否能收到并回ACK。如果ACK收不到,八成是物理层协商有误——不是CXL协议层的问题。