上周帮客户定位一块PCIe Gen3板卡的合规性问题,示波器上了之后半天没抓到眼图,最后发现设备压根就没进Polling.Compliance——它老老实实完成了链路枚举,直接跑到了Configuration状态去正常工作。这个场景我遇到不止一次,很多做硬件测试的朋友在PCIe合规性测试上一开始都会卡在同一个地方:以为只要把测试治具怼上、示波器触发设对,DUT就会乖乖吐pattern,实际上LTSSM不会无缘无故走进Compliance状态,背后的机制比想象中要绕。
这篇文章就围绕Polling.Compliance这个状态,把触发路径、硬件环境、Modified TS1里藏的pattern信息、以及实测中常见的翻车场景完整梳理一遍。不管你是刚接触PCIe测试的新人,还是已经测过几轮需要排查疑难问题的老手,应该都能从这里找到对应的那一段。
1. Polling.Compliance的触发路径:它不是你想进就能进的状态
1.1 从Polling.Active到Compliance:接收端检测超时的“被迫”分支
PCIe链路训练的起点是Detect状态,经过Detect.Quiet、Detect.Active之后进入Polling.Active。在Polling.Active里,设备会做两件事:周期性地发送TS1训练序列,同时执行接收端检测(Receiver Detect),也就是判断对端有没有接上、有没有端接。
正常链路训练中,如果发送端检测到了对端的接收端存在,并且收到了对端返回的TS1,链路就会推进到Polling.Configuration,进入速率协商、链路号分配等流程,最终走到L0正常工作。但如果检测不到对端,或者发了一堆TS1之后始终没有收到回应,LTSSM就会走另一条分支——进入Polling.Compliance。
这正是合规性测试可以利用的地方。合规性测试的场景是:被测设备(DUT)作为发送端,对端没有真实的接收器,而是接了一个符合规范的测试负载板(Compliance Load Board,CLB),或者接了一个示波器配合专用的测试夹具。设备面对的是一个没有“应答能力”的接收端,自然无法完成正常训练,于是被迫进入Compliance状态,开始发送预设的pattern给外部测量设备。
这里要特别注意一个概念:Polling.Compliance并不是一个“可以随便乱进”的状态。规范里对进入条件有明确的超时和条件判断逻辑。设备一旦进入Polling.Compliance,LTSSM就卡在那里,不会自己跳回正常训练流程,只有断电复位或者手动复位才能退出。这也是很多测试人员在操作时容易忽略的点——测试完以后必须做一次完整的复位,否则后面的正常启动测试会莫名其妙失败。
1.2 PERST#时序和Compliance使能的约定
设备进入Polling.Compliance的另一个典型路径,是上电复位阶段通过硬件引脚和PERST#时序来“预约”的。
很多PCIe芯片/板卡设计里,都预留了一个测试模式引脚(不同厂商叫法不一样,有的叫TESTEN、COMPIANCE_EN、或者直接复用某个General Purpose IO),上电时这个引脚的电平状态会被锁存。如果这个测试引脚被拉高,并且PERST#释放之后等待一定时间,设备就会在链路训练时直接进入Polling.Compliance,而不是走正常的Polling.Active流程。
工程实践上,这个时序本身就是一个容易踩坑的地方。有些板子的测试引脚没有做上拉/下拉电阻,或者复用了其他功能引脚导致电平冲突,结果就是测试模式下上电发现设备根本没进Compliance,而是正常枚举了。我在实验室里就遇到过一块转接卡,测试针脚前面的0欧电阻被贴错了位置,导致强制Compliance引脚悬空,设备每次都正常训练,示波器上自然什么都抓不到。
如果你要给自己的板卡做合规性测试,建议先确认硬件手册里关于Compliance模式使能的具体引脚和时序要求,并且用万用表量一下这个引脚在复位前后的实际电平,不要想当然地认为“设计文档写了拉高就是拉高”。
1.3 软件强制:通过配置寄存器触发Compliance模式
硬件引脚不是唯一的路。PCIe协议里预留了一些软件可控的手段来让设备进入Compliance模式,这也是很多芯片验证工程师和FAE在实验室里最常用的方法。
以常见的x86平台为例,PCIe Root Port的配置空间里有一个Link Control 2寄存器(通常位于Offset 0xA0之后),里面包含“Enter Compliance”相关的位。软件往这个位写1之后,Root Port会引导LTSSM进入Polling.Compliance状态,然后发送的pattern会带上我们想要的预设参数。Linux环境下用setpci命令可以直接操作,比如:
setpci -s 00:01.0 0xa0.w=0x0001这里的0xa0是Link Control 2寄存器的偏移地址,具体bit含义要看对应CPU/平台的手册,不同平台甚至不同BIOS版本下行为会有差异。为了防止平台差异造成误操作,正确的做法是先读出原来寄存器的值,再修改需要的bit位,最后写回。
值得提醒的是,软件强制进入Compliance之后,设备同样会“卡”在Compliance状态。想要恢复正常链路训练,必须对设备做复位或者重新枚举,否则会一直停在那里发pattern。
1.4 Compliance和Loopback的区别:一个测自己的眼图,一个测通道的误码
有不少初学者会把Polling.Compliance和Loopback模式搞混,这两个状态虽然都跟测试相关,但用途完全不同。
Polling.Compliance的核心目的,是把DUT的发送端置为一个固定的、可重复的信号源,让外部测量设备(示波器、误码仪)对发送端的信号质量和眼图进行评估。它解决的是“我的发送端信号是否满足规范要求”的问题。
Loopback模式则不同。链路进入Loopback之后,接收端会把收到的数据原封不动地返回给发送端,形成一条数据环回路径。它主要用来测通道的完整性、接收端的误码率、以及协议层的连通性。比如说,你可以在对端用误码仪发送PRBS码型,DUT收到后环回,误码仪再比较返回的数据,从而评估整个链路的比特错误率。
搞清楚这两者的区别,能避免不少测试设计上的混乱。合规性测试先做Polling.Compliance的眼图测试,再做Loopback的BER测试,这是两套完全不同的仪器链和接线方式。
2. 测试环境搭错了,再好的pattern也白搭
2.1 Compliance Load Board的选型和接线细节
进入Polling.Compliance之后,DUT发射端发出来的信号质量如何,很大程度取决于它接的是什么东西。合规性测试里,标准做法是在DUT的发射端接一块Compliance Load Board(CLB),有的地方也叫Compliance Base Board或测试夹具。
CLB的作用是把PCIe高速差分信号引出来,同时为接收端检测提供端接。CLB上通常有一对100欧差分终端电阻、隔直电容(AC Coupling Capacitor),以及连接示波器探头的SMP/SMA接口。选CLB的时候要注意几点:
- 必须支持你测试的速率。Gen3、Gen4、Gen5的CLB虽然外观看起来差不多,但传输线的损耗补偿设计差别很大,用Gen3的CLB去测Gen4信号,眼图参考点就不对了。
- 注意CLB上的参考时钟通道。有些CLB会提供Refclk输出给示波器作为触发参考,如果你的示波器没有单独的Refclk输入,就需要从CLB上引。
- 接线要短而稳。SMA线缆的损耗在10GHz以上非常明显,线缆越长、弯折越多,测得的高频分量越惨。
实际测试时,如果把DUT发射端和CLB之间多加了一根转接线,或者用了连接器接触不良的延长线,示波器上看到的眼图会明显变差,上升沿变缓、抖动变大。这个时候不要急着怀疑DUT,先检查链路里的每个连接点。
2.2 Reference Clock的SSC设置和频率容差
PCIe信号训练和发送链路,都依赖参考时钟(Refclk)来建立稳定的比特速率。合规性测试对Refclk有严格的要求,尤其是SSC(Spread Spectrum Clocking,扩频时钟)的开和关,直接影响测出来的眼图和抖动是否符合规范。
PCIe规范允许参考时钟采用SSC,典型值是-0.5%的向下扩频,调制频率在30kHz~33kHz范围。如果被测设备在实际系统中配置了SSC,但合规性测试时用的是不带SSC的参考时钟,那测出来的信号频率偏移和抖动分布就会和实际使用情况不一致。
反过来也常见:测试平台提供了带SSC的Refclk,但DUT固件里Actual Speed的配置和SSC使能不匹配,导致输出信号带有额外的低频调制成分。处理办法很简单——先看DUT的设计规格,确认它在目标频率下是否启用SSC,然后测试平台上的时钟源做同样的设置。最好是直接用信号发生器或者测试治具上的时钟输出,不要用手头的示波器自带时钟探头去将一个未知参考源引过来,那种噪声环境很难保证测量重复性。
2.3 示波器带宽、采样率和探头的影响
合规性测试的核心仪器是高速示波器,它的带宽直接决定测量结果的可信度。测PCIe Gen3(8GT/s)的时候,信号基频是4GHz,但眼图测量需要捕获到至少三到五次谐波才能真实反映信号质量,所以示波器带宽建议不低于16GHz,主流实验室会用20GHz以上。测Gen4(16GT/s)和Gen5(32GT/s)时,对示波器带宽的要求就更高了。
采样率同样关键。示波器标称的采样率能不能在测量时间内覆盖足够的样点,直接决定了抖动测量的精度。实际操作中,建议把采样率设置到示波器最高档,存储深度尽量大,因为PCIe训练序列pattern是周期性的,但抖动分析需要长时间记录才能得到统计分布。
探头也是一样。PCIe合规性测试建议使用差分探头,而且探头的前端尽量用非常短的焊点或探针接触测试点,不要依靠长接地飞线。探头地线过长会引入环路电感,导致测出来的信号带额外过冲和振铃。
3. Modified TS1里的pattern:别小看这“特殊pattern”的水位
3.1 TS1和Modified TS1的本质区别
说到“特殊pattern生成”,就绕不开Polling.Compliance状态下发送的内容——Modified TS1。很多测试人员知道要抓pattern,但不知道这个pattern长什么样,更不知道里面的bit代表着什么。
普通TS1是链路训练阶段正常发送的训练序列,它由16个符号构成,分别是COM字符、TS1标识符、链路号、通道号、N_FTS、速率ID、训练控制字段、CRC等。对端设备通过解析TS1来完成链路号协商、速率协商和训练控制。
Modified TS1是在TS1的基础上,把训练控制字段或特定字段改掉,用来把发送端的“预设状态”通知给外部测量设备。设备进入Polling.Compliance之后,发送的不再是正常的TS1,而是这种被修改过的TS1,并且会以固定的周期不断重复。
这个周期的存在很重要。测试人员在示波器上看到规律的重复波形,触发就应该按这个频率来设。如果示波器触发方式不对,就会看到波形不断闪动,没法稳定显示眼图。
3.2 Preset字段和去加重等级在pattern里怎么编码
Modified TS1里最关键的字段,是发送端预设(Transmitter Preset)的编码。PCIe规范定义了一系列preset值,每个preset值对应一组具体的去加重(De-emphasis)或者信号整形参数,从P0到P10,还有Per-Inited预设。
举个例子,在Gen3速率下,P7这个preset通常对应0dB的去加重(也就是不做去加重),P4等预设则对应不同程度的高频提升或衰减。进入Polling.Compliance时,如果设备使用某个preset发送Modified TS1,接收端的示波器软件或者协议分析仪就能解出这个preset值,从而知道你测的是哪一组信号整形参数下的眼图。
实际测试中,很多DUT不会主动选择一个“最优”preset,它只会发默认值。如果你发现测出来的眼图明显偏瘦,可以先解一下Modified TS1里的preset值,看看是不是DUT选择了不合适的去加重档位。
3.3 从Gen1到Gen4,Compliance Pattern的速率切换逻辑
另一个容易忽略的点是速率。进入Polling.Compliance后,设备一开始是在Gen1速率(2.5GT/s)下发送Modified TS1的,因为PCIe链路训练状态的起点就是Gen1。对于Gen2以上的合规性测试,需要让设备“升速”到目标频率,再发送相应速率的pattern。
这个升速过程同样不是自动发生的。在Polling.Compliance状态下,接收端(外部测试设备)需要按照规范的要求,向DUT发送某种训练序列来触发速率提升。如果外部设备只是默默地接收信号,不发送任何触发序列,DUT就会一直停在Gen1,测出来的眼图当然不符合Gen3的要求。
这个问题的排查链路非常典型。我们在实验室里就遇到过一块Gen3板卡,示波器上抓到的信号频率经过测量只有2.5GT/s,怎么看都不像是Gen3的眼图。后来一查,是测试设备没有发送升速触发序列,DUT在Compliance状态下老老实实地发着Gen1的Modified TS1。这也是为什么合规性测试不能只靠示波器“看波形”,还需要配套的控制器或者遵循规范规定的升速流程。
4. 实测排障:三个典型翻车场景和完整排查链路
4.1 场景一:示波器触发不稳,波形闪烁不定
现象:示波器上能看到信号,但波形总是跑来跑去,没法稳定显示一个完整周期的pattern。
先看触发源。Polling.Compliance状态下DUT会周期性地发送Modified TS1,每个TS1的最高位字符是COM符号(K28.5),这是一个非常明显的特征点。示波器触发应该设为对COM符号或pattern的周期触发,而不是用简单的上升沿触发。很多示波器都内置了PCIe协议解码和触发功能,直接在触发类型里选“PCIe Training Sequence”或“TS1”即可。
如果触发已经设置了,但还是不稳定,那就看触发电平是不是设在了信号幅度的非合理位置,或者信号本身是否超出了示波器的输入量程。建议先把垂直刻度调大,确保整个pattern波形都在屏幕范围内,然后再慢慢收窄,让示波器稳定锁定。
4.2 场景二:波形有,但链路速率始终停在Gen1
现象:DUT已经进入Polling.Compliance,示波器也能稳定抓到pattern,但测量信号速率只有2.5GT/s,达不到目标的8GT/s或16GT/s。
这个现象首先要确认DUT的速率能力是否配置正确。有的DUT在硬件设计上支持Gen3,但固件、EFI驱动或者测试软件在链路训练前没有把最大速率字段配置好,导致设备只能以Gen1能力后续进行协商。
排除这个问题后,再确认外部设备有没有发送升速触发序列。如前所述,Polling.Compliance状态下,单纯躺着不动的示波器是没法让DUT升速的。你需要一个能主动发送训练序列的控制器,或者使用完整的协议分析仪/链路训练器来配合。
如果是用示波器加测试治具做的简易测试,就需要确认治具上有没有提供“上升速率请求”的按钮或软件开关。有些商业测试治具会集成这个功能,但要通过上位机软件来触发。
4.3 场景三:输出电压和去加重比例与预期不符
现象:抓到的pattern幅值、过冲、去加重深度和预设值不一致,甚至眼图模板测量存疑。
遇到这种情况,先把Modified TS1解出来,确认TXD preset到底是多少。很多DUT在Compliance模式下并不会使用你期望的preset,它会用默认值或者上次EEPROM里保存的参数。然后对照规范里的preset参数表,确认当前的幅值和去加重是否符合这个preset的定义。如果preset解出来是P4,但波形显示的电压摆幅和P4的标准值差得很远,那问题就不在pattern本身,而在信号链路——可能是CLB损耗太大、探头没校准、或者DUT的电源纹波过大导致电压跌落。
4.4 排查思路整理
| 现象 | 可能原因 | 第一步检查 | 后续动作 |
|---|---|---|---|
| 示波器抓不到信号 | DUT没有进入Polling.Compliance | 检查测试引脚/PERST#时序 | 用软件强制进入Compliance |
| 信号闪烁不稳 | 触发设置不对 | 设置PCIe TS1触发 | 调整触发电平和垂直刻度 |
| 速率停留在Gen1 | 外部设备未发送升速触发 | 检查升速触发序列 | 使用协议分析仪配合 |
| 幅值/去加重不对 | Modified TS1中的preset值不符合预期 | 解码TS1字段确认识别preset | 调整DUT的preset配置 |
| 眼图整体偏小 | CLB损耗大、线缆过长 | 用直连方式复测 | 更换更短/更低损耗的线缆 |
5. 自己生成和验证特殊pattern的实操记录
5.1 用误码仪和信号源生成简易PRBS pattern
有些测试场景,比如通道完整性评估、接收端抖动容限测试,不一定需要DUT真的进入Polling.Compliance。你可以用一个误码仪(BERT)直接代替DUT,生成特定的pattern。
最常用的是PRBS码型。PCIe规范里规定了多种测试pattern的使用场景,比如PRBS7、PRBS9、PRBS31等。PRBS7用的比较多,因为它生成简单而且能覆盖大部分高频信号特征。在误码仪上设置好码率(比如8GT/s的PRBS7),输出差分信号到被测通道,另一端接误码仪接收端,就能直接测通道的误码率和眼图。
这种做法的好处是,你可以完全控制pattern内容和信号参数,不用去管LTSSM那些状态机逻辑,非常适合做通道级的调试。
5.2 用示波器解码Modified TS1验证preset值
示波器抓波形只是第一步,要真正确认DUT发出的pattern内容,需要解码Modified TS1。现在主流的高速示波器都自带协议解码软件,可以自动识别PCIe训练序列。
操作上,先把示波器触发设置到PCIe TS1,抓到稳定的训练序列波形,然后打开协议解码功能,选择PCIe总线类型。示波器会自动把16个符号解析出来,你能直接看到其中的训练控制字段、链路号、速率ID以及preset字段。对照规范中的预设表,就能验证DUT发出的pattern是否符合预期。
我个人经验是,解码之后先看TS1标识符字段,确认这确实是TS1而不是TS2——有时候DUT已经跑到了Configuration状态,发的是TS2,但你没注意,还把后面测出来的结果当作Compliance状态的结果来分析了。
5.3 一套可复用的快速验证流程
我在实验室里做PCIe合规性相关调试时,固定会走这样一套流程,能省不少时间:
- 确认硬件测试引脚/软件寄存器能让DUT进入Polling.Compliance,先用逻辑分析仪或者示波器确认LTSSM状态确实停在Compliance。
- 用示波器抓Modified TS1,确认周期和触发稳定,解码TS1确认preset字段和额定速率。
- 做眼图测量之前,先把示波器的差分探头做一次校准,并确认CLB到示波器之间的SMA线缆损耗在测试频率下是可接受的范围。
- 测量眼图、抖动、上升时间等参数,记录当时的preset值、过驱动设置、环境温度和电源电压。
- 测完一次之后,务必对DUT执行复位,让LTSSM重新处于正常状态,再进行下一轮的配置或参数调整。
这套流程看着平淡,但每一步都是在实际调试里积累出来的。尤其是第二步的解码确认,很多人会跳过,直接上来就测眼图。结果preset不对、速率不对,眼图测出来自然千奇百怪,费半天劲才发现是源的问题,还不如一开始就花两分钟把pattern内容看清楚。