热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PCIe中的弹性缓冲原理解析

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数据,对应的时间极短,因此弹性缓冲能够补偿的时间也很短。如果缓冲区两侧的时钟差异较大,弹性缓冲将无法有效补偿,因此需要对时钟进行限制。


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 配置Windows操作系统以确保DAW(数字音频工作站)硬件和软件的高效运行可能是一个复杂且令人沮丧的过程。本文提供了一系列专业建议,帮助你优化Windows系统,确保录音和音频处理的流畅性。 ... [详细]
  • 不确定性|放入_华为机试题 HJ9提取不重复的整数
    不确定性|放入_华为机试题 HJ9提取不重复的整数 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 如何彻底清除顽固软件如360
    本文详细介绍了如何彻底卸载难以删除的软件,如360安全卫士。这类软件不仅难以卸载,还会在开机时启动多个应用,影响系统性能。我们将提供两种有效的方法来帮助您彻底清理这些顽固软件。 ... [详细]
  • 本文介绍如何使用 Python 获取文件和图片的创建、修改及拍摄日期。通过多种方法,如 PIL 库的 _getexif() 函数和 os 模块的 getmtime() 和 stat() 方法,详细讲解了这些技术的应用场景和注意事项。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • MySQL DateTime 类型数据处理及.0 尾数去除方法
    本文介绍如何在 MySQL 中处理 DateTime 类型的数据,并解决获取数据时出现的.0尾数问题。同时,探讨了不同场景下的解决方案,确保数据格式的一致性和准确性。 ... [详细]
  • 本文详细解释了华为ENSP模拟器中常用的命令,涵盖用户模式、系统模式、接口模式和地址池视图模式下的操作。这些命令对于进行计算机网络实验至关重要,帮助用户更好地理解和配置路由器及PC机的通信。 ... [详细]
author-avatar
明天会更好--好过_652
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有