万兆以太网协议栈的FPGA实现(一):常识+PCS&PMA+结构

参考:

https://docs.amd.com/r/zh-CN/pg210-25g-ethernet/%E7%AE%80%E4%BB%8B?tocId=59kIPN67Q57xorWh9w6GTA

10GbE以太网MAC和PHY - 者旨於陽 - 博客园 (cnblogs.com)

什么是CML电平-CSDN博客

10G Ethernet PCS/PMA v6.0 Product Guide (PG068) • 查看器 • AMD 技术信息门户网站

常识小记:

万兆以太网,即10G以太网;

MAC-(XGMII)-XGXS-(XAUI)-XGXS+PCS-(XSBI)-PMA+PMD-Fiber Optics

MII是CMOS33电平的SDR传输模式;

RGMII是CMOS33电平的DDR传输模式;

8086-8080-89c51等使用的是ttl电平,大约是5v;(1:5,0:0)由于跳变的范围太大,需要的时间太长,导致压摆率(差分放大器的电平转换速率)很低;这个阶段使用三极管控制电平的反转;

CMOS电平标准,使用CMOS反转,有3.3也有5v,(1:3.3,0:0)这个范围同样太大了,在500MHZ时钟以上,这个反转速率依旧难以满足要求了;

把电压降低以提高反转速率是场景的手段(CMOS18等),但是抗干扰能力也变弱了;

HSTL:高速传输逻辑电平标准。

XGMII:10 千兆 媒体无关接口;

涉及72根线:

1:RXC 32:RXD 4:RX CTRL

1:TXC 32:TXD  4:TX CTRL

太多的线导致等长困难,SKEW过大;FPGA的板上连接可能是由核心板和背板组成的,这么多高速信号是无法正常连接的;

随着技术进步,一切都有了改善;

XGMII——XAUI:10G 附属 接口

XAUI是4lane串行接口,其对数据接口进行串化以完成传输;

[7:0]:1lane

...

[31:24]:4lane

XAUI将XGMII优化到只需要二十根线,而且因为采用了高速收发对,走线可以走的更长,节约了硬件的开发成本。

XGXS:将XGMII与XAUI互相转换;为了方便使用XGMII协议的转换方法;

 

目前的FPGA:不使用PHY芯片,自己利用GT(或其他高速收发对)收取数据,并且编写RTL逻辑解析代码。

GTX的速率可以满足10G需求:

表1 RocketIO(早期GT叫做火箭IO)的种类和对应的速率

种类

MGT

GTP

GTX

GTH

GTZ

GTY

最高速率(Gbps/s)

6.5

6.63.753.2

12.5 6.66.5

16.31613.1 11

28.05

32.75 30.5

FPGA+GT通过CML电平连接SFP+即可实现10G信号的收发。

当然,需要光模块负责其中的模数转换。

 XGMII接口MODEL框图

本子句定义了CSMA/CD媒体访问控制器和各种PHYs之间的调节子层(RS)和10千兆媒体独立接口(XGMII)的逻辑和电气特性。图46-1显示了RS和XGMII与ISO/IEC(IEEE)OSI参考模型之间的关系。

PHY = PCS + PMA

 

实现XGMII的方法:

1.直接使用GT收发器搭建PCS+PMA;

2.使用IP核;

XILINX 10G以太网IP核本质就是使用10G以太网协议对GT收发器进行封装。

相当于直接实现了上图的MAC之前的部分。

千兆以太网的前导码+SFD:EthernetⅡ报文格式

7{8‘h55}+8’hd5;+()+CRC

万兆以太网:802.3

前导码+界定符

在MAC字段中,将千兆以太网中的长度中增加了LCC(目的符地址等)

万兆网协议字段

GT收发器无法停止,其的所谓空闲状态也需要发送数据,只是制式需要调整。

以下是万兆网协议下的一些字符。

空闲字符:
task tx_stimulus_send_idle; begin tx_stimulus_send_column(
32'h07070707,4'b1111); end endtask // tx_stimulus_send_idle

万兆网IP核

PCS+PMA 核负责了PHY的部分;

但是完整版需要收费,这里选择手写MAC;

搬运:

10GbE以太网MAC和PHY - 者旨於陽 - 博客园 (cnblogs.com)

10GbE以太网遵循IEEE 802.3ae规范,其物理传输介质只支持光纤。

10GbE以太网主要分为串行的10GBase-S/L/E-R/W与并行(4路并行WDM波分复用)的10GBase-LX4两类。

10GBase-S/L/E-R/W中,S/L/E表示波长,S表示850nm短波,L表示1310nm长波,E表示1550nm超长波,不同波长有效传输距离不一样;

R/W表示PHY类型,R表示LAN PHY,即局域网物理层,码率为10.3125Gb/s,W表示WAN PHY,即广域网物理层,码率为9.95328Gb/s。

         串行10GBase-R/W使用64B/66B编码,而并行10GBase-LX4沿用千兆以太网的8B/10B编码。通过64B/66B编码,10Gb/s会变成10.3125Gb/s,所以10GBase-R的码率为10.3125Gb/s。但是10GBase-W要与SONET/SDH无缝兼容,所以在10GBase-W的物理层增加了WIS(WAN Interface Sublayer)子层,其主要功能是将10GbE LAN应用中的Idle码去掉,使速率降到9.95328Gb/s,与SDH VC-4-64c和STS-192c兼容。 

IP核参数

位宽选择 156.25MHZ,32位宽;64位宽时钟频率太高了!

此IP核(BASE-R)仅实现通信功能;

KR则实现了自协商、校验等功能。

同步-解扰-解码+对齐

延迟

这些测量仅适用于核心;它们不包括通过收发器的延迟。通过收发器的延迟可以从相关的用户指南中获得。

这些数字的误差范围为33个UI(一个32位的XGMII单词)。

传输路径延迟

从发射端XGMII的输入端口xgmii_txd[31:0]测量(直到该数据出现在gt_txd[31:0]),

7系列设备的XGMII接口配置的延迟为14个周期。

对于超尺度设备,这是312.5 MHz传输时钟的8个周期。

接收路径延迟

接收路径延迟是可变的,并且主要取决于接收弹性缓冲区的填充级别。

当选择64位数据路径时,

核心的MAC(或客户端)端有一个64位数据路径加上8个实现XGMII接口的控制位。

表2-1定义了信号,这些信号都同步到156.25 MHz时钟源;

相关的时钟端口依赖于家族和核心排列。

它被设计为连接到FPGA中的用户逻辑,

或者通过在您自己的顶级设计中使用选择IO™技术双数据速率(DDR)寄存器,(ODDR)

以提供一个外部的32位DDR XGMII,在IEEE Std 802.3的第46条中定义。TX时钟源和RX时钟源的定义见表3-1。

(这里的描述意味着,选择64位的时候,需要使用ODDR输出以太网的输出时钟)

