【PCIE体系结构十】链路两端的参考时钟有频偏怎么办?

news2024/11/19 8:22:24

👉个人主页:highman110

👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 

参考书籍:《PCI.EXPRESS系统体系结构标准教材 Mindshare》   

        PCIE规范中有描述PCIE支持公共参考时钟架构和独立参考时钟架构,描述了发送端和接收端各自的100MHz本地参考时钟频偏要求为-300ppm~+2800ppm(来自PCIE 5.0规范文档,其中正偏多了2500ppm是给负向扩频留的裕量),这个100MHz参考时钟经过内部PLL倍频到2.5GHz(假设PCIE传输速率为5GT/s)作为串行数据发送和接收的参考时钟。可想而知,如果两端的100M本地时钟有频偏差异,两端PLL倍频后的时钟也是有频偏差异的,这就使发送和接收数据的参考时钟不一致,一个快一点,一个慢一点。有人可能有疑问了,接收端不是用CDR恢复的时钟来接收数据的吗?这个CDR恢复的时钟和发送时钟之间是没有频偏的,接收端的本地时钟快一点或者慢一点又有什么关系呢?这是因为数据在CDR恢复时钟作用下完成串并转换、符号锁定等之后,还需要进入到8B/10B解码、解扰、字节拆分合并等模块,后面这些模块的参考时钟源头是本地100MHz时钟,不是CDR恢复的时钟,这就产生了一个跨时钟域问题,这两个时钟一个快一个慢是不行的。

        通常解决跨时钟域问题都是用FIFO,或者叫弹性缓存(elastic buffer),也称为CTC Buffer或者Synchronization Buffer。除了PCIE,诸如USB、以太网等serdes应用基本都使用了此技术。如下图,弹性缓存左边数据输入使用的是接收时钟域,右边数据输出使用的是本地时钟域,弹性缓冲区负责补偿这两个时钟间的差别,方法是从弹性缓冲区的数据符号中删除一个SKP符号,或向缓冲区里的符号中插入一个SKP符号。

        1、如果发送时钟频率高于接收时钟频率达600ppm,则从缓冲区中删除一个SKP符号。

        2、如果发送时钟频率低于接收时钟频率达600ppm,则向缓冲区中添加一个SKP符号。

        链路发送端会定期发送SKIP有序集的特殊符号序列,从该有序集可删除一个“不用关心”的SKP符号,或向其添加一个“不用关心”的SKP符号。SKIP有序集包含4个控制符号(一个COM和3个SKP;Skip是“不用关心”的字符,所以才名为“跳过”)。在弹性缓冲区中的SKIP有序集里删除或添加一个SKP符号可分别防止缓冲区的上溢或下溢状况。

        这里有一点需要注意,Intel提出的PIPE规范中,只允许每次从一个SKP Ordered Set中插入或者移除一个SKP。如果需要插入或者移除两个SKP,则需要对两个SKP Ordered Set进行操作。

        这里笔者有点疑问,以太网serdes也用了弹性缓冲,但是以太网规范里似乎没有定义类似PCIE的SKIP ordered sets,以太网是怎么补偿这个时钟的呢?如下是千兆以太网定义的ordered sets。

 

        假设现在是两个1000base-x光口对接,发送端和接收端PHY的参考时钟为25M±50ppm,也是一样可能出现一个快一个慢的情况,也一样的用了弹性缓存来解决跨时钟域问题,这里有两种情况:

        1、接收端参考时钟比发送端快,就是发送端以较慢的速度把数据往FIFO里填,接收端以较快的速度把数据从FIFO里拿出来,接收要快一点,如果不做任何处理,那么累计一段时间后,FIFO将会输出空数据,发生下溢。我理解要解决这个问题只需要将输出端时钟做一下门控,让FIFO中数据达到一定阈值才打开输出时钟进行输出,否则不FIFO输出,我的理解,不一定对,不知道PHY里面具体怎么做的。

        2、接收端参考时钟比发送端慢,发送要快一点,如果不做任何处理,那么累计一段时间后,FIFO将会被填满,发生上溢。有人说了,流控pause帧是否可以解决这个问题,我这边快满了,发个流控帧过去高速发送端停一会再发。这样看似可以解决这个问题,但我理解流控应该不是用来解决这个问题的,因为这里的FIFO数据收发还是物理层的处理,而流控是MAC层的功能,物理层的问题应该由物理层自己解决,就像PCIE一样,物理层的PLP不会去到数据链路层,数据链路层的DLLP也不会去到事务层。那这个问题我理解只能加大FIFO深度来延缓上溢的发生。

        基于以上原因,一些做数通设备的厂家,常常会把自己的PHY本地参考时钟用正偏时钟,这样在用打流仪(打流仪一般是精准时钟)进行测试时,设备的接收端不会因为时钟偏慢而导致打流时间长了以后物理层有丢包。

        最后这里还有个问题,为什么接收端PHY的子模块不都使用CDR的恢复时钟作为参考时钟,非要搞一个跨时钟域出来?这个问题我也不是很清楚,大家有兴趣可以继续深入研究。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/537324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux环境基础开发工具

目录 Linux软件包管理器yum Linux开发工具 文本编辑器vi、vim vim的基本概念 vim操作 Linux编译器-gcc\g使用 函数库分为动态库和静态库 Linux调试器gdb使用 在gdb模式下的命令 Linux软件包管理器yum yum怎么说呢?就相当我们手机里的应用商店。我们需要安…

RAID磁盘阵列(看咱这篇就够了!)

目录 一、RAID简介 二、RAID的级别详列 三、总结 前言: 写这篇博客的原因是小编在工作中遇到的这个不熟悉的硬件知识,然后工作之余就立马搜集了资料进行学习。了解了RAID的作用和区别以及如何进行挂载之类的。本篇以及之后的一篇博客适合新手小白来初…

8.防火墙

文章目录 防火墙iptables防火墙介绍基础操作高级操作通用匹配隐含匹配端口匹配:--sport 源端口、--dport 目的端口 TCP标志位匹配:--tcp-flags TCP标志位ICMP类型匹配:--icmp-type ICMP类型 显式匹配多端口匹配IP范围匹配:-m ipra…

FPGA_学习_04_Verilog基础语法和Modelsem仿真

前言:对于以前学过C/C/C#的作者来讲,Verilog的基础语法算是特别简单的。本文主要介绍Verilog的基础语法和Modelsem仿真。 Verilog的基础语法 1 模块声明 FPGA开发是以模块为基础的,每个可综合的.v文件都是一个模块,模块由module…

华为云——代码托管的使用

