资讯详情

资讯详情

PCIe Polling.Compliance进入与pattern生成:合规性测试避坑指南

干这行久了的兄弟都知道PCIe合规性测试最烦人的不是跑用例而是很多时候卡在链路训练阶段设备就是不进Polling.Compliance连pattern都发不出来后面所有电气测试全白搭。这个状态在LTSSM里看着不起眼真调起来能让人怀疑人生。我前后在里面折腾了好几个项目把一些经验教训整理成这篇东西希望能帮到正在被它折磨的人。先说清楚这篇博文适合谁看做PCIe设备开发的工程师、做信号完整性测试的硬件工程师、以及需要自己搭环境跑合规性测试的验证人员。文中我会尽量讲清楚原理但更偏重实操和避坑不会把协议规范里所有子状态全抄一遍。1. Polling.Compliance到底是一个什么状态为什么绕不开它1.1 从链路训练说起Polling阶段在整个LTSSM里的位置PCIe链路的建立靠的是LTSSMLink Training and Status State Machine链路训练和状态状态机。这个状态机从Detect开始经过Polling、Configuration最终进入L0才算握手成功。你可以把这两个设备之间的链路训练理解成两个人初次见面打招呼先是探测到对方存在Detect然后互相报名字和需求Polling接着确认双方都能接受的通信方式Configuration最后进入正常工作状态L0。Polling是LTSSM里一个很关键的阶段因为链路速率协商、发送端参数协商都发生在这个阶段。Polling下面有几个子状态Polling.Active是正常训练流程Polling.Compliance则是一个特殊模式专门用来做发送端电气测试Polling.Configuration是Polling阶段的收尾部分。正常情况下链路会直接从Polling.Active进入Polling.Configuration再进Configuration但当你设置了相应触发条件状态机就会进入Polling.Compliance让发送端持续发出固定的compliance pattern供示波器、误码仪进行测量。很多工程师一开始没搞明白一个问题Polling.Compliance不是链路训练失败后的异常状态而是一个刻意设计的测试模式。它的存在意义在于合规性测试中需要测量发送端的眼图、抖动、摆幅等参数如果发送端没有输出一个固定的、已知的码型接收端示波器或误码仪根本没法做准确测量。所以PCIe规范专门设计了这个子状态让设备可以被强制进入该模式并持续发送特定pattern。1.2 Compliance测试在整个PCIe合规性体系中的角色PCIe合规性测试Compliance Test分为很多类电气测试、协议测试、互操作性测试、配置空间测试等。其中电气测试又分为发送端测试Tx Test和接收端测试Rx Test。Polling.Compliance主要用于发送端测试被测设备DUT进入该状态后它的发送链路会输出一个特定序列测试设备采集这个信号分析眼图是否满足规范要求比如Gen3 8GT/s下的眼高、眼宽、抖动容限等。理解这一点很重要因为后续所有pattern生成、参数设置的讨论目的只有一个让你的设备稳定地、可重复地进入Polling.Compliance并且发出的pattern符合PCIe Base Spec对应章节的要求。这不仅是做认证测试必需的也是你自己做信号完整性调试时的有效工具——我经常用这种模式快速确认板卡某个通道的Tx信号是否正常比跑完整测试流程省时间得多。1.3 为什么很多人在Polling.Compliance上栽跟头说实话这个状态本身不复杂但会有很多“看似无关”的因素导致你进不去、出不来或者pattern不对。例如硬件上进入Compliance模式的引脚或寄存器没有正确配置固件里LTSSM被某段代码强制干预跳过了这个分支测试环境上链路对端测试夹具或另一块板卡也发送TS1导致状态机被带偏工具链上逻辑分析仪或示波器触发的pattern设置错了看起来像是没生成。这些我在后面的章节里会一条一条展开。我的总体建议是先把状态机的转移条件精确背下来再去做寄存器配置和硬件检查否则你会一直在试错循环里出不来。2. 进入Polling.Compliance的三条路径原理、配置与触发条件2.1 路径一通过Link Control 2寄存器强制进入这是最常见的做法适合软件可控的Root Complex或Endpoint设备。PCIe Capability Structure里有一个Link Control 2寄存器在PCIe Capability结构中的偏移约为0x20它的bit 0就是Enter Compliance位。你把它置1然后触发一次链路重训练状态机在进入Polling阶段时检测到这个位就会从Polling.Active直接跳转到Polling.Compliance。操作上大致是这几步读取PCIe Capability结构找到Link Control 2寄存器将Enter Compliance位bit 0写入1触发链路重训练可以把Link Control寄存器中的Retrain Link位bit 6置1也可以直接做一次软件复位根据平台不同方式有差异等待状态机进入Polling.Compliance并输出pattern。这里有个细节需要注意对于PCIe Gen3及以上的速率进入Compliance模式后发送哪个速率的pattern取决于Link Control 2寄存器里的Target Link Speed字段bit 6:4。如果你想测试Gen3 8GT/s的发送端指标就得先把Target Link Speed设为对应的速率再进入Compliance模式否则设备可能在Gen1或Gen2速率下输出pattern白测一场。2.2 路径二通过硬件引脚触发有些设备支持通过特定硬件引脚组合来进入Polling.Compliance这种方式在做研发调试时特别有用因为不需要任何软件参与板卡上电后拨几个开关就能进入。具体引脚定义因芯片而异常见的有PERST#与某个专用测试引脚的时序组合也有芯片保留的TMTest Mode引脚。如果你在做与自己芯片配套的测试工装建议把这条路径优先实现。因为在软件开发早期寄存器配置可能还没验证但硬件上电进Compliance模式就能提前开始信号测量等固件跑通了再改用寄存器方式两边并行能节省大量时间。2.3 路径三协议层触发协议层触发更多是测试仪器比如协议分析仪用来强制DUT进入Compliance模式的方式。原理上是让对端发送带有特定标记的TS1序列DUT在Polling状态中识别到这个标记就会跳转到Polling.Compliance。这种方式在自动化测试机台上比较常用因为不需要改DUT的寄存器只需要配置测试仪即可。不过我这里要说一句实话协议层触发在实际使用中灵活性最好但实现的坑也不少比如TS1里那个标志位与速率协商的关系在不同PCIe版本里有差异Gen1/2时代的逻辑放到Gen3/4上不一定适用。后面讲到实测避坑时我会再提。2.4 进入Polling.Compliance后子状态机到底怎么工作这个我建议每个做调试的人都先看懂。Polling.Compliance并不是一个静止状态它同样有内部流转进入Polling.Compliance后设备首先会连续发送TS1序列发送的数量和格式遵循规范要求通常是以特定的周期重复。如果满足某些条件具体看规范里定义的计数器设备可以从TS1切换到发送compliance pattern。如果对端发来了某些特定的TS1/TS2或者本地检测到某个条件状态机也可以跳出Compliance模式回到正常的Polling.Active等其他状态。很多工程师只关心“能不能发出pattern”但不关心“发出的pattern是TS1还是compliance pattern”。这会导致一个很典型的问题示波器上明明抓到了信号但对照规范一看发现抓到的全是TS1序列根本没进到真正的compliance pattern阶段。所以调试时建议同时监控LTSSM状态通过调试总线或逻辑分析仪和实际发送的码型用示波器解码两边对得上才能确认真的进入了正确的子状态。我在实测中发现某些PCIe控制器IP在进入Polling.Compliance后默认会先发一段时间TS1再切到compliance pattern这个切换时机和次数是可以通过寄存器或配置参数调整的。如果你是做FPGA原型验证这个参数调起来比较方便如果是集成第三方IP的ASIC可能需要咨询IP厂商拿对应的配置说明。3. 特殊pattern生成的核心逻辑与参数配置3.1 “特殊pattern”到底指的是什么标题里说的“特殊pattern”严格来说分两种场景场景A让设备进入Polling.Compliance此时设备发送的是TS1序列包含链路号、速率ID等字段。场景B设备进入Polling.Compliance后进一步发送compliance pattern。这个pattern通常是周期性重复的特定码型用于测量眼图等电气参数。很多中文资料里把这两种情况混在一起说导致很多人以为“特殊pattern生成”就是指发送TS1。其实在做发送端电气一致性测试时真正需要采集的是compliance pattern因为TS1长度有限、载荷固定无法像compliance pattern那样充分激励发送端的所有翻转模式。不同PCIe速率下compliance pattern的定义也不同Gen1/2用的是8b/10b编码下的特定符号序列Gen3及以上用128b/130b编码下的特定数据序列。你必须在正确的时间窗口抓到正确的码型才算拿到了可测的信号。3.2 生成路径一DUT内部LTSSM自动生成大部分商用PCIe控制器/PHY都内置了进入Compliance模式后自动生成pattern的能力。你只需要设置好速率和控制位剩下的交给硬件。这条路适合集成度高、不需要自己设计链路层的场景。自动生成时控制器可能会让你选几种pattern之一比如Compliance Pattern面向Tx电气测试的基础patternModified Compliance Pattern带更多翻转的变体对于特定测试项更有用其他厂商自定义pattern用于调试不用于正式认证选择哪种pattern取决于你的测试目的。如果只是快速看信号质量默认的Compliance Pattern基本够用如果要做严格的抖动分解或眼图模板测试建议试一下Modified Compliance Pattern有些信号完整性问题在默认pattern下不明显换Modified后就会暴露。3.3 生成路径二通过协议测试仪或码型发生器外部注入这种方法适合DUT本身不具备灵活pattern生成能力或者你需要注入一些自定义的、不符合规范默认定义的码型来测试接收端或做故障注入。这时你会用到支持PCIe协议层控制的码型发生器误码仪或协议分析仪。步骤通常是配置测试仪的工作模式为Tx Pattern Generator选择或自定义待注入的pattern可以手动输入字节序列也可以导入标准pattern文件设置触发方式一般用DUT进入Polling.Compliance后输出的TS1作为同步触发采集DUT的实际响应分析是否按预期工作。这种做法的优势是灵活坏处是需要额外设备而且设备与DUT之间的同步如果没做好很容易出现触发不稳定、pattern错位的问题。3.4 寄存器配置实例快速进入Compliance模式以一个比较典型的PCIe EP设备为例具体寄存器偏移会根据IP有差异但原理通用我通常会这样配配置空间基地址 PCIe Capability Offset找到Link Control 2寄存器把bit 0Enter Compliance写1如果测Gen3把bit 6:4Target Link Speed设为0b010对应8.0 GT/s在Link Control寄存器里把Retrain Link置1或者通过复位操作触发重训练等一小段时间几十毫秒量级读取Link Status寄存器确认LTSSM状态处于Compliance或能看到对应状态位。有一类芯片是允许在运行状态下直接切换进Compliance的但如果你的系统对时序要求很严格一定要先看芯片手册里有没有提到进入Compliance后对系统其他部分的影响比如DMA、中断是否会被挂起。我遇到过一种情况在跑压力测试时直接切Compliance主控端直接卡死后面改成先停业务再进Compliance才稳定。3.5 参数速查参考我把一些常用的关键参数整理成表格方便参考参数项典型值/配置说明Enter Compliance1使能进入Polling.ComplianceTarget Link Speed0b001Gen1/0b010Gen2/0b011Gen3决定输出pattern的速率Retrain Link1触发触发链路重训练Compliance SOS视芯片而定控制是否发送Skip/OS序列TS1数量规范定义通常为特定计数决定进入pattern前的TS1时长Pattern类型Compliance Pattern / Modified Compliance Pattern视测试项选择这组参数不是所有芯片都完全一致但整体思路是通用的。调试时建议先固定用一组最保守的参数Gen1速率、默认Compliance Pattern跑通链路再逐步切换高速率和复杂pattern这样出问题时容易定位。4. 实测避坑实录进不去、不稳定、测不对的排查清单4.1 难进Polling.Compliance先查这五件事很多人的第一个问题是寄存器都写对了但设备就是不进Polling.Compliance。按照我踩坑的优先级依次检查第一确认PCIe Capability Offset对不对很多代码复用的时候从错误的位置读了Link Control 2写了个寂寞第二确认触发重训练后设备没有因为其他逻辑把Enter Compliance位清掉。有些固件在重训练的开始阶段会初始化PCS/MAC顺带把控制寄存器恢复默认值第三确认对端或者夹具没有持续发送TS1把你拉回正常训练流程。这里需要区分是设备自己不进Compliance还是进了之后被对端打断第四确认硬件测试引脚没短路对于依靠硬件路径进Compliance的设备一个小电阻虚焊就能导致配置失败第五确认你观察状态的工具没有看错LTSSM状态的读取时序很关键建议配合协议分析仪一起看不要只依赖某一位状态位。4.2 进了Polling.Compliance但抓不到有效pattern多半是窗口问题抓到TS1但没抓到compliance pattern是最容易被忽视的问题。原因前面提过设备可能会在TS1和compliance pattern之间切换你要把示波器的触发设置成只对compliance pattern的特征码触发而不是见信号就采。另一个常见原因是采集窗口太短等示波器真正进入单次采集时pattern已经切换到别的内容了。我的做法是示波器用“重复触发解码”模式先确认哪一段是compliance pattern再缩小时间窗做精确采集。先把pattern的大致时间位置定位出来然后用触发延迟捕获后面的稳定段。这样反复几次就能把准确的pattern抓稳。4.3 速率相关pattern差异Gen3和Gen1/2完全是两回事用Gen1时代的经验去套Gen3是另一个高频坑。Gen1/2的compliance pattern基于8b/10b编码而且进入方式比较固定Gen3及以上是128b/130b编码包含了数据加扰机制pattern的结构完全不同。即便你只是想在Gen3下测个快速眼图也得确认设备是否真的以8GT/s速率输出了pattern测试仪是否配置了对应的检测模式。另外不同PCIe版本里polling.compliance相关的位定义可能有调整。以我接触过的SoC为例同样叫“Compliance SOS”的位在不同版本的控制器里含义不完全一样。拿到新平台的第一个动作永远是去翻对应版本的寄存器手册别凭老经验硬套。4.4 常见问题速查表问题现象排查方法解决方案Enter Compliance写1后无效果检查寄存器偏移、固件是否清位正确使能后重新触发重训练进入后立即跳回正常训练检查对端TS1、夹具是否误触发断开对端或配置测试仪不回复TS1示波器只抓到TS1触发窗口设置不对按compliance pattern特征码触发Gen3下无输出pattern检查Target Link Speed设置正确设置8GT/s速率并重新进入弹性缓冲/时钟恢复报错检查参考时钟供给、PLL锁定状态确保参考时钟干净稳定pattern时序抖动过大检查电源噪声、地弹优化供电去耦确认测试环境接地4.5 两个值得养成的调试习惯第一个习惯是“留一个固定的扳机”。我调试时会在固件里留一个调试GPIO进入Polling.Compliance之后立刻拉高方便示波器触发。这个习惯帮我省了无数时间一上电就知道设备有没有进到指定状态不用抓包慢慢翻。第二个习惯是“从Gen1开始跑通再往上加”。不管你的目标是Gen4还是Gen5第一次验证Compliance功能时先用Gen1跑通全链路进入、出pattern、切换退出、再进入确认环境和流程没问题再切到高倍速率。高速下排查问题的变量太多如果Gen1都跑不通你根本分不清是逻辑问题还是信号问题。5. 针对不同测试场景的配置建议5.1 研发调试阶段的低配方案研发阶段不一定要上全套合规性测试仪你可以用普通的示波器加协议分析仪做初步验证。配置上建议速率先用Gen1/Gen2调试难度低pattern类型先用默认的Compliance Pattern信号质量基本能说明问题触发方式用示波器的码型触发功能触发词的字节序列与pattern里的特征字段对齐。这个方法虽然不能替代正式合规性测试但能帮你及早发现发送端的大问题比如焊接不良、阻抗失配、电源纹波过高导致的眼图塌陷省得把问题带到认证测试阶段再去返工。5.2 正式认证测试时与测试仪配合的要点正式做PCIe合规性测试时通常会把DUT接入到一个自动化测试环境由测试仪控制进入Compliance状态并采集信号。这个时候我建议重点确认三点测试仪与DUT之间的参考时钟是否同源。如果两边时钟差异过大会导致pattern同步困难测试夹具的信号损耗是否符合规范要求。夹具的S参数是否在预期范围内直接影响到眼图模板测试是否通过DUT进入Compliance状态时的速率是否满足测试计划要求特别是需要跨速率测试时要确认目标速率协商正确。5.3 多通道设备的额外注意点如果你的设备是多通道x4/x8/x16每个通道都需要单独测量但进入Compliance状态时是所有通道一起进入的。这会带来一个问题某个通道如果信号质量差可能导致状态机在训练过程中因为该通道的接收端问题发生跳变影响其他通道的pattern输出。建议先单独检查每个通道的信号质量确保所有通道都能稳定工作再整组进入Compliance状态测试。另外lane-to-lane的skew也是多通道场景下需要重点观察的指标pattern生成过程中要保证各通道之间的时序对齐在规范允许范围内。6. 测试环境搭建与仪器选择的经验之谈6.1 示波器带宽和采样率的最低要求做PCIe Tx测试示波器带宽不能省。Gen3 8GT/s的信号基频在4GHz附近但谐波分量更丰富建议带宽不低于13GHz采样率不低于40GS/s。如果测Gen4 16GT/s带宽需要25GHz甚至更高这个钱确实省不了很多实验室一次认证测试不过的原因就是设备带宽不够测出来的眼图本身就失真。6.2 测试夹具与转接板的影响转接板Interposer或测试夹具的长度、过孔、连接器质量都会影响高频信号完整性。在合规性测试中夹具本身的损耗和反射要尽量小最好选用与测试标准配套的夹具。这一点不太容易被人注意但它对测试结果的影响非常大——我之前遇到过一副看起来很精美的转接板插损比标准夹具大了近一倍测出来眼图永远过不了模板换夹具后完全正常。6.3 环境干扰与接地高频测试对环境要求其实不低特别是抖动测量时电源纹波、地弹、辐射干扰都会叠加进测试结果。建议测试时把设备和平时的开关电源拉开距离避免使用长飞线接地尽量用铜柱和接地平面直接接触。基站设备、变频器附近尽量不要测试实测中发现这种环境下的抖动测试结果会比其他环境高出不少。7. 几个特殊的工程场景与应对策略7.1 使用FPGA实现PCIe控制器时的注意点FPGA原型的灵活性很高很多参数可以现场改但这也带来一个问题同一个RTL在不同编译版本下state machine的综合结果可能不一样导致跨版本时行为变化。我在FPGA里实现PCIe控制器时一般会在RTL里加一个状态观测寄存器把LTSSM当前状态实时映射到某个可读寄存器这样调试Polling.Compliance时能直接看到状态跳转的每一步。如果你在FPGA里也遇到了“按寄存器配置了但不进Compliance”的问题可以先检查RTL里有没有对LTSSM状态路径做了剪裁有些设计为了省资源会把某些非必要路径优化掉结果把Compliance分支也修剪了。7.2 不同芯片厂商实现差异不同厂商这里泛指Intel、AMD、NXP、Broadcom等的PCIe控制器对Polling.Compliance的支持方式有差异。有的把Enter Compliance放在通用寄存器里有的放在厂商私有寄存器里还有的需要通过Sideband信号进入。动手之前一定要把厂商的参考手册读透尤其是“Link Control 2寄存器”以后的私有扩展部分。我之前用过一个厂商的控制器虽然报告里写着支持Compliance模式但实际需要额外设置一个厂商私有bit手册藏在附录里不仔细翻根本找不到。7.3 与其他测试项比如热插拔、SRIS组合时的冲突SRISSeparate Reference Clock with Independent Spread架构下进入Compliance模式时要注意参考时钟的展频设置。如果展频没有关闭或设置得不匹配测出来的频率偏移会超标误以为设备有问题。热插拔场景下如果先插卡再上电和先上电再插卡进入Compliance的时序也不一定一样建议在测试规范要求的标准条件下复测一遍。8. 一点个人心得做PCIe合规性测试这些年我的感受是Polling.Compliance这个状态本身不难难的是你的设计能不能在各种条件下都稳定地进出这个状态。建议每个做PCIe设备的人都在设计阶段就主动考虑测试需求把进入Compliance可用的寄存器和引脚位置文档化别等认证测试时才临时想办法。还有一个就是别怕在Gen1上反复练手基础速率下把状态机搞透后面高速率只是参数变化的问题。我自己每次拿到新板卡第一件事就是先让它跑进Polling.Compliance用示波器看一遍各个通道的基本眼图和频率确认物理层大致健康了再去做上层驱动和协议调试。这些小习惯不一定能帮你省下认证费用但绝对能帮你减少返工次数。项目多的兄弟应该都懂测试工程师最烦的不是测试项多而是设备不配合。把Polling.Compliance这条链路摸透至少能让测试环境先稳定下来剩下的事就好办多了。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →