第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)。
| 层级 | PCIe | CXL |
|---|---|---|
| 物理层(PHY) | Gen5/6电气标准 | 完全相同,复用 |
| 数据链路层(DLL) | 标准ACK/NAK流控 | 扩展,支持FLIT模式(Gen6起共用) |
| 解复用层 | 无 | Flex Bus层——CXL独有 |
| 事务层 | PCIe TLP | CXL.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.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/6 | CXL 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枚举 + MMIO | PCIe枚举 + CXL配置 + 内存池化 |
我曾经跟一个做系统验证的同事聊,他说“CXL就是披着PCIe外衣的新协议”。这个说法不算错,但不够精确。我更愿意说:CXL是PCIe物理层上重构了整个上层协议栈,目的是解决内存一致性和池化的问题。
下节课我们会真正进入CXL的报文格式——你会看到FLIT里的bit排列,以及如何区分一个包是CXL.io还是CXL.mem。那才是硬核的开始。