以太网时钟的PPM频率偏差的解决方案(上)

描述

以太网肇始,设备都连接到同一总线(同轴电缆),以半双工的方式通信。载波侦听和冲突检测(CSMA/CD)就是以太网的代名词。据老戚了解,传奇的Catalyst 6500交换机也使用这种半双工的百兆以太网作为控制平面。从总线电路(时钟同步的总线电路)的角度来看,这是妥妥的共同时钟总线系统。后来,以太网也经历了从总线拓扑到点对点的星型拓扑、从物理总线到包交换的转变,交换机(SDN交换机的核心 - 可编程交换芯片)应运而生,成为连接以太网设备的桥梁。

今天以太网是使用最为广泛的局域网(LAN)网络协议。相对于同期的其他协议,以太网胜出的关键在于其成本相对低廉,性能稳定可靠,组网方便灵活。其中重要的一点:以太网设备采用本地时钟,通常低成本的晶振就能满足要求。不同设备采用各自本地时钟,相互之间会有或多或少的频率偏差(skew)。802.3标准要求相对标称频率的偏差不能超过100PPM。考虑到极端的情况:一个时钟快100PPM,一个时钟慢100PPM,它们之间的频差可以多达万分之二,是不是必然导致丢包?我们在做交换机测试的时候,也会遇到端口速率99.99%以上就会丢包,低一点点就不丢了。通常认为这是以太网时钟PPM频率偏差引起的问题,但是很多硬件攻城狮对其中的逻辑感到困惑,老戚在此尝试作一番解读。

老戚认为,物理层(physical layer)的物理编码子层(PCS - Physical Coding Sublayer)对解决时钟PPM问题起了关键作用,PCS借助FIFO处理跨时钟域,通过删除或插入IDLE码组,来消除接收数据和本地时钟的有限频差,这就是弹性缓存(Elastic buffer)。弹性缓存对突发(burst)数据流量有完美的效果,却不能解决长时间线速(line rate)流量下的丢包问题,对此局限我们应当了然于胸。当然,通过上层的流控(flow control)协议,我们可以避免长时间线速。

在深入PCS子层之前,最好先了解一下物理层。

1. IEEE 802.3 物理层规范

IEEE 802.3标准规范了有线(wired)传输以太网的数据链路层(MAC layer)和物理层(physical layer)的协议。不同于无线WIFI,有线传输需要媒质(media),可以是RJ45接口的网线(4对双绞线),SFP/QSFP接口的光模块、无源铜缆,或者PCB背板等等。为了适应不同类型的媒质(信道),我们需要在发送端采用不同的编码(coding)甚至调制(modulation),以便在接收端能够正确的恢复数据。好比搬家公司搬运家具,会先分拆、打包,然后运输,到达目的地后再拆包、组装。跟搬家具不一样的地方在于,电子信号在媒质中的传输过程中伴随着衰减和形变,给接收端的数据恢复带来挑战。

时钟

<图1>

OSI七层参考模型中,物理层(physical layer)实现了MAC帧(frame)和最终进入媒质中传输的信号之间转换。物理层又可以细分为PCS、PMA、PMD,以及其他一些作为可选项的子层。

<图1>是1000Base-X(1GbE-LX/CX/SX)的物理层结构。如今802.3发展到了400GbE,速率、编解码、协议复杂程度都今非昔比,但是基本的逻辑的依然未变,1000Base-X俨然闪烁着简约之美。

在发送方向(下),PCS把MAC帧(Octets,8bit@125MHz)转化为连续的8b10b编码(code group,10bit@125MHz);PMA把8b10b编码变成串行的比特流(bit stream);PMD把比特流转化为DDR信号,并赋予适当的电气特性,来满足驱动光模块的接口特性要求。无论是MAC帧、8b10b编码还是串行比特流,他们都是与本地时钟同步的信号。最后进入媒质的信号是625MHz时钟的DDR信号,我们称之为内嵌时钟(clock embeded)的数据,因为在接收端可以仅仅依靠数据把时钟恢复出来。注意,这是发送端的本地时钟。

