https://zhuanlan.zhihu.com/p/97662754
https://zhuanlan.zhihu.com/p/97792312
https://zhuanlan.zhihu.com/p/98448910
https://zhuanlan.zhihu.com/p/99303927
耽搁了很久,终于开始介绍在FPGA上实现一些高速接口了,本系列主要介绍的是如何在FPGA上实现10G以太网接口,当然25G或者更高速率的以太网接口的实现流程和这个系列所要说的基本一致,可以参考。
本系列和上篇文章一样还是翻译自Xilinx提供的IP核的手册,不忘IP手册翻译大师的本分。
本系列将会分为:基本知识、接口的基本结构、IP核的配置、接口的测试与使用等章节。
1. 基本知识
1.1 什么是以太网?
我们上了这么多年网,听了无数个关于网络的名词,像是因特网、以太网、局域网、广域网、万维网、蜘蛛网等等等等,笔者也不去细究这些玩意的具体含义和区别,就简单讲讲什么是以太网(Ethernet)。
按照百度百科的说法,以太网是一种计算机局域网技术[1],就是为了给在同一局域网下不同设备之间进行通信的一项技术。
以太网标准对应于IEEE 802.3的标准中,自研制发布以来的10 Mbps标准,一直发展到了后面的100 Mbps、1000 Mbps、10 Gbps乃至现在的400 Gbps的标准,一直朝着高速的方向发展......(这部分吧啦吧啦一些背景),总之就是越快越好,有谁嫌弃自己的网速快呢。
这个系列提到的10G以太网接口也是目前是数据中心等场所应用较为广泛的接口,而10G以太网就是以太网诸多标准中对应速率的一种,就是能跑10 Gbps的以太网。
1.2 以太网帧结构
我们知道看小电影和玩游戏的画面是一帧一帧显示的,常说卡成PPT不过就是肉眼可感知到每一帧图像的显示,而网络数据在传输时也是一帧一帧数据进行传输的。但与一帧视频代表一张图像不同,以太网帧的内容是按照既定的规则组成的。下图就是以太网帧的基本组成,以IP数据报为例的以太网帧结构。
以太网帧结构从上图中可以看出:
- 以太网帧在物理层包括了7字节的前同步码、1字节的帧开始定界符和MAC帧;
- MAC帧包括了6字节的目的地址、6字节的源地址、2字节的类型、46~1500字节的数据报文和4字节的FCS,一般来说MAC帧的长度在64-1518字节;
- 对于更上一层结构根据数据报的内容规则不同有所区别,因为本系列只研究以太网接口,故更上层不做赘述。
在实际网络通信过程中,为了解决网络传输的复杂性,从应用层来的数据就是这样层层封装,两转三转四五六七八转,达到物理层用于物理上实际传输时的数据包就变成这样了,作为人类看起来可能会觉得很复杂,但是对于喜欢规则的机器或者程序而言就很方便了。一个大文件也是这样切成一帧一帧的数据帧层层封装用于传输。
1.3 10G以太网OSI参考模型
前面简单介绍了什么是以太网以及以太网数据帧的结构,本来这小节将讲OSI的,但考虑到是讲10G以太网接口,故直接就介绍10G以太网OSI参考模型一并带过了。
OSI即开放系统互联(Open System Interconnection),把网络通信的工作分为7层,分别是物理层,数据链路层,网络层,传输层,会话层,表示层和应用层[2]。层与层之间相对独立,这样工作在对应层的硬件设备或是程序模块可以各自独立进行设计。
下图就是10G以太网OSI参考模型[3],以太网接口就工作在物理层和数据链路层上。
IEEE Std 802.3-2012 Ethernet Model其中:
- 10GBASE-R标准对应的传输介质为光纤等,10GBASE-KR标准对应的是背板,两种标准所对应的结构有所区别;
- 物理层一般包括PMD、PMA和PCS,分别实现物理连接、串化/解串和64B/66B编解码;
- 由于10G采用的是64B/66B编码,故10 Gbps速率的数据经编码后在介质上传输的实际速率为10.3125 Gbps;
- 数据链路层包括RS、MAC等,分别实现MII连接和MAC层数据流控制、检错等;
10G以太网接口也就包含上述介绍的部分,在接下来的(二)中也会再次详细介绍,其他子层就不做介绍了。
前面所提到的以太网帧结构就是在这些子层中完成封装的,而以太网接口实质上只做对MAC层以上的子层所封装的数据帧进行与外部物理介质的传输这样的一个过程,对于数据内容不关心,只关心传输是否正确。
1.4 Xilinx FPGA的高速串行收发器
高速串行收发器?好像在哪儿提过,对,就是在前一篇文章提到过使用IBERT工具去测试高速串行收发器的通信质量,忘记了的可以再去复习复习⬇️。
十二点过九分:在开始高速接口前,我们来试试IBERT测试吧!zhuanlan.zhihu.com
图标但这篇文章只是提了一嘴,但是基本没讲啥是高速串行收发器,在这一小节里讲简单说说Xilinx FPGA的高速串行收发器。
高速串行收发器,Xilinx的FPGA中将其称为GT(Gigabit Transceiver),也就是能跑Gbps以上的收发器,从词的组成来说分为高速串行和收发器。
先讲讲高速串行,串行好理解,就是就是一连串一个时间只传1个数据的数据流。那么高速呢?Xilinx FPGA的高速串行收发器到底能跑多快?下面这张图就是常见的几个高速串行收发器对应的速率,当然实际上在不同的FPGA上实际对应的速率有所差距。
高速收发器及其对应速率然后再讲讲收发器,收发器就是既可以接收数据,也可以发送数据(像是说废话)。
那么问题来了,能跑这么快的收发器是怎么实现的?这又要扯到SerDes技术,就是前面PMA层实现的功能,感觉没完没了了,这篇文章就不详细说明SerDes技术是个啥了(可以参考一些相关的书或者等专栏其他文章会不会提这事),我们只要知道这么快的“串口”在SerDes技术的一番操作下就能跑这么快就好了。
我们有了10G以太网的基本知识,又有了高速串行收发器的加成,那么把它俩怼一块,10G以太网接口不就出来了嘛。是的,我们只要使用具有高速串行收发器的FPGA,就能在上面实现一个10G以太网接口。但,前提是,高速串行收发器的速率需要在10.3125Gbps以上,那么使用GTX、GTH和GTY收发器就可以实现了。
2. 接口的基本结构
本篇文章主要讲讲10G以太网接口的基本结构,本质上还是属于该掌握的基本知识,还没有涉及到设计的部分。但是本部分大量参考自Xilinx的IP核手册,具体参考可详见文章末尾。
2.1 10G以太网接口基本结构
上篇文章简单说了接口的结构,我们知道以太网接口就是个搬运工,把MAC层来的数据报打包搬运到“货车上”(光纤等),或者是把“货车上”的卸下来拆了包装盒送到MAC层,对包装盒装的啥东西根本不关心。
介于笔者的目的是采用进行光纤通信的,所以选择的也是10GBASE-R标准作为讲述对象。
下图是一个以太网系统的典型结构图[1]。
Typical Ethernet System Architecture从典型结构图中可以看出,接口的部分由PMD、PMA、PCS和MAC子层组成:
- 其中在设计当中PMD子层一般使用光模块代替,实现光电/电光转换,这样高速数据就可以在光纤中得以传输;
- 而接口的PMA、PCS和MAC的部分在设计中一般采用IP核实现设计,如上图中就采用了10G Ethernet Subsystem实现这部分设计。
下图是Xilinx 文档PG157中的10GBASE-R标准的结构图[2],实质上对应的就是上面那个典型结构图中的PMA、PCS和MAC部分。
10GBASE-R 结构图从上图中可以看出:
- PMA层对应就是GT部分,利用SerDes技术实现:对光模块来的数据(rxn,p)进行时钟恢复,并将串行信号转换为并行66bit位宽的数据,对应时钟为156.25 MHz,可计算出速率为10.3125 Gbps;对PCS层来的66bit位宽、156.25 MHz的数据转为串行数据(txn,p)再传输到光模块;
- PCS层如图所示包括64b/66b编解码器、绕码/解绕码等,该部分是为了将PMA层来的数据进行解绕码、将66b位宽解码成64b位宽,即转为64bit位宽、156.25 MHz的数据了;对MAC层来的数据进行信道编码(64b/66b编码)、绕码等操作送入信道传输;
- PCS子层与MAC子层之间使用XGMII接口连接,该接口传输的数据其实已经是完整的以太网帧数据(包括了前导码、FCS等部分)。如果自行设计MAC的话,可以直接将XGMII对接到MAC上;
- MAC部分将在下一小节详细讲述。
2.2 MAC层
让笔者自行设计MAC?
设计是不可能设计的,这辈子都不可能设计,只有使用Xilinx的MAC核才能维持得了生活。
下图就是Xilinx文档PG157中的MAC核的结构[3]。
Xilinx 10G MAC核的结构从上图中可以看出:
- MAC核基本上由数据传输引擎、流控制、MAC核配置和状态信号等部分组成;
- 数据传输引擎主要完成:将来自XGMII的数据,去掉前导码、起始符和帧校验序列(FCS),转为MAC帧(没有FCS的)传输到更高层,帧与帧之间有帧间隔;将MAC层的数据,计算FCS、增加前导码和起始符,封装的数据帧按照规则形成帧间隔,转为XGMII接口数据送到物理层用于传输;
- 至于什么是流控制目前还不清楚,之后了解后再补上,还望不吝赐教;
- 配置和状态信号主要用于配置MAC核的一些参数以及输出一些传输过程中的状态信号,这个在下篇文章会提到;
- 值得注意的是:Xilinx的很多IP核都采用AXI接口,至于什么是AXI接口可以参考下面的系列文章;
ljgibbs:深入 AXI4 总线(一)握手机制zhuanlan.zhihu.com
图标2.3 时钟结构
以上详解了接口的结构,接下来就是时钟。在使用中发现7系的芯片和UltraScale芯片对应的IP核有很大的出入,这个在之后的IP配置中会详解,这里只比较7系的IP核的时钟结构和UltraScale系列IP核的时钟结构。
下面是7系芯片对应的IP核的时钟结构。
7系 时钟结构值得注意的是:
- 在7系中可以发现,如果使用10G Ethernet Subsystem IP核,它会有shared logic这样的结构。当然只使用一个10G口,那么可以直接无脑勾上,但是如果想做一个810G或者更多口的万兆交换机,如果每个都选上shared logic那么就会出现资源不足的情况,主要就是GTCOMMON和IBUFDS_ GTE2资源不足,解决方法就是:如下图所示,先配置一个带shared logic的IP核,再配置一个不带shared logic的IP核;然后10 G通道1例化使用这个带shared logic的IP核,通道2、3、4例化使用不带shared logic的IP核,这样实现4个10 G通道共用这部分资源,这其实也是Xilinx希望这么做的;*
- 其他时钟就如图所示,IP核需要一对频率为156.25 MHz的差分参考钟,如果PCS/PMA和MAC都使用的话,coreclk_out就是供用户逻辑使用的时钟,同样为156.25 MHz;
下面是UltraScale系列芯片对应IP核的时钟结构[4]。
image<figcaption>UltraScale系列 时钟结构</figcaption>
值得注意的是:
- 与7系不同的是,它不用特意操作一番供多个10G口使用了,具体操作会在下篇文章说明;
- 同样它也需要一对差分钟,但是用户逻辑可以使用的时钟变成了tx和rx分开了,也就是必须按照手册去对应状态信号也好、以太网数据也好,是工作在哪个时钟域下的,如果有问题的话可能就要进行跨时钟处理了。
2.4 其他
上面其实也提到了,在实际设计过程中,使用Xilinx的芯片,由于7系和UltraScale系列的架构不同,对应的IP核也有所区别,使用这些IP核的过程中需要仔细阅读官方手册,笔者因为能力有限,也只是分享自己学习过程中的一些理解,看官方手册还是最为直接最为清楚的学习方式。
3. IP核的配置
本篇文章主要是讲IP核的配置,鉴于Xilinx的7系和UltraScale+系列FPGA在架构上的不同,部分IP核也有所区别,所以本文把这两种FPGA所对应的10G以太网接口的IP核的配置都介绍一遍,以便参考。
需要注意的是:
- 本次实验用板选用的是:搭载7系芯片的VC707评估板、搭载UltraScale+系列芯片的KCU116评估板;
- 两者选用的IP核分别为:10G Ethernet Subsystem(3.1)、10G/25G Ethernet Subsystem(2.5)。
3.1 10G Ethernet Subsystem
这个IP核支持7系、Zynq和UltraScale的FPGA,详见下图[1]。以下诸多内容主要参考理解自Xilinx的文档PG157。
10G Ethernet Subsystem 所支持的芯片- IP核配置界面
该部分可以参考手册PG157的第156页到172页。
Ethernet Standard 界面如下,能选的只有数据位宽,32 bit位宽对应312.5 MHz时钟频率,64 bit对应156.25 MHz。这里选64 bit。
Ethernet Standard 界面MAC options 界面如下,能勾选的只有两个,IP核的配置与流控制。其中配置勾上的话即选用AXI4-Lite作为配置信号接口,不勾的话就是多出很多配置vector自行配置。这里均不勾选。
MAC options 界面PCS/PMA options 界面如下图,可选择的是DRP clocking的频率和收发器Debug选项,DRP clocking用于IP核的一些初始化等操作,使用中输入的频率和设置的频率一致。这里选100 MHz、其他不勾选。
PCS/PMA options 界面shared logic 界面如下图所示。在许多IP核中有这个选项,主要用于多个相同IP核使用时可以共用部分资源以达到节省资源的目的,这里所共用的就是一些与时钟相关的资源,在前一篇文章中所有介绍,可以去回顾下。如果该IP核是被分享的即勾选上项(完整的),如果该IP核是节省部分资源要共享自其他的勾选下项(不完整的)。
shared logic 界面- IP核例化
重点来了,在配置好IP核的一些基本内容并生成后,它的例化接口信号特别特别的多,如果不采用在block design中自动连线的方法似乎难以接线,笔者在这里简单的把这些信号线进行分类加注解,以便使用。
当然以下截图的内容仅供参考,不完全对,更详细的解释详见手册PG157的第15页到第49页。
image image- 其他
如果使用这个IP核去设计多个通道的以太网接口时,若这些通道中以4个为一组在同一Bank中时,可以参考前一篇文章中提到的方法去设计,即使用shared logic功能实现4个通道共用部分资源的设计方法。
3.2 10G/25G Ethernet Subsystem
这个IP核仅支持UtlraScale架构的FPGA,详见下图[2]。
10G/25G Ethernet Subsystem所支持的芯片- IP核配置界面
该部分可以参考手册PG210的第183页到191页。
Board界面如下,保持默认就好。
Board 界面Configuration 界面如下,这部分内容较多,需要注意的是:
- General的选项可参考自下面,选择PCS/PMA+MAC 64 bit的、速度选择10.3125 G,数据接口选择AXI-Stream的,具体意思可参见前两篇文章;
- Num of cores根据需求选择,1对应一个10G通道、4对应4个10G通道,就不用与上面那个IP核一样配置4个10G需要1+3操作了;
- R/KR标准选择BASE-R;
- 控制与状态信号选择control and status vectors,当然熟悉AXI-Lite的也可以采用这个作为相关配置的总线协议。
MAC options 界面如下,FIFO logic主要在RX端增加FIFO用于接收的数据缓存和跨时钟处理,如果有低时延的要求的话可以不勾。其他选项可不勾选。
MAC options 界面GT Selection and Configuration 界面如下所示,该界面主要用于选择与高速收发器相关的内容:GT Refclk即收发器的参考时钟,可以选的不多,根据设计中能提供的参考时钟选择,这里选择156.25 MHz;DRP Clocking与前一致,选择100 MHz;GT Type和GT Selection根据板子上提供的收发器的不同进行勾选,例如KCU116是GTY收发器、10G/25G口是在 Quad X0Y2上,如果只选择一个10G通道,可如图勾选。
GT Selection and Configuration 界面shared logic 界面如图所示,可按图勾选。
shared logic 界面- IP核例化
与前一个IP核一样,简单的把诸多的接口信号进行分类注解,以便理解,但仅供参考,具体各信号描述详见手册PG210的第15页到第78页。
image image image image.png以上IP核接口信号仅是勾选一个10G通道对应的内容,如果勾选了n个通道(2-4个)应该信号线会更加的多,大致多出的信号就是后三张图的信号*n。
- 其他
有疑惑的是,笔者没有实际使用过该IP核的shared logic的功能,只用过前一个IP核的该功能,觉得10G/25G IP核已经可以在一个IP核下支持4个10G/25G的通道,就不大清楚它的shared logic功能是用来干嘛的了(当然主要是懒没有详细去参看文档了)。
3.3 简单小结
单从IP核的配置而言并不复杂,可以参考上面笔者选项勾选,如果对一些没提到的东西有所疑惑,也可以直接去参考Xilinx提供的IP核手册PG157、PG210。
需要的注意的选项在“其他”中也有所提到,就是当实际使用场景中需要多个10G口的时候,两种IP核配置使用的方式会有所区别。
4. 测试与使用
本篇文章主要是在前三篇的基础上去测试与使用我们的10G以太网接口,当然,一般很多文章可能直接去open example design,在示例工程上再作进一步的设计,这样设计的话比较简单,但是笔者反正闲的没事做,就直接例化IP核去使用了,手动连线也是一种乐趣。
4.1 测试
此次测试中采用:FPGA硬件平台为Xilinx的评估板VC707和KCU116、硬件开发平台为Xilinx的Vivado 2018.3、网络测试仪为Spirent的TestCenter和信而泰的TestStrom。
在测试之前先感慨一波实验室板子设备真多,随便瞎折腾不用怕没东西,搞科研是不会搞科研的,这辈子都不会搞科研的,只有折腾各类高端板子搞一些骚操作才能维持得了生活~
好,废话不说了,开始测试!
笔者所采用的测试方法与其他很多接口的测试方法一致,就是自环测试。所谓自环测试,就是以太网接口接收到数据后不作任何处理,直接在内部回环用于输出,这样可根据测试数据的收发情况用于判断接口是否设计正确。
本次自环测试的结构框图如下图所示。
自环测试框图在上图中:
- 网络测试仪需要可支持10G测试,常用的测试仪有Spirent的TestCenter、国产的信而泰的TestStorm等,笔者在实际测试使用发现两种测试仪有一定差别,如果财力雄厚买贵的就完事了;
- 在FPGA工程中,根据芯片的不同,需要例化不同IP核(详见前一篇文章),用户侧AXI4-Stream数据接口的Rx端和Tx端各接FIFO,接FIFO的目的是缓存突发数据,Rx的FIFO输出数据接到Tx端FIFO的输入数据,形成内部FPGA自环;
- 网络测试仪与FPGA之间采用光纤和光模块进行连接,光模块使用SFP+光模块(对应10Gbps),光纤和光模块需要匹配,即单模光纤对单模光模块,多模光纤对多模光模块,当然如果有10G SFP+的电缆,也可以直接用电缆连接;
具体测试流程(网络测试仪以使用TestCenter为例):
- 生成工程的bit并且下载到FPGA上,按照上面测试框图连接各设备;
- 使用TestCenter对应的软件编辑网络数据流,一般以太网帧长度设为64字节到1518字节之间随机长度,设置发送速率(0-10Gbps间),设置固定发送速率或者突发发送,对接口进行多次测试,当然这只是笔者设置的测试数据流方案,并不全面,可以根据情况自行编辑数据流和发送方式;
- 观察TestCenter的数据统计结果。
具体怎么使用TestCenter在这篇文章里就不说明了,默认大家会了,不会的话可以参见网络测试仪的help或者直接询问技术客服等。
在实际测试,7系FPGA的IP核所提供的用户侧的时钟只有一个coreclk,而UltraScale+系列FPGA的IP核提供的用户侧时钟为rx_clk和tx_clk,需要注意跨时钟域操作(最简单的就是使用异步FIFO),同样对于使用多个接口的时候也需要注意跨时钟操作,不然在测试中会有一定的错误。
但即使做了跨时钟操作,由于异步时钟总是存在频差,10G实际测试速率上不了10Gbps,笔者在实际测试中,VC707的10G接口和KCU116的最高速率能到9.995Gbps左右,更高的速率(比如10Gbps)就会出现错帧的情况了,从FIFO的状态来看,猜测在持续10Gbps下FIFO满了导致的错帧。笔者觉得能到9.99Gbps以上基本够用了 。
当然以上仅针对Xilinx的评估板做的测试,如果是自己做的板子呢?
其实10G接口设计实现和测试的流程基本一致,但需要注意的是,在进行测试之前需要对高速收发器进行IBERT测试以确保收发器有没有问题,像是笔者之前在使用中发现某个通道传输的以太网数据一直会错帧,后来一测IBERT发现做的板子的通道误码就很高。
扯了这么多的接口设计测试等等等等,如果板子本身就存在一定的问题该怎么办,那你能帮帮我吗?能,具体解决方法可参见下面文章,但也不是万能的,实在没救重新画板子吧。
十二点过九分:在开始高速接口前,我们来试试IBERT测试吧!zhuanlan.zhihu.com
图标看之后还有啥补充的没,想到了再说~
4.2 使用
使用?上面不是测试完了,还要咋使用?
的确,在上面讲了测试就算是接口结束了,但是辗转反侧之后还是决定简单谈谈高速接口的使用,当然这里的使用就是10G接口后可以用在哪,也就仅限于笔者参与过的一些例子来加以说明。
高速定制网卡:虽然万兆或者更高速的以太网标准早已问世,但受限于多方面因素(硬件支持等),我们日常生活中所接触的网卡仍是千兆网卡,但是很多服务器上已经使用万兆网卡了,但不是专为某种业务定制的,而FPGA的好处就在于可按照某种业务规则去编程定制,我们有了高性能FPGA,有了高速接口(万兆网口、PCIe等)、有了特殊业务的需求,把它仨怼一块就可以设计一个高速定制网卡,在硬件上处理某些业务以减轻服务器的负担。
数据加速引擎:众所周知,网络数据量与日俱增,以至于很多与网络相关的论文都会在背景里加上这句话,足以可见其海量,海量的网络数据怎么处理是个很复杂的问题,不同的研究方向有不同的处理方式,而对研究FPGA的人来说就是把数据丢到FPGA上用硬件处理以减轻处理器的压力。同样,我们有高性能的FPGA,有多个高速以太网接口,也有了特殊加速业务的需求,那么就可以把一些数据的处理放在硬件上进行,相互间的传输采用10G或者是更高速率的以太网接口。
当然还有很多场合可以使用到10G接口,这里不再一一介绍。
在这些具体设计中,所使用的10G以太网接口的设计的步骤,还是如之前提到的步骤那样:了解基本知识和接口结构——翻阅手册配置IP核——在工程中例化IP核并且添加必要模块——进行接口的自环测试——数据接口接入实际工程用以使用。
需要注意的是,在具体使用前需要反复测试接口在多种情况下均没有问题再用于使用。
其他东西想到之后再予以补充~
网友评论