ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

7系列FPGA高速收发器GTX/GTH配置与调试实战指南

7系列FPGA高速收发器GTX/GTH配置与调试实战指南 很多刚开始啃7 series FPGAs高速接口的工程师第一次打开Vivado里的Transceiver Wizard IP核生成界面时多少都会有点懵。界面里选项一排接一排线速率、参考时钟、数据位宽、PLL类型、回环模式……每一项看起来都和链路能不能跑起来直接相关可文档里那些缩写词单独拿出来都认识连在一起就不知道该怎么选。我自己第一次调GTX也差不多板子上电、差分参考时钟都起振了RX端就是lock不住折腾两天才发现是参考时钟和线速率的分频关系没算对。这篇文章就把整个使用和测试过程完整写一遍。从GTX/GTH收发器的内部架构讲起到Transceiver Wizard里几个关键选项的取舍逻辑再到IBERT、回环、ILA这套递进测试流程最后把我踩过的一些坑整理出来。不管你是要跑Aurora 8B/10B、SGMII还是单纯想把手上的7系列板卡高速链路验证一遍按这个思路走能少走不少弯路。1. 先把GTX/GTH收发器的两层分工理清楚1.1 高速串行通道不是简单的一对差分线很多从纯逻辑开发转过来的工程师平时接触的都是并行接口——地址、数据、控制线摆在一起时钟单独走一根数据在时钟沿上采样。这套思维直接搬到高速串行接口上就会碰壁因为串行链路上根本没有独立时钟线。发送端把数据变成一串高速比特流从一对差分线上推出去接收端拿到这个比特流之后第一件事就是通过CDR时钟数据恢复把时钟从数据里“挤”出来。问题在于如果发送端连续发很长一段0或很长一段1接收端靠跳变沿恢复时钟就会失去参考时钟很容易漂移。所以链路里加了8B/10B这类编码把数据流“打散”保证信号有足够多的跳变沿。8B/10B能把一个字节映射成10bit既保证直流平衡又保证跳变密度。代价是有效带宽打了八折但换来了稳健的时钟恢复这笔交易在绝大多数高速接口场景下都值得。这些编码、对齐、速率匹配的工作不会让你的用户逻辑去做而是由硬核收发器完成。7系列里集成的GTX/GTH/GTP收发器就是一套完整的模拟加数字混合电路模拟部分负责高速信号收发数字部分负责编解码和协议适配。你在Transceiver Wizard里配的就是在告诉这套硬核电路“你用什么速率、什么编码、什么时钟关系来工作”。1.2 用户逻辑和GTX之间隔着一层PCS/PMAGTX收发器内部大致分两层PMA物理介质附加层和PCS物理编码子层。PMA在最底层负责并串转换、串并转换、预加重、接收均衡、CDR这类模拟和高速数字部分PCS在PMA之上负责8B/10B编解码、comma对齐、弹性缓冲、速率匹配这些数字处理。用户逻辑通过并行接口接在PCS这一侧高速串行的部分被完全封装在收发器内部。可以用一个不太严谨但好记的类比PMA是机场跑道负责飞机起降PCS是航站楼的安检和登机口负责把旅客按规则组织好。你作为旅客只跟航站楼打交道不用管跑道上的起降细节但跑道有没有问题会直接影响你能不能按时登机。搞清楚这两层对调试帮助很大。比如近端PMA回环和近端PCS回环一个绕过了PMA一个绕过了PCS出现问题时能快速定位是模拟链路问题还是数字逻辑问题。再比如遇到误码你需要判断是模拟前端信号质量不够、CDR锁定不稳还是PCS层对齐失败、缓冲溢出排查路径完全不一样后面测试部分会反复用到这个区分。另外说一句器件差异。7系列里不同器件集成的收发器类型不一样常见的情况是Artix-7用GTPKintex-7用GTXVirtex-7上还有GTH甚至GTZ。严格说名字不同、速率上限有区别但使用思路完全一致Transceiver Wizard也会根据所选器件自动生成对应类型的核。下文统一用GTX代称遇到GTP/GTH时按具体型号调整参数就行。2. 配置IP核时真正需要花心思的五个选项2.1 线速率、参考时钟和PLL的三角关系打开Transceiver Wizard第一件事是配置Line Rate和Reference Clock。很多人随手填一个常用线速率再挑一个板子上存在的参考时钟频率就觉得完事了。实际上GTX内部PLL要能把参考时钟倍频到线速率这个倍频关系必须落在PLL支持范围内如果超出了范围IP核会直接报红。举一个我常用的例子板上的差分晶振给的是125MHz想跑5Gbps线速率。5000Mbps除以125MHz整数倍频是40这个倍频关系很常规配置能通过。反过来如果参考时钟填100MHz5Gbps对应的是50倍这个倍频不一定在所有器件上都能支持最好先用向导试一下别想当然。几个常见的组合我放在下面实际项目里遇到最多的就是这些线速率常用参考时钟整数倍频关系3.125 Gbps125 MHz255.0 Gbps125 MHz406.25 Gbps156.25 MHz4010.3125 Gbps156.25 MHz66需要注意参考时钟是给PLL吃的“粗粮”用户接口时钟是给FPGA逻辑吃的“细粮”两者经常数值相同但来源和用途完全不一样。刚开始接触GTX的人容易把参考时钟直接当用户逻辑时钟用链路偶尔能跑但时序不稳定后患无穷。实际板卡设计里尽量选标准的125MHz或156.25MHz差分晶振因为这些频率和常见线速率的倍频关系比较干净。PLL类型这一项线速率低的时候用CPLL资源独立线速率高或者一个quad的4个通道要共用一个时钟源时用QPLL更合适。Transceiver Wizard一般会根据线速率自动推荐不用手动干预但做四通道Aurora这类需要四个通道同时工作的应用时记得回头检查一下PLL是否选成了QPLL。2.2 编码方式与数据位宽先把时钟算明白编码方式这一项常见有8B/10B、64B/66B和None。做Aurora 8B/10B协议当然选8B/10B做SGMII标准本身也要求8B/10B如果只是自定义的高速数据搬运链路质量要求不高可以选None但接收端时钟恢复会吃力一些。编码方式直接决定用户数据位宽和用户时钟的关系。以8B/10B为例PCS内部实际处理的是编码后的位宽。用户接口如果选32位PCS内部就是40位。这时候TX用户时钟不是线速率除以32而是除以40。这句话值得多读两遍。我见过不少人在5Gbps、32位接口上把用户时钟算成156.25MHz结果怎么都对不上。正确算法是5000Mbps / 40 125MHz。所以当参考时钟恰好也是125MHz时会出现参考时钟和用户时钟数值相同的巧合很多人因此误以为“用户时钟就是由参考时钟直接分频来的”其实是两个不同处理路径上的时钟碰巧重合了。64B/66B或None时的内部位宽又是另一套算法如果项目里遇到直接按器件文档里给出的编码后位宽来算不要套用8B/10B公式。用户位宽选16还是32本质是带宽换时钟频率。位宽越小用户时钟越高对FPGA内部逻辑的时序压力越大位宽越大时钟越宽松但并行总线占用资源变多。一般首选32位内部逻辑跑在125MHz或者稍高一点对布局布线都很友好。如果板卡上只有一个125MHz参考时钟用户接口又是32位8B/10B线速率就锁定在5Gbps想换速率就要同步换参考时钟或位宽可以自己用上面的公式来回推导。2.3 复位、回环与共享逻辑怎么选Transceiver Wizard的次级选项里有三个容易踩坑复位方式、回环模式、共享逻辑。复位看着简单实际要求很严格。IP生成的example design里通常有一个完整的复位状态机刚开始调试时尽量直接用它别自己写一个“拉高100个时钟”就完事。TX复位和RX复位有先后关系通常先复位TX等txresetdone拉高后再给RX复位然后等rxresetdone。整个过程要和PLL锁定状态联动。如果发现rxresetdone一直不拉高重新复位一次RX往往就能恢复这是正常现象不代表硬件坏了。回环模式在测试阶段选什么直接决定你验证的是哪一段。测试阶段我一般在IP核里选近端PMA回环数据经过TX PCS和TX PMA后在PMA内部绕回RX方向不依赖外部连接器逻辑和收发器都被覆盖到。后面要验证物理链路时再切外部回环。Transceiver Wizard配置窗口里要求选一个初始回环模式这个设置不是锁死的运行时可以通过端口或寄存器改写。共享逻辑选项在生成example design时会遇到。选“Shared Logic in Example Design”生成的example design里会包含完整的时钟复位模块方便仿真和验证如果想把核挪到自己的工程可以改成“Shared Logic in Core”或External但前提是你能自己处理时钟和复位否则链路会莫名其妙起不来。吃过几次亏之后我的做法是调试阶段一律用example design确认链路OK后再精简到自己的工程里。3. 测试流程从IBERT到ILA的递进验证3.1 板卡回来第一件事用IBERT摸物理链路很多工程师板卡一回来就急着写自己的GTX逻辑结果经常在“怎么都link不上”上耗好几天最后发现是硬件链路问题。我的习惯是先跑IBERT。IBERTIntegrated Bit Error Ratio Tester是FPGA内部自带的误码率测试功能Vivado里可以单独生成一个IBERT核不需要用户逻辑只需要约束好GTX的差分引脚和参考时钟引脚综合下载后通过Hardware Manager里的JTAG访问。它能配置线速率、选择回环方式、跑误码率、扫眼图。IBERT的价值在于先把物理层问题隔离出来。比如板卡回来后用IBERT配置成外部回环SMA线或者光纤环回跑一下误码率顺便出一个眼图看看眼高眼宽是否正常。如果这步都过不去别指望用户逻辑能跑通如果能过说明PCB走线、连接器、参考时钟这些硬件基础都OK问题大概率在IP配置或者逻辑设计上。跑IBERT还有一个好处它能动态调整TX摆幅、预加重、接收均衡这些参数帮你快速找到当前链路的“甜点位”。调好的参数记录下来后面转成用户工程的GTX配置时会轻松很多。遇到高速率跑不稳、低速率稳定这类问题多数也能在IBERT阶段通过调均衡参数找到方向。3.2 四种回环模式各有分工回环模式是GTX调试里最重要的手段之一常见的有以下几种回环模式数据路径主要验证目标近端PCS回环用户逻辑 → TX PCS → 绕回RX PCS → 用户逻辑用户侧逻辑、数据对齐近端PMA回环用户逻辑 → TX PCS → TX PMA → 绕回RX PMA → RX PCS → 用户逻辑PCSPMA收发通路外部回环发端差分对通过线缆/连接器接回收端差分对完整物理链路、PCB、连接器远端回环对端设备配对配合系统级联调调试时建议按“近端PMA → 外部回环”的顺序来。近端PMA回环先证明逻辑和IP配置没问题外部回环再检验物理链路。如果近端PMA回环通但外部回环不通方向就很明确要么信号质量差要么连接器或线缆有问题要么外部回环的端接方式不对。切回环模式不需要重新综合工程多数情况下通过VIO或在线寄存器读写就能动态切换具体看IP核暴露了哪些loopback控制端口。example design里通常已经引出了相关控制信号直接用VIO操作即可。3.3 example design与ILA观察点Transceiver Wizard生成之后在“Open IP Example Design”里可以直接打开一个完整工程里面包含了时钟、复位、数据产生和校验逻辑。这个example design是理解IP核正确用法的第一手资料强烈建议先跑一遍跑通之后再往自己的工程里搬。在example design基础上把ILA加进去重点观察这几类信号采样时钟用TX用户时钟比如5Gbps、32位接口下的125MHz复位状态类txresetdone、rxresetdone、txpmaresetdone、rxpmaresetdone必须稳定为高才说明收发器内部完成了初始化。对齐类rxbyteisaligned为1说明接收端找到了comma对齐点这个信号一直为0大概率链路根本没正常起来。数据内容类自发自收时rxdata要和txdata对得上Aurora这类协议跑起来后rxchariscomma、rxcharisk这些标志才会有规律出现。错误类rxdisperr表示8B/10B码字跑飞rxnotintable表示收到不在编码表里的码字这两个信号任一拉高都要优先怀疑信号完整性或上游数据异常。ILA不能替代误码仪但做功能调试足够了。想跑长时间误码验证就在example design里用自带的BERT逻辑或者自己写一个发送端计数器、接收端校验的模块连续跑几个小时看是否有错误计数。这一步一定要做很多间歇性误码短期抓不到跑久了才会暴露。4. 链路起不来和误码高按这个顺序排查4.1 参考时钟路径最容易被忽略的第一道关GTX的参考时钟不是普通时钟引脚能驱动的。7系列FPGA上GTX参考时钟必须走专用的MGTREFCLK引脚通常以差分形式引入经过IBUFDS_GTE2原语后送到GTX内部。如果尝试把参考时钟从普通时钟引脚绕进内部BUFG再接给GTX十有八九起不来这是专用时钟走线的问题逻辑上看着对物理上不通。手动例化IBUFDS_GTE2时可以参考下面这段模板Vivado的IP生成向导里也能直接生成IBUFDS_GTE2 #( .CLKCM_CFG (TRUE), .CLKRCV_TRST (TRUE), .CLKSWING_CFG(2b11) ) ibufds_gt_e2_inst ( .O (gt_refclk), .ODIV2 (gt_refclk_odiv2), .CEB (1b0), .I (refclk_p), .IB (refclk_n) );注意CEB要接低电平O是给GTX做参考时钟的主路ODIV2在部分场景下可以给FPGA逻辑做慢速参考时钟用。我见过有人把ODIV2当主时钟用运气好也能工作但频率关系很容易搞混。另外参考时钟源的抖动直接影响高线速率下的误码率。板上时钟芯片或晶振的质量如果太差GTX可能低速率正常、高速率就不稳定。这种情况下先不要急着调代码先用示波器看参考时钟的波形和抖动再决定是换晶振还是调整PLL配置。4.2 复位时序的隐藏要求复位问题往往是“看起来给了复位实际上时序不对”。GTX的复位不是简单地把reset拉高若干周期就结束它和PLL锁定、时钟稳定之间存在先后关系。标准做法是上电后先稳定参考时钟等PLL锁定然后给TX复位TXRESETDONE拉高后再给RX复位RXRESETDONE拉高后链路就算起来了。如果TX和RX共用一个复位输入IP内部有状态机会处理顺序但如果自己写逻辑务必把时序对齐。尤其RX复位如果发送端还没输出稳定数据RX复位完之后也白复位。一个小经验当链路运行中意外掉线时不要同时复位TX和RX很多时候单独把RX复位一次就能恢复。TX复位会引起发端状态全部重来影响范围大很多。调试时把复位按键做成可控的先用单通道复位试不行再扩大复位范围。4.3 信号完整性问题与极性反转救急物理链路最常见的故障是AC耦合电容放错位置、差分阻抗没控好、连接器虚焊、线缆衰减太大。GTX这类高速收发器通常要求信号通路上有AC耦合电容常见容值可以用0.1μF但容值太小会造成低频成分衰减表现为长时间运行出现突发误码。遇到误码高的情况先用IBERT扫眼图。如果眼图明显变“糊”或者“眼睛”睁开度很小就要考虑调节TX预加重/去加重和接收端的CTLE/DFE均衡参数。Transceiver Wizard里有对应的配置选项IBERT里也能实时调调好后再把参数固化到工程里。再说一个救急技巧如果差分对的正负端在PCB上接反了别急着改板GTX支持极性反转功能。通过VIO把txpolarity或rxpolarity动态拉高往往能救回来。尤其在SMA转接、FPC排线这类场景里正负极接反是很容易发生的事用软件纠正比投板改版快得多。4.4 弹性缓冲与两端不同源时钟当发送端和接收端不在同一个时钟域比如两块板卡各自用自己的晶振时数据进到RX PCS之后必须经过弹性缓冲否则两端频率上的微小偏差会逐渐积累成FIFO溢出或下溢。Transceiver Wizard里RX弹性缓冲通常设为Basic模式并配置时钟修正序列。8B/10B协议一般用K字符作为修正序列比如K28.5。IP核在检测到连续K字符时会自动补充或删除一个字符来抵消两侧时钟的频率差这个机制叫clock correction。如果把弹性缓冲关掉或者修正序列配置错误链路刚起来可能没问题跑几分钟十几分钟就出误码大概率就是这类原因。这在Aurora 8B/10B链路里尤其典型。Aurora协议本身要求通道初始化时发送固定K字符流这些K字符同时承担时钟修正职责如果底层GTX的时钟修正配置没做对协议层会一直报通道错误。调试这类问题时建议先看GTX的rxbuffererrdet或rxstatus相关信号再看协议层报错类型能很快定位是修正在误删数据还是时钟偏差实在太大。5. 从GTX回环到协议层还需要适配什么5.1 Aurora 8B/10B等协议对这个底层核的依赖GTX回环验证通过不等于高速接口项目就完成了。GTX提供的只是两条并串转换通道具体怎么组帧、怎么定长、怎么检测链路状态是上层协议IP的工作。比如Aurora 8B/10B它的IP核底层也有一组Transceiver Wizard的配置协议层负责通道初始化、用户数据打包、流量控制和错误检测。再比如SGMII在GTX之上还需要MAC层和PCS层协同所以把GTX配置成8B/10B裸通道之后还得把SGMII的MAC侧接口逻辑接好。这也是为什么很多人在跑Aurora之前会先用Transceiver Wizard做一次裸通道回环验证——先确认物理链路和GTX参数都OK这样协议层出问题时能迅速分清责任。我自己的经验是协议层出问题大概率不是GTX本身而是复位时序、用户接口时钟、数据位宽映射这三件事没对齐。有了裸通道回环的底子再叠加协议层你会很清楚地知道问题出在哪一层排查范围会小很多。5.2 验证完成后哪些工作不能跳过回环测试通过之后换到真实对端设备之前有几步不能省用真实线缆和连接器做一次长时间误码测试建议至少连续跑几个小时重点看有没有间歇性误码。把IBERT里调好的TX摆幅、预加重、接收均衡参数同步回Transceiver Wizard配置别只停留在临时验证值。确认参考时钟源头质量最好在硬件侧量一下抖动或相位噪声链路不稳时回来查这一项经常能发现问题。把约束文件里的GTX管脚、参考时钟位置和bank分配重新核对一遍换了板卡型号或版本后尤其要查。把这些都做完再去联调协议层心态会好很多。调试高速链路最忌讳的就是同时改逻辑、改约束、改硬件一次只动一个变量出问题才知道该找谁。我在实际项目中遇到过太多次“逻辑看着没问题、链路就是跑不稳”的情况最后大多落在参考时钟、复位时序和信号完整性这三件事上。测试流程固定成“IBERT先上、近端PMA验证逻辑、外部回环验证链路、ILA盯关键信号”之后排错效率明显提升。如果你正好在做7系列FPGA的高速接口项目可以把这个流程当成默认流程能省下大把原本用来“玄学调参”的时间。
返回列表