作者:明天会更好--好过_652 | 来源:互联网 | 2024-11-17 21:08
PCIe是一种高速串行总线,其传输信号为差分信号,并采用同步传输方式。然而,PCIe并没有专用的同步时钟。本文将详细介绍PCIe中的弹性缓冲(ElasticBuffer)原理,探讨其如何处理时钟差异,确保数据传输的稳定性和可靠性。
PCIe是一种高速串行总线,其传输信号为差分信号,并采用同步传输方式。然而,PCIe并没有专用的同步时钟。在设计电路时,通常会提供一组100MHz的差分时钟给后端设备,但这并不是真正的同步时钟。PCIe的时钟是嵌入在差分信号中的,在链路训练初期,会完成一个比特锁定(bit lock),在这个过程中,链路上会传输一段0和1交替的序列,即连续的高低电平,用于接收器提取时钟。接收器提取到时钟后,才能继续捕获每一位数据,进行比特识别,再进行多比特识别,即序列识别。
在PCIe发送器中会进行编码操作,使0和1的数量更加均衡,以防止总线时钟丢失。即使在正常数据传输过程中,也可能发生失锁。此外,总线处于空闲状态时,也会持续传输时钟对齐码流,以防止时钟丢失,确保数据到来时能够正确识别。
同理,符号锁定(symbol lock)表示PCIe链路上获取开始训练的标记符COM字符的过程。每个lane的bit lock,即每个lane完成了时钟恢复。bit lock指的是CDR锁定,此时只是锁到bit,但不知道哪个是bit0。
了解了PCIe总线上传输数据和时钟的基本原理后,我们再来看看100MHz时钟的作用。通常,PCIe设备需要100MHz的参考时钟,不论是根设备、交换机还是终端设备,这个时钟称为参考时钟,而不是同步时钟。PCIe控制器内部电路运行需要时钟,100MHz参考时钟即是提供给控制器使用的时钟,与其他电路系统需要时钟的概念相同。100MHz时钟输入控制器后,经内部PLL进行倍频再分给各部分电路使用。随着PCIe总线的不断升级,PLL倍频的最大值也在不断提升,但具体的机制因厂家而异。100MHz时钟主要用于控制器内部,而不是用于同步差分信号,因此,PCIe总线两端的设备可以独立使用100MHz时钟源,这种架构称为独立时钟架构。
在进行PCIe架构设计时,常使用同源时钟架构,即PCIe的根设备和终端设备都使用同一个源头的100MHz参考时钟。在这种架构中,对时钟走线长度和收发链路的时钟延迟有严格限制。这些限制的依据是什么?要解决的问题是什么?本文将详细分析这些问题。
首先,PCIe接收器接收到的数据是基于总线上恢复的时钟(使用CDR恢复的时钟),那么100MHz参考时钟的作用是什么?为什么需要对100MHz时钟进行限制?这里涉及接收器内部的工作机制,其中一个关键部件是弹性缓冲(Elastic Buffer)。弹性缓冲的作用是在将CDR恢复时钟采样得到的数据传输到后续电路时,进行一个过渡。因为后续电路采用的时钟是接收器使用100MHz参考时钟进行倍频得到的时钟,存在两个时钟域。尽管前后时钟被处理到同一频率,但频率和相位不可能完全一致。这种差异是否会影响数据从一个时钟域传输到另一个时钟域?
在其他信号传输过程中也会遇到类似的问题,例如CPU处理频率极高,而机械硬盘存取数据的速率远低于CPU处理数据的速率。为了解决这一问题,通常通过高带宽总线将数据从硬盘传输到内存,再由CPU处理。这种方法称为缓存。但在PCIe接收器内部,两个时钟的差异较小,设计上希望频率完全一致,因此不需要缓存。
弹性缓冲的工作原理如图所示(图片摘自《Elastic Buffer Implementations in PCI Express Device》Joe Winkles)。缓冲区左侧数据进入时使用CDR恢复的时钟采样,属于恢复时钟域;缓冲区右侧数据取出时使用控制器使用100MHz参考时钟倍频后的本地时钟,属于本地时钟域。两个时钟由于各种不可控因素会存在微小的频率和相位差异,弹性缓冲是一个先进先出的缓冲空间,数据从左边进,按顺序从右边出。入口和出口的差异使用SKP序列进行处理。
SKP序列是PCIe总线专门用于补偿时钟差异的特殊序列(下图摘自《PCIe 5.0 Base Specification》PIG-SIG),不传输有效数据信息,主要用于占位。SKP序列会在总线上定期插入数据序列中,具体占位大小因PCIe版本而异。当SKP序列和有效数据序列一起被接收器采样进入弹性缓冲后,也会占用弹性缓冲的若干位置。
SKP序列发挥作用的方式很简单:当数据进入的时钟频率(CDR恢复的时钟频率)大于数据出的时钟频率(本地时钟频率)时,数据进入速度比离开速度快,可能导致缓冲区数据累积过多,甚至溢出。在这种情况下,从缓冲区中抽出几个SKP,释放位置,避免数据溢出。当数据进入的时钟频率小于数据出的时钟频率时,数据离开速度比进入速度快,可能导致缓冲区数据减少,甚至为空。在这种情况下,向缓冲区中插入几个SKP,填充缓冲区。
通过抽走和插入SKP序列的方式,可以解决两个时钟频率差异的问题。弹性缓冲自身具有状态检测功能,能够不断监测缓冲区内的数据量,从而做出相应操作。具体操作的SKP数量因不同厂家的控制器设计而异。
从弹性缓冲的工作原理可以看出,其对时钟差异的补偿量级有限,仅能操作的SKP数量对应的时间较短。一个SKP序列在PCIe 5.0中只有16bit数据,对应的时间极短,因此弹性缓冲能够补偿的时间也很短。如果缓冲区两侧的时钟差异较大,弹性缓冲将无法有效补偿,因此需要对时钟进行限制。