最近使用Xilinx 7系列690T芯片的多个GTX接口传输千兆以太网数据帧时,在某些的测试情况下个别GTX接口会出现少量丢帧的问题,最后通过实验发现是时钟的分配使用问题,具体而言是GTX接口的QPLL和CPLL的使用问题。
情况说明
本次调试的主要任务是调通FPGA板子(型号为690T)上的24个GTX接口(对应于24个SGMII接口)。每个BANK上有4个GTX接口,每个接插件上也是4个GTX接口。如下图所示。
1、出现问题波形
连接数据源,下载自回环程序测试接口,发现X1 AB,X2AB,X3 AB 正常,X1 CD,X2 CD,X3 CD(就是靠后的一排)有少量丢帧。正常的口和有丢帧的口连接同一个地检口测试,且下载的是相同程序。错口打固定帧256字节时在VIVADO上抓信号看到收到了超短帧和错帧。且帧头出错。
2、测试场景一:24口的BANK及接插件分配情况
框内的为一个BANK,一条横线上的为一个接插件上的
测试情况:打接口回环,X1 AB,X2 AB,X3 AB正常收发,X1CD,X2 CD,X3 CD有丢帧。
3、测试场景二:12口的BANK及接插件分配情况
测试情况:打接口回环。此时的X1 AB和 X1 CD现象与上面的24口情况相同(约束方法相同,X1 CD有丢帧现象。但之前测试12口的时候无误)。但此时X3 CD正常接收。(注意到此时的X3 CD和24口测试程序的约束方法不同,此时X3 CD有两个主核,有两个从核,初步怀疑是一个主核带不起三个从核或是一个bank到集插件上的时钟走线有问题。)
4、测试场景三:测试版BANK及接插件分配情况
测试情况:打接口回环。此时的X1 AB上的数据1,2正常,数据3,4丢帧,X1 CD上的数据5,6丢帧,数据7,8正常。可以发现正常的数据口都有一个主核,一个从核。而丢帧的数据口只有从核。
分析:此时可以排除是硬件问题,因为测试情况一、二时,X1 AB可正常收发数据。然而换成测试三的约束条件,发现有两个口也丢帧。
解决思路
经过上面的三种方案验证,怀疑是从核不能独立工作。于是查阅GTX手册,看到GTX的外部时钟使用模式如下图:
GTXE2_CHANNEL/ GTHE2_CHANNEL必须为每个收发器实例化原语。如果需要高性能QPLL时,必须实例化GTXE2_COMMON/GTHE2_COMMON原语。若速率要求不高,则可以每个通道用CPLL.用QPLL时,每个QUAD块上若用多个GTX接口,则需要有主从之分。
用QPLL时参考时钟经过IBUFDS_GTE2原语输出到GTXE2_COMMON/GTHE2_COMMON原语。
GTXE2_COMMON/GTHE2_COMMON原语产生的时钟再供给其他channel.由于一个QUAD块上只能有一个GTXE2_COMMON/GTHE2_COMMON,所以再用QPLL时一个QUAD块上有主从之分。
为了解决这次调试时出现的从核不能独立工作的现象,采用CPLL的方式,每个channel都有CPLL,所以每个核都是一样的,没有主从之分,问题解决。每个核都接的是参考时钟经过IBUFDS_GTE2原语输出的单端参考时钟。程序中把GTXE2_COMMON/GTHE2_COMMON原语注释掉,把输入到核的GTXE2_COMMON/GTHE2_COMMON的输出接零就好,如下图:
基础知识
以下来源于网络:
Xilinx的7系列FPGA随着集成度的提高,其高速串行收发器不再独占一个单独的参考时钟,而是以Quad来对串行高速收发器进行分组,四个串行高速收发器和一个COMMOM(QPLL)组成一个Quad,每一个串行高速收发器称为一个Channel。
QPLL和CPLL的区别,在于两者支持的线速率不同,对于CPLL来说,支持的线速率位1.6GHz到3.3GHZ之间,而对于QPLL来说,GTX支持的线速率分两档,Lower Baud支持5.93GHz~8.0GHz,Upper Baud支持9.8GHz~12.5GHz,对于GTH则不分档位,支持的线速率为8.0GHz~13.1GHz。
Xilinx的7系列FPGA根据不同的器件类型,集成了GTP、GTX、GTH以及GTZ四种串行高速收发器,四种收发器主要区别是支持的线速率不同,下图可以说明在7系列里面器件类型和支持的收发器类型以及最大的收发器数量。
Xilinx的7系列FPGA随着集成度的提高,其高速串行收发器不再独占一个单独的参考时钟,而是以Quad来对串行高速收发器进行分组,四个串行高速收发器和一个COMMOM(QPLL)组成一个Quad,每一个串行高速收发器称为一个Channel,以XC7K325T为例,GTX在FPGA内部如下图所示:
对于每一个串行高速收发器,其包含了发送部分和接收部分,内部结构如下图:
发送端和接收端功能独立,均由PMA(Physical Media Attachment,物理媒介适配层)和PCS(Physical Coding Sublayer,物理编码子层)两个子层组成。其中PMA子层包含高速串并转换(Serdes)、预/后加重、接收均衡、时钟发生器及时钟恢复等电路。PCS子层包含8B/10B编解码、缓冲区、通道绑定和时钟修正等电路。
GTX发送端处理流程:首先用户逻辑数据经过8B/10B编码后,进入一个发送缓存区,该缓冲区主要是PMA子层和PCS子层两个时钟域的时钟隔离,解决两者时钟速率匹配和相位差异的问题,最后经过高速Serdes进行并串转换,有必要的话,可以进行预加重、后加重。值得一提的是,如果在PCB设计时不慎将TXP和TXN差分引脚交叉连接,则可以通过极性控制来弥补这个设计错误。接收端和发送端过程相反,相似点较多,这里就不赘述了,需要注意的是RX接收端的弹性缓冲区,其具有时钟纠正和通道绑定功能。
上面是GTX的性能和结构功能概述,下面详细分析GTX的时钟结构。
以7系列的GTX来说,每个Quad有两个外部差分参考时钟源,其中一个Quad的时钟结构如下图所示:
红色方框部分是两个差分参考时钟输入,每个外部参考时钟的输入必须经过IBUFDS_GTE2源语之后才能使用。绿色方框是来自其他Quad的参考时钟输入,7系列FPGA支持使用相邻(南北方向)Quad的参考时钟作为当前Quad的参考时钟,多路参考时钟源经过一个选择器之后,分两路进入QPLL和CPLL,如图五和图六,其中蓝色方框是QPLL,黄色方框是CPLL,对于一个GTX Channel来说,可以独立选择参考时钟,可以选择QPLL,也可以选择CPLL,QPLL和CPLL的区别在于两者支持的线速率不同,QPLL支持的线速率高于CPLL,图七是外部参考时钟模型的详细结构,红色箭头表示QPLL通路,黄色箭头表示CPLL通路。
因为每一个Quad有两个外部参考时钟,因此对于每一个Quad来说,可以选择两个不同的参考时钟,每一个CHANNEL的接收端和发送端都可以独立选择参考时钟,如下图所示:
如果用户需要使用其他Quad的参考时钟源来作为当前Quad的参考时钟,在满足下面三个条件的情况下可以使用:
1、只能使用当前Quad上方的Quad的参考时钟;
2、只能使用当前Quad下方的Quad的参考时钟;
3、一个Quad的参考时钟源不能驱动超过3个Quad的收发器(只能驱动当前Quad和上下方相邻两个Quad);
满足上面的条件,就可以把其他Quad的参考时钟配置成当前Quad的参考时钟,如下图所示,注意图中红色方框表示相邻的Quad:
QPLL和CPLL的区别,在于两者支持的线速率不同,对于CPLL来说,支持的线速率位1.6GHz到3.3GHZ之间,而对于QPLL来说,GTX支持的线速率分两档,Lower Baud支持5.93GHz~8.0GHz,Upper Baud支持9.8GHz~12.5GHz,对于GTH则不分档位,支持的线速率为8.0GHz~13.1GHz。当以高于CPLL操作范围的线路速率操作通道时,需要使用QPLL。GTXE2_COMMON原语封装了当使用GTX QPLL时,必须实例化GTX QPLL。
文章转载自:网络交换FPGA