再用这个时钟来处理RXD这些信号。

  ODDR #(
      .SRTYPE("ASYNC"),
      .DDR_CLK_EDGE("SAME_EDGE")) rx_clk_ddr(
    .Q(xgmii_rx_clk),
    .D1(1'b0),
    .D2(1'b1),
    .C(coreclk),
    .CE(1'b1),
    .R(1'b0),
    .S(1'b0));

SFP+相关配置

配置第一项的MODDEF0 and LOS是光模块相关的控制信号,在本人使用的开发板中没有提供配置端口;
所以分别设置为:
1,0,0

 备注:

1.当一个光模块存在时,应使用MODDEF0和LOS(信号丢失)输出的逻辑NOR来创建到核心的信号检测输入。

2.这个信号没有连接到这个版本的核心内部。您应该处理这些输入,并根据需要重置设计。

3.连接到SFP+ tx_fault信号,或XFP MOD_NR信号,具体取决于存在哪个信号。

IP核引脚

选择64bit模式的时候不能像直接封装GT收发器一样使用USERCLK2作为用户时钟;而是应该使用coreclk;

这是因为其的输出的过程中添置了一些事物以后,在64bit下CORECLK只有USERCLK2的1/2;(但是DDR模式输出数据),USERCLK2在这个模式下和USERCLK一个频率,都是输入GT时钟的两倍。

CORECLK是BUFG的GT REFCLK。

在官方的例子中使用了ODDR输出CORECLK。

PCS BLOCK LOCK:同步完成;

其余的状态R版本没有提供。

pma_pmd_type[2:0]

In 10GBASE-R only: Set this to a constant to define the PMA/PMD type as described in IEEE 802.3 section 45.2.1.6:

111 = 10GBASE-SR(其实选其他的也没有影响)短距离

110= 10GBASE-LR 长距离

101 = 10GBASE-ER 超长距离(苛刻环境,采矿,水下)

对于Zynq-7000、Virtex-7和Kintex-7设备的参考时钟,
收发器差分参考时钟(refclk_p/refclk_n端口)必须在156.25 MHz下运行,
但对于32位10GBASE-R核,差分参考时钟必须在312.5 MHz下运行。(但是非常难买,售价昂贵)
对于U+设备,refclk可以运行在156.25.161.13、312.5和322.26 MHz,显然U+更灵活。

名词解释

MAC Media Access Controller 媒介访问控制器
PHY Physical 物理层
PCS Physical Coding Sublayer 物理编码子层
PMA Physical Media Attach 物理附加子层
PMD Physical Media Dependent 物理依赖子层
XGXS XGMII Extender Sublayer XGMII扩展子层
XAUI 10 Gigabit Attachment Unit Interface 一种10G以太网接口
CDR Clock Data Recovery 数据时钟恢复
pre-emphasis 预加重技术
offset cancellation 失调消除技术
MII Media Independent Interface
RS Reconciliation Sublayer 协调子层

MAC

数据链路层包括LLC子层、MAC Control子层(可选)、MAC子层和RS子层。MAC层主要负责控制与连接物理层的物理介质。在发送数据时,MAC协议事先判断是否可以发送数据,如果可以发送,将给数据添加一些控制信息,最终将数据以及控制信息以规定的格式发送到物理层;在接收数据时,MAC协议首先判断输入的信息是否发生传输错误,如果没有错误,则去掉控制信息发送至LLC层。

上图是10GE MAC的内部实现框图,主要包括Transmit Engine、Receive Engine、Flow Control、RS、管理模块和时钟&复位模块。其中Transmit Engine和Receive Engine主要是两个FIFO缓冲区,用来缓存发送和接收的数据。Flow Control指流控制,因为实际通信过程中,双方的处理速度不一致,这样可能出现MAC接收缓冲区满的情况,如果此时继续接收报文,则接收到的报文会被直接丢弃,Flow Control就是针对这种情况,当接收缓冲区报文达到阈值时,发送PAUSE帧或者PFC帧,告知对端MAC停止发送报文。Statistics模块则进行报文统计。

以太网帧

标准数据帧

 

802.1Q数据帧

MAC Control

 

 

MAC Control帧格式如上图,其中,目的MAC是一个特定的地址,Type字段为0x8808,MAC Control Opcode决定了MAC Control帧的类型。

    PAUSE帧和PFC帧是MAC层Flow Control的基础。

         PAUSE帧的目的MAC固定为01-80-C2-00-00-01,它的作用是当接收FIFO达到阈值时,告诉对端MAC停止发送报文。PAUSE帧的参数表示停止发送报文的时间间隙,当对端MAC接收到PAUSE帧之后,会在时间间隙结束之后继续发送报文;如果在时间间隙结束之前接收到参数为0的PAUSE帧,则表示可以立即发送报文。

         PFC(Priority-based Flow Control)帧则是根据802.1Q VLAN TAG的COS值,依据优先级进行流控。PFC帧的目的MAC也是01-80-C2-00-00-01。

RS

         协调子层主要是使不同物理介质对MAC子层透明,即把各种MII接口的数据,以统一的方式和MAC层传输。

MII

  MII接口是MAC和PHY之间的接口,有MII/RMII/SMII/SSMII/GMII/SGMII/XGMII等,由MII接口转换而来的以太网背板接口有XAUI/10G-KR4等。

XGMII 

XGMII总线(IEEE 802.3 Clause 46)有发送和接收两个相互独立的通道,每个通道有一根参考时钟信号、4根数据同步信号(每个同步信号控制1个Lane的数据同步)、32根数据传输信号(分为4个Lane),一共74根信号线。

 

         XGMII码流格式如上图,由帧间隙(IFG)、帧前导码(Preamble)、帧开始定界符(SFD)、帧数据(DATA)和帧结束定界符(EFD)构成。

         帧间隙从Terminate控制符开始,到Start控制符结束,帧间隙过程中传输Idle控制帧。帧间隙的时长以字节为单位,帧间隙最小值根据双方MAC实现确定,10GBASE-R应用场景,最小帧间隙(IPG)为5个字节。(千兆网下是12个周期)

         帧前导码是7个连续的0xAA。

         帧开始定界符必须通过XGMII Lane 0传输,一个字节0xAB。(此处与下表中的Start控制符不一致,待商榷)

         帧结束定界符,可以出现在XGMII的任意Lane,其值不详。

 TXC为低电平时,表示传输数据帧;TXC为高电平时,表示传输控制帧。

 RXC为低电平时,表示传输数据帧;RXC为高电平时,表示传输控制帧。

控制通道和数据通道存在着映射关系

发送通道:S所处的位置有多个位置,C需要做映照。

 

 

XGXS & XAUI

         XGXS包括位于RS侧的DTE XGXS和PHY侧的PHY XGXS两部分。XGXS子层(IEEE 802.3 Clause 47)的出现有两个原因:

1)  XGMII接口是并行接口,一共有74根信号线,XGXS将XGMII接口转为XAUI接口,串行化(4 Lane共16根信号线);

2)  XGMII接口总线的布线长度小于7cm,无法支持二层以太网交换机跨板(通过背板)通信,经过XGXS转换的XAUI接口则支持最长50cm的布线长度;

         发送方向,XGXS接收XGMII的数据,将XGMII数据帧和控制帧转换成XAUI码流(code-groups),编码之后传输。接收方向,首先解码XAUI码流,补偿时钟和相位,转换成XGMII数据帧和控制帧,然后传输。

PHY

  PHY层包括PCS子层、PMA子层和PMD子层。

PCS

         PCS层面向的业务接口是XGMII, XGMII是所有10Gb/s PHY针对RS层或者XGXS层提供的统一接口。

         上图是一个典型的10GBase-R PHY的IP核内部结构体,红色框图部分是PCS实现。其中,64B/66B Encode/Decode负责编解码、Test Pattern Generate/Test Pattern Check负责发送和校验测试报文(PHY硬件自检)、Scramble/Descramble负责加解扰、Gearbox(变速箱)和Block Sync负责速率匹配和时钟、相位补偿、字对齐等功能、BER Mon(Bit Error Rate Monitor)负责监控误码率。

  加解扰技术是一种调制技术,其原理是将扰码与原始信号相乘,从而得到新的信号,与原始信号相比,新信号在时间和频率上被打散。(不加扰根本发不对)

  PCS层发送方向和接收方向都可以工作在正常模式(Normal mode)和测试模式(Test-Pattern mode)。当处于测试模式时,Test Pattern Generate/Check使能。

  PCS层Gearbox模块负责将发送方向的数据分组成16位一组的数据单元,通过XSBI接口发送给PMA层。

  编解码的目的有两个:

1)避免物理传输介质上出现连续的1或者0,如64B/66B编码将64位数据编码成66位数据在传输介质上传输,从而降低信噪比;

2)区分出数据和命令。

  此外,PCS层还负责PHY自协商,PHY自协商可以自动匹配工作模式、工作速率等。

64B/66B

  10GBase-R的PCS层使用64B/66B编码(IEEE802.3 Clause 49),支持数据帧和控制帧,同时拥有健全的错误检测机制。

  发送方向,PCS从XGMII接收两组32位数据,一共64位数据。然后添加2位同步头(根据XGMII的TXC信号决定),01表示数据帧,10表示控制帧。同步头不通过Scrambler模块加扰码,因为如果同步头被改变,就无法区分数据帧和控制帧,也无法进行帧定界。

         在接收方向,PCS从接收到的66位数据块中提取出同步头,负载部分进行解扰码和64B/66B解码,然后把解码出来的数据通过XGMII接口发送给XGXS层或者RS层。

  PCS层无论是对接RS层还是XGXS层,都是通过XGMII接口。XGMII接口在发送和接收方向都有32根数据线,通过TXC[3:0]和RXC[3:0]进行数据同步,每个TXC/RXC信号控制8根数据线。

  64B/66B编码中,数据帧和控制帧除了同步头之外的负载部分,均包含8个字节。对于数据帧而言,负载各字节命名为D0~D7。控制帧负载的8个字节,除了Ordered Set(/O/)字符、Start(/S/)字符和Terminate(/T/)字符之外,命名为C0~C7。Ordered Set字符只能由XGMII的第一个Lane发送,因此命名为O0或者O4;Start字符同样只能由XGMII的第一个Lane发送,因此命名为S0或者S4;Terminate字符则可以出现在任意字节,因此命名为T0~T7

  对于控制帧而言,进行64B/66B之后,除同步头之外的负载部分第一个字节称为Block Type域,用来区分控制帧类型。对于包含Start字符或者Terminate字符的控制帧,Block Type域指示了它的类型。其他控制字符被编码为7位的控制码(Control Code)或者4位的O码(Ordered Set Code)。

Control Codes

Idle(/I/)

  从XGMII接收到Idle控制字符(0x07)时,PCS会根据当前数据传输忙或者闲,动态地插入或者删除Idle字符,从而调整时钟频率。/I/字符的插入和删除需要4个一组,/I/字符只能出现在/I/或者/O/之后。数据接收过程中,不能插入/I/字符。删除/I/时,紧跟着/T/的四个/I/不能被删除。

LPI(/LI/)

  /LI/字符的插入和删除原则同/I/字符。

Start(/S/)

  Start字符表示开始发送报文。

Terminate(/T/)

  Terminate字符表示发送报文结束。

Ordered Set(/O/)

  /O/字符表示开始发送Ordered Set,有两种类型的Ordered Sets——Sequence Ordered Set和Signal Ordered Set(保留扩展用)。其中,/O/出现在XGMII的第一个Lane中,/Q/紧跟着/O/出现。

  Ordered Sets用来发送控制和状态信息,如Remote Fault和Local Fault。Ordered Sets包含一个控制字符,紧跟着3个数据字符。10GBASE-R应用场景只有一种Ordered Set类型,即Sequence Ordered Set,它的控制字符简写为/Q/。

Error(/E/)

  当从XGMII接收到/E/字符,或者接收到无效控制帧时,/E/被发送。/E/可以使PCS层或者XGXS层接收到错误信息。

 

  一个66位数据块怎么确认是否为有效数据块呢?当出现以下情况是,被判定为无效数据块:

1)  同步头不是01或者10;

2)  如果为控制帧,Block Type域为无效类型;

