
上周帮客户定位一块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 BoardCLB或者接了一个示波器配合专用的测试夹具。设备面对的是一个没有“应答能力”的接收端自然无法完成正常训练于是被迫进入Compliance状态开始发送预设的pattern给外部测量设备。这里要特别注意一个概念Polling.Compliance并不是一个“可以随便乱进”的状态。规范里对进入条件有明确的超时和条件判断逻辑。设备一旦进入Polling.ComplianceLTSSM就卡在那里不会自己跳回正常训练流程只有断电复位或者手动复位才能退出。这也是很多测试人员在操作时容易忽略的点——测试完以后必须做一次完整的复位否则后面的正常启动测试会莫名其妙失败。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.w0x0001这里的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 BoardCLB有的地方也叫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有严格的要求尤其是SSCSpread Spectrum Clocking扩频时钟的开和关直接影响测出来的眼图和抖动是否符合规范。PCIe规范允许参考时钟采用SSC典型值是-0.5%的向下扩频调制频率在30kHz~33kHz范围。如果被测设备在实际系统中配置了SSC但合规性测试时用的是不带SSC的参考时钟那测出来的信号频率偏移和抖动分布就会和实际使用情况不一致。反过来也常见测试平台提供了带SSC的Refclk但DUT固件里Actual Speed的配置和SSC使能不匹配导致输出信号带有额外的低频调制成分。处理办法很简单——先看DUT的设计规格确认它在目标频率下是否启用SSC然后测试平台上的时钟源做同样的设置。最好是直接用信号发生器或者测试治具上的时钟输出不要用手头的示波器自带时钟探头去将一个未知参考源引过来那种噪声环境很难保证测量重复性。2.3 示波器带宽、采样率和探头的影响合规性测试的核心仪器是高速示波器它的带宽直接决定测量结果的可信度。测PCIe Gen38GT/s的时候信号基频是4GHz但眼图测量需要捕获到至少三到五次谐波才能真实反映信号质量所以示波器带宽建议不低于16GHz主流实验室会用20GHz以上。测Gen416GT/s和Gen532GT/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到Gen4Compliance 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内容看清楚。