一、CXL 简介及其测试需求
大家好,我是你们的课程讲师。干硬件测试十多年了,近两年碰得最多的新接口就是 CXL——Compute Express Link。这玩意儿到底是啥?说白了,CXL 就是英特尔拉着一帮兄弟搞出来的一个高速互联协议,专门用来解决 CPU 跟加速器(GPU、FPGA、SmartNIC)还有内存扩展设备之间的数据传输瓶颈。你想象一下,传统 PCIe 虽然快,但每次数据访问都要把数据从加速器拷到 CPU 内存再拷回去,来回折腾,延迟就上去了。CXL 不一样,它支持缓存一致性和内存语义,加速器可以直接读写 CPU 的内存空间,连拷贝都省了。
我最早接触 CXL 是在一个 AI 训练集群的项目里。客户抱怨多机间的显存同步太慢,导致 GPU 利用率只到 60%。后来我们换用了支持 CXL 的互联方案,延迟直接降了一个数量级。嗯,从那以后我就开始重点研究 CXL 的测试方法了。
1.1 CXL 的核心协议层
CXL 并不是踢掉 PCIe 从头造轮子,它在物理层复用了 PCIe 5.0/6.0 的电气特性,但在协议层上做了三层定义:
| 协议层 | 功能 | 典型用途 |
|---|---|---|
| CXL.io | 基于 PCIe 事务层,负责枚举、配置、DMA、中断等控制面 | 设备发现、寄存器配置、命令下发 |
| CXL.cache | 缓存一致性协议,允许加速器缓存 CPU 内存并维护一致性 | 加速器读/写/监听 CPU 缓存行 |
| CXL.mem | 内存语义协议,支持加速器直接访问 CPU 物理内存(类似本地内存) | 内存池化、内存扩展、共享内存 |
为什么我们要搞清楚这三层?因为示波器触发设置跟这些协议层是强关联的。举个例子,你想看 CXL.mem 的内存读请求有没有正常发出,你就不能只看 CXL.io 的配置空间访问——得在数据链路上抓到 FLIT 里的 MemRd 包才行。我吃过这个亏,当时光盯着 PCIe 的配置写操作去触发,结果怎么也逮不到 CXL.mem 的流量,后来才发现触发条件设错了协议层。
1.2 CXL 的典型应用场景
CXL 主要用在三个场景里,每个场景对触发测试的要求都不一样:
- AI/ML 加速集群:GPU/TPU 通过 CXL 直接访问 CPU 内存池,减少显存不足导致的任务中断。测试时需要触发大块 D2H 的 CXL.mem 写操作。
- 数据中心内存池化:多台服务器共享一个内存池,通过 CXL Switch 互联。测试要抓跨端口的路由信息和 Link Training 序列。
- 智能网卡(SmartNIC):网卡上的 FPGA 用 CXL.cache 处理网络流,绕过 CPU 内核。测试重点在缓存一致性窥探帧的时序。
我个人习惯,拿到一个 CXL 设备先看它的协议层需求:是纯内存扩展还是需要缓存一致性?这决定了你在示波器上关注的是 Mem 还是 Cache 的 FLIT 类型。
1.3 为什么示波器触发设置是 CXL 测试的硬门槛?
CXL 跑在 PCIe 物理层上,速率动辄 32 GT/s(Gen5)甚至 64 GT/s(Gen6),信号是差分对,电压摆幅低,抖动容限严。普通的波形触发根本不行,因为信号速率太高,你需要用示波器的高级触发功能——比如串行协议触发、错误帧触发、特定的 FLIT 包头模式匹配。
你想想看,如果 CXL 链路在 Link Training 阶段老是失败,但你却设置了一个 CXL.io 配置读作为触发条件,那训练阶段的 Pattern 0/Pattern 1 信号根本就抓不到。这就是触发维度的错配。
我当年第一次调 CXL 信号,盯着眼图看了半天没发现问题,后来用示波器的 Lane Margining 触发才揪出一根接收端的阻抗不匹配。所以,这节课我们就是要把 CXL 的协议流和示波器的触发能力彻底对齐。
1.4 CXL 测试需求框架
为了让后续的触发设置更有条理,我画了一张 CXL 测试需求图,把测试对象、关注点、触发动机串在一起。
图上能看得清楚:CXL 测试从上到下分三层协议验证、物理层特性、最后落到具体的触发关注点。我们的示波器触发设置,就是要从底层的这些关注点里匹配出特定的信号片段。
1.5 示波器触发的常见坑
最后聊几个我在项目中遇到的实际问题,算是给大家提前避雷:
- 触发模式选错 —— 很多示波器默认触发的边沿模式,但 CXL 信号需要的是串行协议触发或状态触发。我曾经把触发模式从「Pattern 1」误设成「Pattern 0」,结果链路训练一直触发的都是 TS1 有序集,抓了半天才发现。
- 触发电平设得太高 —— CXL 差分信号幅度很小(典型值 400mV pp),如果按常规 1.2V 去设触发电平,永远触不到。我建议先用自动设置看眼图,再用眼图模板辅助定位阈值。
- 忽略了前导码 —— CXL 的 FLIT 在链路层上会加前导码和 CRC,你如果只匹配了 FLIT 头部的操作码(比如 MemRd),有可能因为前导码位置不准导致触发窗口偏移。解决方法是先锁定 SKP 有序集来确定帧对齐。
嗯,这一章主要让大家对 CXL 有个整体概念,知道它长什么样、用在哪儿、测试时重点关注什么。下一部分我们正式进入示波器,讲讲怎么配置示波器的时钟恢复和去嵌——这是抓 CXL 信号的前提条件。