3)  如果为控制帧,控制码为无效控制码;

4)  任何无效Ordered Set Code(4位),包括0xF;

5)  64位负载各字符顺序错乱;

PMA

         如图所示,10GBASE-R应用场景中,PMA子层介于PCS编码子层和PMD子层之间,它与PCS编码子层之间使用XSBI总线接口。

         PMA主要包括TX Serializer、RX Deserializer、PLL和CDR几部分。其中CDR负责从接收的数据中恢复出时钟信号,并通过PLL输出发送数据时钟。发送方向,Tx Serializer负责将并行数据转换成串行数据。接收方向,Rx Deserializer负责将接收的串行数据转换成并行数据。

         在PMA的实现中,针对发送通道可以配置预加重值和VOD值。预加重是噪声整形技术在模拟信号处理中的应用,其原理是在信号发送之前,先对模拟信号的高频分量进行适当提升;在收到信号之后,再对信号进行逆处理,即去加重,对高频分量进行适当衰减。预加重与去加重技术可以降低信号在传输过程中的高频损耗,也可以使噪声的频谱发生变化,这就是模拟降噪的原理。在接收方向,使用失调消除技术(offset cancellation)进行降噪。

 

接收方向

         接收方向,PMA层从PMD层接收数据,然后发送到PCS层:

1)  从接收PMD的串行数据中恢复时钟,并将时钟信号传送到PCS编码层;

2)  将10Gb/s串行数据并行化,变成16bit并行数据,速率为644.53Mbps,通过XSBI(10G Sixteen Bit Interface)接口,发送到PCS编码层;

3)  提供链路状况信息;

发送方向

         发送方向,PMA层从PCS层接收数据,然后发送到PMD层:

1)  提供时钟信号给PCS层;

2)  从PCS编码层接收16bit并行数据进行串行化,变成10Gb/s串行数据发送到PMD层;

PMD

 

         10GBASE-R应用场景中,PMD子层负责光电信号转换,即光模块。

自协商

         目前只有千兆PHY才支持自协商模式,如10/100/1000M自适应PHY。

  PHY自协商是通过快速连接脉冲(Fast Link Pulse)信号实现,简称FLP。自协商的双方通过FLP来交互数据。

  在具备自协商能力的端口没有Link的情况下,端口一直发送FLP,在FLP中包含着自己的连接能力信息,包括支持的速率能力、双工能力、流控能力等。这个连接能力是从自协商能力寄存器中得到的(Auto-Negotiation Advertisement Register ,PHY标准寄存器地址4 )。FLP依靠脉冲位置编码携带数据,一个FLP突发包含33个脉冲位置。17个奇数位置脉冲为时钟脉冲,时钟脉冲总是存在的;16个偶数位置脉冲用来表示数据:此位置有脉冲表示1,此位置没有脉冲表示0。这样1个FPL的突发就可以传输16bit的数据。自协商交互数据就这样通过物理线路被传输。

  如果两端都支持自协商,则都会接收到对方的FLP,并且把FLP中的信息解码出来。得到对方的连接能力。并且把对端的自协商能力值记录在自协商对端能力寄存器中(Auto-Negotiation Link Partner Ability Register , PHY标准寄存器地址5 )。同时把状态寄存器(PHY标准寄存器地址1)的自协商完成bit(bit5)置成1。在自协商未完成的情况下,这个bit一直为0。然后各自根据自己和对方的最大连接能力,选择最好的连接方式Link。比如,如果双方都即支持10M也支持100M,则速率按照100M连接;双方都即支持全双工也支持半双工,则按照全双工连接。一定连接建立后,FLP就停止发送。直到链路中断,或者得到自协商Restart命令时,才会再次发送FLP。

 

