第2章:CXL与PCIe的关系——基于PCIe Gen5/6,物理层复用

好,咱们进入正题。

CXL不是从石头缝里蹦出来的。它跟PCIe的关系,说白了就是“站在巨人的肩膀上”。很多刚接触CXL的朋友会问:这俩到底啥区别?是不是CXL要取代PCIe?

都不是。

我个人习惯这么理解:CXL是PCIe物理层上跑的一套新协议。它复用PCIe的电气特性、链路训练、时钟方案,但往上走,逻辑层完全变了样。

2.1 物理层复用:共享的“高速公路”

先看物理层。PCIe Gen5和Gen6的物理层是什么?是32 GT/s和64 GT/s的差分信号对,是PAM4在Gen6时的引入,是那套复杂的均衡和训练机制。

CXL在这里做了什么?什么都没做。

它直接用。真的,就是这么干脆。

核心结论:CXL的物理层 = PCIe的物理层。

这意味着CXL设备可以直接插入标准的PCIe插槽,不需要改PCB、不需要换连接器、不需要重新设计SerDes。

我在项目中遇到过一件事:有人拿着CXL协议的PHY spec来问我,说“这跟PCIe规范里的图怎么一模一样?”我说,没错,它就是一样的。你把PCIe base spec里关于物理层的章节拿过来,直接当CXL的物理层手册看,基本没问题。

2.2 链路层和解复用层:分叉点

物理层之后,两家开始分道扬镳。CXL在PCIe原生的数据链路层(DLLP)基础上,加了一层叫“解复用层”(Flex Bus)。

层级PCIeCXL
物理层(PHY)Gen5/6电气标准完全相同,复用
数据链路层(DLL)标准ACK/NAK流控扩展,支持FLIT模式(Gen6起共用)
解复用层无Flex Bus层——CXL独有
事务层PCIe TLPCXL.io / CXL.mem / CXL.cache

嗯,这里要注意。CXL的链路层跟PCIe Gen6的链路层在FLIT模式上有交集。Gen6强制使用FLIT(流控制单元),CXL 3.0也开始支持FLIT。但两者的用法不一样。

你想想看,PCIe的FLIT是256B一个单元,专门给TLP和DLLP用的。CXL的FLIT里跑的是三类不同协议的报文。这就是解复用层出现的原因——它在链路层之上,帮你判断“这个Tunnel里装的是CXL.io、CXL.mem还是CXL.cache”。

2.3 逻辑子层复用:三种协议共享物理通道

这是CXL最核心的复用逻辑。一根PCIe链路上,同时存在三种逻辑协议通道:

  • CXL.io:基于PCIe TLP,负责控制、配置、枚举、中断。其实就是PCIe那一套。
  • CXL.mem:全新的内存语义协议,主机和设备直接共享内存地址空间。
  • CXL.cache:缓存一致性协议,设备可以访问并缓存主机的内存。

三种协议如何共享一根链路?靠的是时间片轮转 + 优先级仲裁。

我个人建议,学CXL时一定要先把这三者的关系搞清楚。三者的复用关系,我画了一张图:

CXL与PCIe的关系——逻辑子层复用示意图 PCIe Gen5/6 物理层(PHY)——完全相同,复用 数据链路层(DLL)——扩展,支持FLIT模式 Flex Bus 解复用层(CXL独有) CXL.io 控制/配置/枚举 基于PCIe TLP MCTP/DMA 非一致性访问 CXL.mem 内存语义协议 主机-设备共享地址 Load/Store语义 内存池化支持 CXL.cache 缓存一致性协议 设备缓存主机内存 Snoop过滤 一致性保证 PCIe链路层之上,Flex Bus解复用层按优先级和时间片分配带宽给三种逻辑协议 同一根PCIe链路,同时承载CXL.io、CXL.mem、CXL.cache三者

避坑指南:有些人习惯把CXL.io叫“PCIe兼容模式”,但这不是一个严谨的说法。CXL.io是原生CXL协议的一部分,它只是复用了PCIe TLP的格式。

2.4 FLIT模式:Gen6带来的新复杂度

PCIe Gen6引入了FLIT(Flow Control Unit)模式,把链路层改成256B定长数据块。

CXL 3.0也拥抱了FLIT。但有一个区别:CXL的FLIT里格式跟PCIe的不完全一样。PCIe的FLIT专给TLP用,CXL的FLIT要跑三种协议,所以头部的预留字段、CRC范围和元数据位都有调整。

我记得看到CXL 3.0规范时,有一个地方特别容易踩坑:CXL FLIT里的CRC覆盖范围比PCIe FLIT多了一个字段。如果你的逻辑层设计把两者当成完全通用的,仿真时就会报CRC mismatch。

2.5 物理层复用的意义:经济性和兼容性

为什么要复用?说白了就是省钱省事。

  • 节省研发成本:芯片设计者不需要重新开发SerDes、PLL、均衡器这些东西。
  • 节省PCB成本:标准PCIe插槽和走线规则可以直接用。
  • 节省验证成本:物理层的一致性测试、信号完整性分析,PCIe生态已经做了20年,CXL直接继承。
  • 兼容性:CXL设备可以插在普通PCIe插槽上——但只工作在CXL.io模式下,CXL.mem和CXL.cache功能不可用。

注意:虽然物理层复用,但PCIe Root Complex和CXL Root Complex在拓扑视角上是不同的。CXL需要BIOS和OS层面有专门的配置管理器(CXL Manager),不是插上就能跑到最高性能。

2.6 协议栈对比总结

来,看个完整对比:

层次PCIe Gen5/6CXL 2.0/3.0
物理层Gen5: NRZ 32GT/s
Gen6: PAM4 64GT/s
完全复用PCIe
链路层标准DLL + Gen6引入FLIT扩展链路层 + 可选FLIT(CXL 3.0)
解复用层—Flex Bus (新增层)
事务层Memory / IO / Configuration TLP三通道: io / mem / cache
软件模型PCIe枚举 + MMIOPCIe枚举 + CXL配置 + 内存池化

我曾经跟一个做系统验证的同事聊,他说“CXL就是披着PCIe外衣的新协议”。这个说法不算错,但不够精确。我更愿意说:CXL是PCIe物理层上重构了整个上层协议栈,目的是解决内存一致性和池化的问题。

下节课我们会真正进入CXL的报文格式——你会看到FLIT里的bit排列,以及如何区分一个包是CXL.io还是CXL.mem。那才是硬核的开始。