在接收方向(上),PMD从信号中恢复出比特流和RX时钟,实现比特位同步;PMA从比特流中恢复8b10b码型,实现码同步;PCS把8b10b解码转换成MAC帧。注意,PMD和PMA此时的RX时钟其实是对方(发送端)的时钟,而MAC层使用的是接收端的本地时钟。PCS需要实现有限频差的跨时钟域的数据转换而不丢失有用数据。

2. 为什么需要8b10b编码?

通常而言,接收端设计的复杂程度远远高于发送端。且看一下我们在接收端面临的问题:

接收端的PMD通过CDR(clock and Data Recovery)电路把比特数据和RX时钟从625MHz的DDR信号中恢复出来,前提是比特流有足够多的0/1切换;而原始数据是随机的,可能出现长0或者长1;

二进制流的0和1数目对等以实现直流均衡,这对接收端的光电转换灵敏度很关键;

接收端的PMA把串行的比特流转换成(并行的)10b码型,需要特殊码型帮助我们识别码的比特边界,实现码同步;

接收端的PCS检测单比特的误码,以便于评估误码率和信道性能;

8b10b编解码满足所有的要求,实际上,还不止这些。先说数据(data)编码 - Dxy.z。

8b10b编码把8bit的原始数据转化为10bit编码,同时保证10bit编码不出现连续5个以上的长0或者长1;

假如10b编码的0和1的数量不一样,那么它和它的镜像(位取反)作为正/负编码都对应于同一个8b数据,发送端通过选择正负码(多0/1)来实现直流均衡;

任何单比特错误形成的码型不属于有效的码型,这样单比特误码能够被发现;

当然还有最简单的编码解码的RTL逻辑。

时钟

<图2>

实际上,8b/10b编码是由5b/6b和3b/4b两部分组成。图<2>中,

5b/6b: EDCBA -> abcdei

3b/4b: HGF -> fghj

其中,A和a都是最低比特位(lsb)。

D[EDCBA].[HGF]代表二进制数据‘HGFEDCBA’的8b10编码(code group)。

原始数据是随机的,它们占用了1024(2^10)个10b码型中的256(2^8)个。在它们之外,少数码型被挑选出来作为控制码。

时钟

<图3>

8b10b的码的缺点是25%的额外带宽开销。随着端口速率的提升和技术的发展,新的编码方式也被开发出来,比如10G以上的以太网都改成64b/66b编码,PCIe 3.0以上使用128/130b编码,等等。

3. PCS(Physical Coding Sublayer)物理编码子层

8b10b控制码和数据码一起构成了PCS码组(ordered set)。PCS码组由一个或者多个8b10b码型组成。常用的有配置(Configuration),空闲(IDLE),封装(Encapsulation,标志帧头和帧尾)。

时钟

<图4>

PCS完成了MAC帧和10b码型的转换。图<5>的左边是以完整的以太网帧,包括帧与帧之间的间隙(没有有效数据),右边是每一字节对应的10b编码。想象一下,左右两侧同时被125MHz的时钟驱动,从上往下,形成MAC帧8b10b编码解码的流水线。

时钟

<图5>

我们看到,第一个前导码被控制码/K27.7/取代,代表帧头。

从第二个前导码开始一直到校验码帧尾,都是8b10b数据码转换。

帧之后第一个字节(IPG的一部分)被控制码/K29.7/取代,代表帧尾。

帧之后第二个字节(IPG的一部分)被控制码/K23.7/取代,代表载波信号延伸一拍。(根据帧长度是奇数偶数会有差异)

其他IPG将会被/I/完全填充。

IDLE(/I/)是处理时钟PPM的关键,因为它们不是MAC帧的组成部分,可以根据需要来增加或者删除。

限于篇幅,上篇到此为止。本篇阐述了以太网时钟PPM频率偏差问题的由来,基于1000Base-X总结了物理层和PCS层的结构。

我们将在下篇讲讲基于异步FIFO的弹性缓存(Elastic buffer)和解决PPM时钟问题的局限。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分