Error and Fault Handling

         数据帧接收过程中,通常是/S/ + /D/ … /D/ + /T/序列,如果在/C/控制字符出现在/S/和/T/之间,那么RS层应该告知MAC层发生了FrameCheckError。如果/S/出现在除了lane 0之外的lane上,RS层也会感知到错误。

         数据帧发送过程中,PHY必须仔细校验保证数据不被篡改,因为一旦对端发现接收到的数据被篡改,就会发送Error控制字符。

 

Link Fault Signaling

 

         关于Link Fault Signaling,参考IEEE 802.3ae Clause46.3.4章节。

         首先要区分两个概念,PHY层Link Up和LLC层Link Up,前者是物理链路的连接状态,后者是逻辑链路的连接状态。通常,此处,Link Fault指的是PHY层的链路连接状态。

         PHY层的链路状态指Local RS层和Remote RS层之间的链路状态。

         PHY层的各子层都需要具备检测链路错误的能力,检测链路错误主要分为两个方面:

1)  检测I/O信号;

2)  传输数据/控制帧解析,包括:

CODEC Synchronization;

Lane Alignment,如/S/只能出现在Lane 0等;

Link Status Report Recognized;

         Link Status Message是一个四字节的Ordered Sets,其中Lane 0是Sequence控制字符,剩下的3个是数据部分。Local Fault帧的Sequence控制字符是0x9C,Remote Fault帧的Sequence控制字符是0x00。

  任何一方,在接收过程中检测到链路错误,都会产生Local Fault, Local Fault帧会在接收方向透传PHY各子层,直到RS层。

  RS层负责处理Local Fault帧,同时发送Remote Fault帧给对端RS层(只有RS层可以残生Remote Fault帧)。Remote Fault帧在RS层之间透传。RS层之所有会发送Remote Fault帧给对端,是假设只有接收链路发生链路错误,发送链路没有问题。

  当RS层在128个时钟周期内接收到4个以上Local Fault帧时,它会通知本机MAC停止发送数据,并连续发送Remote Fault帧给对端RS层。当RS层在128个时钟周期内,连续接收到4个Remote Fault帧时,才会认为发送链路出现问题,它会通知本机MAC停止发送数据,并在发送链路上连续发送Idle帧。

  在128个时钟周期内,没有接收到Local Fault帧或者Remote Fault帧,则表示链路状态正常。

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2024-08-12 22:21  NoNounknow  阅读(1081)  评论(0编辑  收藏  举报