一、打开前后端项目 登录华为云,点击页面右上角的用户名——点击个人设置 2.点击代码托管的HTTPS密码管理,设置自己的密码 3.回到代码仓库,复制HTTP地址 4.打开GitHubDesktop,点击左上角进行仓库克隆 (我这里已经cl…

Redis 介绍相关知识,常用五大数据结构

1.Redis 介绍相关知识 Redis 是单线程多路 IO 复用技术 多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select 和 poll 函数,传入多个文件描述符,如果有一个文件描述符就绪,则…

1米挂幅「社交泛娱乐出海作战地图」预定火爆,免费抢领纸质版

移步【融云全球互联网通信云】回复“地图”免费领 家人们! 融云自制《社交泛娱乐出海作战地图》 首开大捷! 预约已超 300 出海必备实战手册 移步公众号报名 泰火辣~ 已预约进入排队的朋友请耐心等待 后期我们将按照报名顺序依次派送 另外&#…

终于通过啦! 我拿到了阿里云【通义千问】大模型AI测试体验资格啦!

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…

Jmeter的十大组件

1.Jmeter的十大组件以及执行顺序 1.十大组件 测试计划线程组配置元件前置处理器定时器取样器后置处理器断言监听器 2.执行顺序为从测试计划到监听器依次执行 测试计划> 线程组>配置元件>前置处理器>定时器> 取样器> 后置处理器>断言>监听器 3.作用…

leetcode 2130. Maximum Twin Sum of a Linked List(链表的最大孪生和)

给出一个单向链表&#xff0c;第i 个node 和 第(n-1-i)个node称为twin. 0 < i < n/2 - 1 求所有twin的最大和。 链表长度为偶数。 思路&#xff1a; 链表长度为偶数&#xff0c;就省了不少步骤&#xff0c;不用再考虑奇数时中间那个node单独计算了。 直觉上来看&#x…

Servlet编程---Day 06

一、会话技术概述 &#xff08;一&#xff09;什么是会话技术 类似两个人谈话&#xff0c;会话其实就是服务器和客户端的多次请求和响应 一次会话&#xff1a;多次请求和响应 组成了一次会话。从第一次发送请求建立会话&#xff0c;直到一端断开连接 http协议&#xff1a;…

web前端开发需要哪些技术?学前端顺序千万千万不要搞错啦!

宝子们&#xff0c;下午好&#xff0c;之前给大家分享了前端岗位的前景规划&#xff0c;小源看的出来&#xff0c;还是有不少宝子想入行前端的&#xff01; 那除了会面试&#xff0c;还要有充足丰富的知识储备&#xff0c;需要什么技术&#xff0c;怎么样做才能找到高薪工作呢&…

Oracle Profile详解

Profile的作用主要表现在三个方面 1、密码策略 2、对用户所能使用的资源进行管理 3、profile存放在数据字典里面&#xff0c;默认有一个名字为default的profile set linesize 160 set pagesize 30 select resource_name,resource_type,limit from dba_profiles where profile‘…

Node.js 学习系列(四)—— 回调函数

Node.js 异步编程的直接体现就是回调。 异步编程依托于回调来实现&#xff0c;但不能说使用了回调后程序就异步化了。 回调函数在任务完成后就会被调用&#xff0c;Node 使用了大量的回调函数&#xff0c;Node 的所有 API 都支持回调函数。 例如&#xff0c;我们可以一边读取…

ubuntu22.10 ffmpeg-webrtc推拉流srs环境搭建

一、编译ffmpeg-webrtc 二、openssl&#xff0c;opus&#xff0c;x264配置 三、编译srs 四、测试 4.1推流端 4.2拉流端 五、交互与sdp 最近看到杨大佬发的动态&#xff0c;尝鲜体验一下。 一、编译ffmpeg-webrtc ffmpeg-webrtc官网&#xff1a;https://github.com/ossrs/ffmp…

Linux---相关介绍、相关下载、连接Linux系统、虚拟机快照

1. Linux系统相关 内核提供了Linux系统的主要功能&#xff0c;如硬件调度管理的能力。 Linux内核是免费开源的&#xff0c;是由林纳斯托瓦兹在1991年创立并发展至今成为服务器操作系统领域的 核心系统。 内核无法被用户直接使用&#xff0c;需要配合应用程序才能被用户使用…

C++层次遍历(队列结构)

#include <stdio.h> #include <malloc.h> typedef struct ok //树结构 { int data; struct ok *lchild; struct ok *rchild; }bittree; //队列结构 typedef struct d { int head; //头 int tail; //尾 bittree **data; //数组 …

安全狗入选中国网络安全市场全景图多个细项

5月16日&#xff0c;数说安全正式发布《2023年中国网络安全市场全景图》&#xff08;以下简称全景图&#xff09;。作为国内云原生安全领导厂商&#xff0c;安全狗凭借综合且全面的产品与安全实力入选全景图。 数说安全采用科学、遵循市场发展规律且符合客户采购习惯的分类方法…

功能测试4年,5月份被辞退,2023年的功能真的没有出路了

在测试行业摸爬滚打5年&#xff0c;以前经常听到开发对我说&#xff0c;天天的点点点有意思没&#xff1f; 和IT圈外的同学、朋友聊起自己的工作&#xff0c;往往一说自己是测试&#xff0c;无形中也会被大家轻视&#xff0c;总有人会问你&#xff0c;为啥干测试啊&#xff0c…

纯python统计基于orthofinder得到的系统发育树的关注点位置的树型结构

对于某一个物种或某类物种在整个系统发育树中的位置存在一定争议的情况&#xff0c;使用直系同源基因构建单基因树&#xff0c;并对该物种或该类物种所在结构进行统计是可以对争议起到一定的解决作用的&#xff0c;在此留下全套流程和大家交流。 主要分为几步&#xff1a; 使…