ARTICLE DETAIL

资讯详情

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

GTX/GTH高速收发器配置调试:PG168核心要点与实战技巧

GTX/GTH高速收发器配置调试:PG168核心要点与实战技巧 文前先说明一下这篇笔记主要面向已经在用Vivado做7系列FPGA开发、但还没系统啃过PG168的工程师。如果你正准备把GTX/GTH收发器用在项目里又不想一上来就被文档里铺天盖地的参数劝退那这篇笔记应该能帮你省下不少时间。我会把文档里最核心的配置思路、关键参数和调试方法拆开讲尽量用工程化的语言说清楚少一点官方文档的学究气。1. 为什么绕不开PG168文档的定位与正确读法1.1 PG168到底讲什么PG168是Xilinx官方发布的《7 Series FPGAs Transceivers User Guide》这个名字听起来很学术但说白了就是告诉你7系列FPGA里的高速串行收发器GTX/GTH到底怎么用才能把它配置成你想要的协议。它覆盖的内容非常广从最底层的PMA物理介质附加子层、PCS物理编码子层架构到上层的动态重配置、环回测试、边界扫描几乎把收发器相关的所有细节都塞进去了。很多初学者一打开PG168就懵因为这份文档不仅厚而且大量的内容是寄存器表、属性定义、时序图。我刚接触的时候也踩过这个坑一页一页从头读读到一半脑子就变成浆糊了。后来我总结出一个相对高效的路子读PG168不要按顺序读要先找你最关心的模块比如你先配置一个最简单的1.25Gbps Aurora或者千兆以太网那就重点看GTX Transceiver的架构和Transceiver Wizard生成后的代码之后再逐步逐条往回找对应寄存器。因为PG168本质上是一本词典和参考手册而不是一本线性教材。你不必把每条属性都背下来但你要知道它大概在哪个章节遇到问题时能快速定位。这也是这篇笔记想帮你做的先帮你建立一个全局框架再带你把PG168里最常用的配置方法过一遍之后你再去看原文心里就有底了。1.2 读文档前必须搞清楚的几个概念在进入配置细节之前有几个概念一定先要弄明白不然后面看什么都是天书。第一个是GTX和GTH的区别。7系列FPGA里的串行收发器有两种GTX和GTH。GTX是Kinte-7、Virtex-7上常见的收发器线速率支持范围比较宽从几百Mbps到12.5Gbps左右不同器件略有差异GTH则算是高速版的收发器在部分Virtex-7、Kintex-7器件里能跑到13.1Gbps甚至更高。两者在物理层实现上有差异但配置方式在Vivado里的表现非常相似。这篇笔记里我主要拿GTX说事但框架和思路对GTH一样适用。第二个概念是Quad。收发器在FPGA内部不是一个个独立散落的而是四个通道组成一组叫做一个Quad。每个Quad里有四个收发器通道MGT以及一些共享的资源比如QPLL、参考时钟缓冲器等等。你在Vivado里例化GTX IP时它会让你选通道的位置这就是在选Quad和通道号。同一个Quad里的四个通道共享部分时钟资源和QPLL所以做多通道设计时尽量把通道放在同一个Quad里能省不少时钟资源布局布线也更友好。第三个是PMA和PCS的分工。PMA负责处理最底层的模拟信号比如串行数据的收发、时钟恢复、预加重、均衡PCS负责数字域的编码解码比如8B/10B编解码、64B/66B编解码、弹性缓冲、字节对齐等。在PG168里很多属性其实就是针对PCS和PMA这两个层级分别设置的。理解了这个分层再去看那些属性名就不会觉得杂乱。最后一个必须要懂的是线速率Line Rate和参考时钟Reference Clock的关系。线速率是串行链路上实际的比特率参考时钟则是收发器内部PLL的输入基准时钟。线速率通常不是随便定的要根据协议要求来而参考时钟则是由线速率和PLL的分频倍频关系反推出来的。比如你跑1.25Gbps的Aurora很多板卡上用125MHz参考时钟因为内部PLL可以完成10倍频再加上8B/10B编码后实际串行速率就是1.25Gbps。这里面的计算关系我们后面会专门用一小节讲先有个印象即可。2. GTX/GTH硬件架构物理层配置的地基2.1 Quad结构与PLL选择逻辑前面说了收发器是以Quad为基本单位组织的那么在配置之前你先要确定两件事你的数据要放到哪个Quad、哪个通道上你的参考时钟从哪个引脚进来喂给谁PG168里关于Quad的图非常关键我在项目里反复翻那一页。一个Quad内部不仅有四个通道还有两个PLL一个是CPLL只在单个通道内部使用另一个是QPLL是整个Quad共享的。CPLL的好处是每个通道独立使用通道之间互不干扰但它的支持速率范围有限QPLL的好处是速率上限高、抖动性能好而且可以给同一个Quad里的多个通道同时提供参考时钟。当你跑高线速率一般超过6.6Gbps具体看器件速度等级基本上只能选择QPLLCPLL顶不住。这里我列一个简单的对比表方便你在方案阶段快速判断对比项CPLLQPLL归属范围单个通道独占整个Quad共享速率上限较低约6.6Gbps视器件而定较高可达12.5Gbps以上锁定时间较快较慢抖动性能一般更优通道共享不支持支持Quad内多通道共用典型应用低速协议、独立通道高速协议、多通道一致这里有个常见的工程场景。比如你做一个4路SRIO线速率是5Gbps或者6.25Gbps四路数据的参考时钟都是同一个156.25MHz。这时候你就应该把这四路放在同一个Quad里然后共享同一个QPLL保证四路时钟是同源的通道间的skew更容易控制。如果你把它们分散到不同Quad且各自用CPLL也不是不行但板级走线、时钟树的处理都会更难受。2.2 TX方向的关键路径然后是发送方向的路径。从FPGA逻辑侧看数据进入GTX后首先要经过PCS层做编解码然后进入PMA层做并串转换最终从高速引脚发出去。这个过程看起来简单实际上里面藏了很多容易踩坑的细节。第一个是编码方式。对于常见的8B/10B编码协议GTX内部可以自动完成10bit到8bit的转换你只需要把数据位宽配成8的倍数就行。但对于64B/66B这类编码GTX不能直接帮你全包通常需要外部逻辑辅助处理或者在IP核里启用相应的功能。选编码方式时要注意不是所有器件都支持所有编码PG168里有明确的表格。第二个是TX相位对齐。当多通道并行使用时各个通道的发送时钟和数据相位必须对齐否则接收端恢复出来的数据就会出现通道间偏移。GTX提供了TX相位对齐电路原理是先让所有通道的TXUSRCLK同源再通过复位序列和缓冲调整把所有通道拉齐。工程上这意味着复位控制器要有正确的时序不能随便乱复位。第三个是预加重和去加重。高速信号过PCB走线后高频分量衰减比低频严重接收端就可能睁不开眼。发送端通过预加重/去加重把信号的高频分量提前加重补偿链路损耗。PG168里对应的是TXDIFFCTRL、TXPREEMP等属性调这些参数是高速链路调试的常见手段。后面讲排查时会再说几个实用技巧。第四个是TXOUTCLK。GTX的发送侧需要一个用户时钟TXUSRCLK这个时钟通常来自TXOUTCLK分频。很多初学者的困惑就在这儿TXOUTCLK到底是多少它跟线速率的关系是什么简单说TXOUTCLK是收发器内部产生的与串行数据同步的时钟经过分频后可以作为用户侧时钟使用。比如线速率是10.3125Gbps内部数据位宽是64bit那么TXOUTCLK大约是161MHz。这个频率要在工程的时钟约束里写清楚否则时序分析会乱套。2.3 RX方向的关键路径接收方向比发送方向复杂得多因为信号经过链路后已经面目全非你需要通过均衡、时钟恢复等手段把它“救”回来。接收端的第一个关键模块是CDR时钟数据恢复。它从前级来的串行比特流里恢复出时钟和数据没有它后面的数字逻辑根本不知道从哪里开始采样。CDR有两个模式一个是参考时钟模式一个是数据模式。上电初期CDR需要参考时钟来粗调频率所以RX参考时钟必须稳定供给锁定之后CDR可以直接从数据里追踪频率这就是所谓的数据模式。调试时如果发现RX一直锁定不了先查参考时钟是否正常再查线速率配置是否正确。第二个是接收均衡。7系列收发器里有CTLE连续时间线性均衡和DFE判决反馈均衡两种均衡方式。CTLE是模拟均衡器用简单的高频提升来补偿损耗DFE则是数字反馈均衡能更精准地抵消反射和串扰带来的码间干扰。DFE只在高速率下使用且需要训练过程。PG168里对应的是RX_DFE、RX_CFG等属性这些参数一般不用你手动摸Vivado的Transceiver Wizard会根据你选的协议和速率自动给一个初始值但到板级调优时你可能需要手动微调。第三个是RX字节对齐。因为链路上的数据是串行的接收端必须先找到一个字节的边界才能把连续的比特流切成正确的字节。GTX里通常用comma字符比如K28.5来做对齐。你要在属性里配置对齐模式、对齐字符和检测长度。配错的话接收数据会出现错位表现出来的症状就是数据流里偶尔出现乱码。第四个是RX的弹性缓冲。由于收发器内部时钟和用户逻辑时钟可能不是完全同频同相需要弹性缓冲来吸收时钟域的差异。缓冲深度是有限的如果两边频偏太大缓冲区会溢出或下溢。所以协议里一般都有时钟补偿机制比如在空闲状态插入或删除特定字符。PG168里对应的是RX_BUFFER、RX_CC等设置调试中如果遇到数据偶尔丢一拍多半就是这里没弄好。3. 官方配置方法从原理图到属性参数3.1 配置入口Transceiver Wizard与手写原语在Vivado里配置7系列GTX最主流的入口是Transceiver Wizard IP核。它是一个可视化的配置界面你选好协议模板或者手动填参数它最终帮你生成一个封装好的IP核里面包括收发器原语、时钟资源、复位逻辑等。打开Wizard后你会看到几个Tab页比如Line Rates、Encoding、Clocking、Comma Alignment等。这些页面的背后其实就是PG168里讲到的属性。也就是说Wizard是PG168的一种图形化外壳很多属性你不用记名字只需要在界面上选择它就会自动生成对应的属性值。这对新手非常友好但带来的副作用是很多人调完Wizard后不知道底层到底配了些什么出了问题也无从下手。所以我的建议是Wizard生成完IP后一定要打开生成的HDL文件找到GTXE2_CHANNEL和GTXE2_COMMON这两个原语的例化代码对着PG168的属性表一条条看过去。你会发现Wizard界面里的每个下拉框都能在属性列表里找到对应项。这个过程有点费时间但这是提升收发器调试能力最扎实的一条路。我也见过一些老工程师直接手写原语例化不用Wizard因为他们对属性已经非常熟了手写更灵活。但对大多数项目来说Wizard生成再手动改几处是性价比最高的方式。下面我贴一个最简单的GTXE2_CHANNEL原语例化片段让你对底层长什么样有个体感配置的关键路径体现在RX/TX的数据位宽、时钟分频、极性控制等属性上。GTXE2_CHANNEL #( .ALIGN_COMMA_DOUBLE(FALSE), .ALIGN_COMMA_ENABLE(10b0000000011), .ALIGN_COMMA_WORD(1), .ALIGN_MCOMMA_DET(TRUE), .ALIGN_PCOMMA_DET(TRUE), .CHAN_BOND_MODE(OFF), .RX_DFE_CFG(13b0000111111111), .RX_DFE_KL_CFG2(32h301148A0), .RX_DFE_LPM_CFG(16h0904), .RX_DFE_LPM_HF_CFG(12b000111111000), .RX_DFE_LPM_HF_CFG2(32h00000400), .RX_DFE_LPM_HF_CFG3(11b00000000000), .RX_DFE_UT_CFG(17b10001111000000000), .RX_DFE_VP_CFG(17b00011111100000011), .TX_DRIVE_MODE(DIRECT), .TX_PREEMPHASIS_TAP0(5b00000), .TX_PREEMPHASIS_TAP1(5b00000), .TX_PREEMPHASIS_TAP2(5b00000), .TX_PREEMPHASIS_TAP3(5b00000), .TX_PREEMPHASIS_TAP4(5b00000), .TX_DIFFCTRL(4b1000), .TX_MAIN_CURSOR(7b0000000) ) gtxe2_channel_inst ( .TXOUTCLK(txoutclk), .TXUSRCLK(txusrclk), .TXUSRCLK2(txusrclk2), .RXUSRCLK(rxusrclk), .RXUSRCLK2(rxusrclk2), .TXPD(txpd), .RXPD(rxpd), .TXDIFFCTRL(txdiffctrl), .TXPREEMP(txpreemp), .TXDATA(txdata), .RXDATA(rxdata) );注意这只是一个示意省略了大量端口。真正的例化代码会很长但你能从这段里看出底层原语的属性和端口命名非常规律几乎都能在PG168里逐条查到。3.2 核心属性参数解析以GTXE2_CHANNEL为例Wizard界面里那些选项映射到底层就是一堆属性。我挑几个最常用、也最容易困惑的属性结合工程经验说下它们的含义。PMA_CFG是PMA层最重要的配置集合它是一个位宽很大的向量里面打包了发送驱动、接收终端电阻、内部偏置等一堆模拟参数。这个值一般由Wizard自动生成不建议手动改但如果你做的是非常特殊的非标速率或特殊PCB走线可以对照PG168里的说明微调内部相关位域。改之前一定要备份原值因为仿真时这些模拟参数往往看不出差异但上板后影响显著。TX_DRIVE_MODE决定发送端驱动器的模式常见的是DIRECT和PIPE。DIRECT模式下你直接通过TXDIFFCTRL、TXPREEMP来控制驱动电流和预加重PIPE模式下则启用PCIe的PIPE接口信号来控制通常在做PCIe的时候用。如果你用Wizard生成PCIe的PHY这里会自动设成PIPE不用手动干预。但你要是复用了某个工程模板记得检查一下这个属性。RX_DFE_*这一系列是接收端DFE均衡的参数组合。DFE均衡对芯片内部的反馈环路时间、增益等都很敏感所以你经常能看到RX_DFE_CFG、RX_DFE_LPM_CFG、RX_DFE_UT_CFG这些属性。它们的基本逻辑是LPMLow Power Mode适合中低速率UTUpdate Table模式适合高速率。调这些参数没有万能解我一般是在IBERT集成误码率测试里先把眼图调到最佳再把参数回填到工程里。TX_CLK25_DIVIDER和RX_CLK25_DIVIDER是给收发器内部逻辑用的分频值它们把参考时钟分频到一个约25MHz的内部时钟。这个分频值必须和你的参考时钟频率匹配。比如参考时钟是125MHz那么分频值就是5如果是156.25MHz分频值就是6.25但分频值必须是整数所以如果用156.25MHz做参考时钟就要另选合适的路径或选用带小数能力的配置。这里很多新手会卡住我建议在Wizard里直接填参考时钟频率它会自动帮你算好手写原语时才需要自己算。3.3 共享逻辑与参考时钟配置GTX收发器的参考时钟是通过专用引脚进入FPGA的在7系列里一般使用IBUFDS_GTE2原语来接收差分参考时钟。这个原语有两路输出一路是可以直接驱动的逻辑时钟另一路是到GTX内部PLL的专用时钟路径。它的端口示意如下IBUFDS_GTE2 #( .CLKCM_CFG(TRUE), .CLKRCV_TRST(TRUE), .CLKSWING_CFG(2b11) ) ibufds_gte2_refclk ( .O (refclk_out), .ODIV2 (refclk_div2), .CEB (1b0), .I (refclk_p), .IB (refclk_n) );这里ODIV2是参考时钟的二分频输出可以给用户逻辑做参考时钟监测或低速逻辑使用。注意如果参考时钟频率很高用ODIV2做逻辑时钟会更稳定。共享逻辑也是一个容易忽略的点。一个Quad内的QPLL、时钟分频、电源管理等资源被称为“共享逻辑”。在Vivado里你选择共享逻辑是放在IP内部还是外部会影响你例化多通道时的连接方式。如果每个通道都包含一份共享逻辑多通道之间可能会冲突工程上更推荐把共享逻辑分离出来单独例化然后再把多个通道的IP拼接上去。尤其是多通道高速设计这个做法能让资源归属更清晰也方便单独复位QPLL。参考时钟的引脚约束也要特别留意。进入GTX的参考时钟引脚是专用的不是普通差分IO你在XDC里虽然可以约束引脚位置但更重要的是保证参考时钟的电气特性符合要求比如电压摆幅、耦合方式。PG168里有关于参考时钟的详细规格设计PCB时就要先确认。调试时如果PLL锁不定最先查的往往就是参考时钟有没有真正进来、幅度够不够。4. 参考时钟与线速率计算不让公式卡住配置4.1 线速率、编码开销与有效带宽的计算收发器配置中最容易算错的地方就是线速率和用户数据速率之间的关系。很多人只看协议上写的“数据速率”结果配置完发现链路根本不通或者通了但吞吐量对不上。核心公式其实不复杂线速率 用户数据速率 × 编码开销 × (1 / 有效载荷占比)。以千兆以太网为例。GE的MAC侧数据速率是1Gbps物理层要加8B/10B编码每8bit数据变成10bit所以有效载荷占比是80%那么线速率就是1Gbps / 0.8 1.25Gbps。你配置GTX时线速率就要填1.25Gbps内部数据位宽如果按10bit接口算TXUSRCLK就是125MHz如果按20bit接口算TXUSRCLK就是62.5MHz。再举一个10G以太网的例子。10G BASE-R使用64B/66B编码用户数据速率是10Gbps64bit变成66bit开销是66/64 1.03125所以线速率是10.3125Gbps。很多第一次做10G的人容易直接把线速率填成10Gbps结果接收端完全锁不住。这个坑我见过好多次连一些有几年经验的人都栽过。接收端的参考时钟频率也和线速率有关。比如10.3125Gbps用64B/66B编码内部数据位宽通常为64bit那么TXUSRCLK 10.3125Gbps / 64 ≈ 161.13MHz。如果你是手动配置就要确保给到这个时钟如果用Wizard它会自动生成对应的时钟约束XDC里会有一个MMCM/PLL的配置来产生对应的TXUSRCLK。4.2 时钟分频关系的工程实操在GTX配置里有一组参数专门用来把参考时钟分频得到内部低速时钟用于复位状态机和部分PCS逻辑。TX_CLK25_DIVIDER和RX_CLK25_DIVIDER就是干这个的。它们的要求是参考时钟频率 / 分频值 ≈ 25MHz。如果参考时钟是125MHz分频值是5参考时钟是156.25MHz分频值就不是整数了6.25这时就需要换参考时钟或者使用某些器件支持的半速率模式。部分7系列器件对这两个属性有特殊要求比如某些速度等级要求分频值必须是5那参考时钟就得选125MHz。这些限制在PG168和器件数据手册里都有。工程上如果你在选型阶段就发现参考时钟频率和分频值不好匹配尽早换频率或换器件别等到板子画完再折腾。另外QPLL配置参数也和参考时钟、线速率都有关系。QPLL_CFG、QPLL_FBDIV、QPLL_REFCLK_DIV这些属性共同决定了QPLL的输出频率。Wizard会根据你填的参考时钟和线速率自动计算一般不用手算但有时你会收到类似“无法找到有效配置”的报错原因就是参考时钟和线速率的组合超出了FPGA的PLL能力范围。这时候一是降低线速率二是换参考时钟频率三是检查是不是选错收发器类型GTX vs GTH。XDC约束层面GTX IP生成后会自动带出一个时序约束文件里面包含收发器内部时钟的约束。你最好不要大改但要注意检查有没有缺约束。尤其当你对IP做了参数修改重新生成后约束文件里的时钟名可能变化旧的XDC不清理干净时序报告里就会出现一堆unconstrained的路径。我一般每次重新生成IP后都会跑一下report_clocks确认关键时钟都在列表里。5. 调试中的坑Example Design之外的实战教训5.1 RX_READY与初始化时序问题GTX收发器有一个完整的初始化流程驱动这个流程的是GT_RXRESET和GT_TXRESET信号以及对应的状态标志RX_READY、TX_READY。很多项目里例化完IP后直接拉高GT_RXRESET或者干脆不管结果上板后RX_READY死活拉不起来。正确的初始化时序在PG168里写得很清楚先释放GT_TXRESET等TX_READY拉高再释放GT_RXRESET然后等待RX_READY。如果你的工程里发送侧和接收侧不是同时使能也要保证每个方向的复位持续足够长的时间。一个常见的错误是把GT_RXRESET和GT_TXRESET绑在一起同时释放这会导致接收侧在发送侧还没有稳定时就启动CDR经常造成RX_READY反复翻转。解决方法是写一个带状态机的复位控制器。Vivado的Transceiver Wizard生成的example design里带了一个gt_rx_reset模块这个模块值得好好研究一下它就是按照PG168的时序要求写的。我见过不少人是把example design里的复位模块直接拿过来用只是改改接口名字这是很聪明的做法。千万不要自己拍脑袋写一个“看起来差不多”的复位逻辑收发器复位对时序非常敏感差一个时钟周期都可能出问题。另外要注意RX_READY拉高之后并不代表CDR已经完全锁定数据。RX_READY只是说收发器内部PCS状态机准备好了CDR锁定是另外一回事在部分配置里看RX_STATUS或者RX_BYTESLIP状态。链路刚起来时误码率可能偏高需要等待CDR稳定一段时间尤其是长距离传输的场景。调试时可以加一个软件或硬件计数器监测RX_READY持续时间为多少如果频繁跳变链路大概率存在问题。5.2 眼图差、误码率高怎么排查链路调试最让人头疼的问题就是眼图差、误码率高而且这种问题往往不是单一原因。根据我自己的经验排查顺序很重要不然很容易白折腾三天。第一步一定是看参考时钟。拿示波器测参考时钟引脚看频率、幅度、抖动。参考时钟不干净后面所有努力都白费。很多板上参考时钟的电源纹波偏大导致PLL输出抖动很大进而整个链路误码。如果你发现自己无论怎么调发送端预加重和接收端均衡误码率都降不下来八成是参考时钟或者电源的问题。第二步是查发送端参数。把IBERT跑起来在板上用误码仪功能看眼图调整TXDIFFCTRL发送差分电压摆幅和TXPREEMP预加重。低损耗短链路一般不需要太大的摆幅和预加重过冲反而会劣化眼图高损耗长链路则需要加大摆幅和预加重。这个没有绝对公式要从最小值开始慢慢往上加每次加完观察误码率变化。第三步是查接收端均衡。如果发送端已经调到最优了误码率还是高就该调接收端了。先用CTLE的自动模式看看不行再换DFE。7系列GTX的DFE需要训练IBERT里可以开启DFE训练训练完成后能明显改善眼图。把训练后的参数记录下来再手动填到你的工程里——注意DFE参数在不同温度、不同板卡之间可能有差异量产时要留出余量。第四步是查电源噪声。收发器PMA对电源非常敏感尤其是高速率下。如果FPGA的收发器电源和逻辑电源混用或者电源去耦电容不够即使参数看起来完美误码率也会偶发升高。检查电源纹波时要用带宽足够的示波器探头靠近FPGA电源引脚测量而不是在电源模块输出端测。5.3 常见问题速查表把我在不同项目里遇到的典型问题整理成一个表方便你排查时对照症状可能原因处理办法复位后TX_READY不拉高TX参考时钟未接入或频率错误测量参考时钟引脚、检查IBUFDS_GTE2例化是否正确RX_READY反复跳变RXCDR未锁定参考时钟抖动大加大RX复位时间检查参考时钟和电源噪声数据错位、乱码字节对齐没有完成检查comma字符配置调整RXSLIDE或者对齐模式偶尔丢数据不规律弹性缓冲溢出/下溢检查时钟补偿设置确认两端时钟频偏在允许范围内眼图闭合严重链路损耗大、发送参数不足用IBERT先测线调节TXDIFFCTRL、TXPREEMP多通道数据偏斜通道未做相位对齐启用TX/RX相位对齐功能按文档时序执行复位误码率随温度漂移DF E参数余量不足用IBERT训练DFE选择保守参数检查电源散热参考时钟锁定丢失QPLL配置超范围重新计算线速率、参考时钟、QPLL参数的组合这张表不是万能药但绝大多数常规调试问题都能在这个框架里找到方向。如果实在找不到最后的手段就是对照PG168里的寄存器描述用Vivado的硬件管理器读寄存器逐项确认收发器内部状态机跑到哪一步了。这种方法虽然慢但最可靠。5.4 Example Design的正确使用姿势再聊一聊Example Design的使用。Vivado里每个GT IP都会生成一个example design里面包含了完整的测试平台、回环配置、约束文件。这对学习配置方法非常有帮助但注意example design是用来验证IP核功能的不是用来直接做产品的。我见过有的同事图省事直接把example design的顶层拿过来改个名字就当成自己工程的顶层来用。结果后面想加协议状态机、改数据路径的时候才发现example design里绑定了太多的测试逻辑拆起来极其痛苦。正确的姿势应该是用example design做仿真验证和硬件回环测试确认这个速率和配置在你的板卡上是通的然后把example design里关于初始化、复位、时钟管理的代码抽出来放进你自己的架构里最后才把你的协议逻辑接上去。另外example design里的约束文件XDC通常包含一些测试专用的约束比如ILA、VIO的时钟约束。如果你直接把整个XDC复制到工程里可能产生约束冲突或者约束了一些不存在的管脚。新工程里只保留与GTX收发器相关的约束测试逻辑的约束删掉。PG168的学习不是一蹴而就的我觉得比较实际的方法是先拿一个速率不高的协议比如千兆以太网或Aurora完整跑通一遍配置、仿真、上板、调试有了体感之后再去碰高线速率和复杂协议。这个过程中PG168始终是你的备用词典遇到不懂的就翻不用强求全部读完。最后再分享一个小习惯每次调完GTX参数把寄存器或属性值截图保存注明日期、板卡、速率、链路长度和测试结果。时间长了你会发现很多参数调优的经验是可以跨项目复用的。这不是什么高深技巧但确实是让我在后续项目里省了大量返工时间的笨办法。
返回列表