当前位置: 首页 > news >正文

PCIe扫盲(七)

在这里插入图片描述

系列文章目录


PCIe扫盲(一)
PCIe扫盲(二)
PCIe扫盲(三)
PCIe扫盲(四)
PCIe扫盲(五)
PCIe扫盲(六)
PCIe扫盲(七)


文章目录

  • 系列文章目录
  • 物理层逻辑部分基础(一)
  • 物理层逻辑部分基础(二)
    • x4 Lane
    • x8、x16、x32 Lane
  • 物理层逻辑部分基础(三)
  • 转载链接


物理层逻辑部分基础(一)

  首先,回顾一下,之前看了很多遍的 PCIeLayer 结构图:

在这里插入图片描述

  PCIe 中的物理层主要完成编解码(8b/10b for Gen1&Gen2128b/130b for Gen3 and later)、扰码与解扰码、串并转换、差分发送与接收、链路训练等功能。其中链路训练主要通过物理层包 Ordered Sets 来实现。

  PCIe Spec 将物理层分为两个部分——逻辑子层和电气子层,如下图所示:

  如上图所示,PCIe 物理层实现了一对收发差分对,因此可以实现全双工的通信方式。需要注意的是,PCIe Spec 只是规定了物理层需要实现的功能、性能与参数等,至于如何实现这些却并没有明确的说明。也就是说,厂商可以根据自己的需要和实际情况,来设计 PCIe 的物理层。下面将以 Mindshare 书中的例子来简要的介绍 PCIe 的物理层逻辑部分,可能会与其他的厂商的设备的物理层实现方式有所差异,但是设计的目标和最终的功能是基本一致的。

  物理层逻辑子层的发送端部分的结构图如下图所示:

在这里插入图片描述

  在进行 8b/10b 编码之前,Mux 会对来自数据链路层的数据中插入一些内容,如用于标记包边界或者 Ordered Sets 的控制字符和数据字符。为了区分这些字符,Mux 为其对应上一个 D/K# 位(Data or Kontrol)。

  注:图中还包含了 Gen3 的一些实现,不过这里只介绍 Gen1 & Gen2,并不会介绍 Gen3。如果大家感兴趣的,可以去阅读 Mindshare 的书籍或者参考 PCIe Gen3 的 Spec 。

  Byte Striping 将来自 Mux 的并行数据按照一定的规则(后面会详细地说)分配到各个 Lane 上去。随后进行扰码(Scrambler)、8b/10b 编码、串行化(Serializer),然后是差分发送对。

  其中扰码器(Scrambler)是基于伪随机码(Pesudo-Random)的异或逻辑(XOR),由于是伪随机码,所以只要发送端和接收端采用相同的算法和种子,接收端便可以轻松地恢复出数据。但是,如果发送端和接收端由于某些原因导致其节拍不一致了,此时便会产生错误,因此 Gen1 和 Gen2 的扰码器(Scrambler)会周期性地被复位。

  注:关于 8b/10b 的原理和作用,在我之前的博文中有所介绍。所以接下来的文章中不会重复介绍这些内容,但是会简要地介绍 PCIe 中的 8b/10b 的实现细节和要点。之前的文章地址为:http://blog.chinaaet.com/justlxy/p/5100052814

  物理层逻辑子层的接收端部分的结构图如下图所示:

在这里插入图片描述

  由于 PCIe 采用的是一种 Embeded Clock(借助 8b/10b)机制,因此接收端在接收到数据流时,首先要从中恢复出时钟信号,这正是通过CDR逻辑来实现的。如上图所示,接收端的逻辑基本上都是与发送端相对应的相反的操作。这里就不在详细地介绍了。

物理层逻辑部分基础(二)

  上一篇文章中提到了 Mux 会对来自数据链路层的数据(TLP&DLLP)插入一些控制字符,如下图所示。当然,这些控制字符只用于物理层之间的传输,接收端的设备的物理层接收到这些数据后,会将这些控制字符去除,再往上传到其数据链路层。

在这里插入图片描述

  当然,除了 STPSDPEND 之外,还有一些其他的控制字符,如 EDB(前面的文章详细介绍过)、SKIPCOM 等。如下图所示:

在这里插入图片描述

  前面的文章中提到过 Ordered Sets,其主要用于链路训练等。每一个 Ordered Set 都是按照 DW 对齐的(即四个字节),且 Ordered Set 开头也是一个叫做 CommaCOM)的 K 字符(控制字符),随后包含一些 K 字符或者 D 字符(数据字符)。

  对于只有一个 LanePCIe 设备来说,Byte Striping 并没有什么卵用,其主要用于多个 Lane 的数据流分配。x1(一个 Lane)和 x88Lane)的例子分别如下两张图所示:

在这里插入图片描述
在这里插入图片描述

  除此之外,还有一些其他的规则,主要是针对 Mult-Lane 的,对于一个 Lane 并没有什么影响:

在这里插入图片描述

x4 Lane

  x4(4 个 Lane)需要遵循以下的规则:

  • STP and SDP characters are always sent on Lane 0.

  • END and EDB characters are always sent on Lane 3.

  • When an ordered set such as the SKIP is sent, it must appear on all lanes simultaneously.

  • When Logical Idles are transmitted, they must be sent on all lanes simultaneously.

  • Any violation of these rules may be reported as a Receiver Error to the Data Link Layer.

  如下图所示:

在这里插入图片描述

x8、x16、x32 Lane

  对于 x8x16x32 需要遵循以下的规则:

  • STP/SDP characters are always sent on Lane 0 when transmission starts after a period during which Logical Idles are transmitted. After that, they may only be sent on Lane numbers divisible by 4 when sending back‐to‐back packets (Lane 4, 8, 12, etc.).

  • END/EDB characters are sent on Lane numbers divisible by 4 and then minus one (Lane 3, 7, 11, etc.).

  • If a packet doesn’t end on the last Lane of the Link and there are no more packets ready to go, PAD Symbols are used as filler on the remaining lane numbers. Logical Idle can’t be used for this purpose because it must appear on all Lanes at the same time.

  • Ordered sets must be sent on all lanes simultaneously.

  • Similarly, logical idles must be sent on all lanes when they are used.

  • Any violation of these rules may be reported as a Receiver Error to the Data Link Layer.

  x8 的例子如下图所示:

在这里插入图片描述

  发送端的扰码器(Scrambler)有一个 16-bit 的线性反馈寄存器(LFSRLinear Feedback Shift Register),其实现了以下这个多项式:

在这里插入图片描述

  具体的功能框图如下图所示:

在这里插入图片描述

  关于扰码器(Scrambler)还需要遵循以下这些规则:

  • 不同的 Lane 的扰码器必须是同步操作的;

  • 扰码器只对 TLPDLLP 中的 D 字符(数据字符)以及逻辑空闲字符(00H,Logical Idle)作用,并不作用于 K 字符(控制字符)和 Ordered Set 中的 D 字符(如 TS1、TS2 等);

  • 兼容性测试字符(Compliance Pattern Characters)并不被扰码;

  • COM 字符(一种控制字符,不会被扰码)可用于使发送端和接收端的扰码器中的 LFSR 同时被初始化为 FFFFH

  • 扰码器默认时被使能的,但是 PCIe Spec 允许将其临时禁止,以用于测试用途。

  PCIe 中用到的 K 字符(控制字符)如下表所示:

在这里插入图片描述

  其对应的 8b/10b 编码如下表所示:

在这里插入图片描述

  注:其中 PAD 字符主要用于 Mult-Lane 中,当一个包的长度比较短,有的 Lane 可能就没有数据可以发了,这时候可以用 PAD 字符来填充。如本文的 x8 的例子所示。

  Ordered Sets 主要用于链路管理(Link Management)功能。对于 Gen1 和 Gen2 的 PCIe 来说,所有的 Ordered Set 都以 COM 作为开头。Ordered Sets 是在每个 Lane 上同步发送的,即每一个 Lane 都会同时的发送相同的 Ordered Sets,因此,Ordered Sets 也可以被用于 Lane De-skewing。除了链路训练之外,Ordered Sets 还被用于时钟容差补偿(Clock Tolerance CompensationCTC)以及更改链路功耗状态(Changing Link Power States)等。

  注:关于 CTC,可以参考 PCIe Base Spec V2.0 第 4.2.7 节相关内容。后续也会单独写一篇博文,来详细地介绍弹性缓存(Elastic Buffer)与 CTC

  对应的,主要有以下几种 Ordered Sets:TS1 and TS2 Ordered Set (TS1OS/TS2OS)、Electrical Idle Ordered Set (EIOS)、FTS Ordered Set (FTSOS)、SKP Ordered Set (SOS) 和 Electrical Idle Exit Ordered Set (EIEOS)。

  注:关于链路管理以及 Ordered Sets 等详细内容,会在后续的博文中介绍。

物理层逻辑部分基础(三)

  这一篇文章来继续聊一聊接收端物理层逻辑子层的实现细节。回顾一下之前的那张图片:

在这里插入图片描述

  其中的一个 Lane 的具体逻辑如下图所示:

在这里插入图片描述

  其中,Rx Clock Recovery 从输入的串行数据流中提取出 Rx Clock 。当 Rx Clock 稳定在 Tx Clock 的频率上(Rx Clock locked on to the Tx Clock Freq)时,我们就称接收端取得了 Bit Lock

  如果链路(Link)处于低功耗状态(比如 L0s 或者 L1)时,接收端此时会失去同步(即 Losing Bit Lock)。为了避免物理层认为这是一个错误(异常),发送端会发送一个电气空闲命令集(Electrical Idle Ordered SetsEIOS)通知接收端,即将进入低功耗状态。此时,接收端会临时关闭(De-gate)其输入。

  注:这里的关闭(De-gate)并非是直接关闭输入端口,只是暂时不对输入端口上的数据进行处理。

  当发送端需要唤醒链路(Link)时,会首先发送一定数量的 FTS Ordered Sets,并重新取得 Bit LockSymbol Lock

  接收端的链路 De-Skew 逻辑如下图所示:

在这里插入图片描述

  Gen1Gen2PCIe 采用 COM 字符来进行 De-Skew,如果 COM 没有同事出现在每个 Lane 上,那么先到达的 COM 会被延时一会,以实现 Lane 的同步。很显然,这种机制只能校正比较小的 Skew,也就是说 Lane-to-Lane 的 Skew 有一个最大值,超出这个最大值,De-Skew 也无能为力了。如下表所示:

在这里插入图片描述

  接收端的 8b/10b 解码器结构如下图所示:

在这里插入图片描述

  以下情况,被认为是编码冲突(Code Violation),即该字符在传输过程中发生了错误:

在这里插入图片描述

  关于解扰码器(Descrambler)和 Byte Un-striping 都比较简单了,这里就不在详细地介绍了。具体可以参考 PCIe Spec 的相关内容。

转载链接

  1. 物理层逻辑部分基础(一)
  2. 物理层逻辑部分基础(二)
  3. 物理层逻辑部分基础(三)

  
 


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 探秘淘宝商品详情原数据:主图与数据的神秘获取之旅
  • 【计算机毕业设计】五台山景点购票系统 ——后附源码
  • 【Git】常见命令(仅笔记)
  • 深度剖析iOS渲染
  • SpringCloud的学习(二),Consul服务注册与发现、分布式配置,以及 服务调用和负载均衡
  • linux 解压缩
  • 商务标的流程
  • C#-__DynamicallyInvokable
  • C++第七节课 运算符重载
  • Math Reference Notes: 微积分概述
  • kettle 数据库迁移 使用分页原理实现 数据库mysql
  • Oracle SQL injection(SQL注入)
  • 4款AI生成PPT工具推荐,提升工作效率
  • 安卓沉浸式状态栏遇到的问题
  • 【已解决】Chrome浏览器被2024年新版流氓软件劫持,总会自动打开hao.360.com和so.com主页
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • bearychat的java client
  • docker-consul
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Java教程_软件开发基础
  • maya建模与骨骼动画快速实现人工鱼
  • React+TypeScript入门
  • SpiderData 2019年2月25日 DApp数据排行榜
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Vue--数据传输
  • 测试开发系类之接口自动化测试
  • 二维平面内的碰撞检测【一】
  • 欢迎参加第二届中国游戏开发者大会
  • 今年的LC3大会没了?
  • 七牛云假注销小指南
  • 设计模式走一遍---观察者模式
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 线上 python http server profile 实践
  • 想写好前端,先练好内功
  • nb
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​香农与信息论三大定律
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #《AI中文版》V3 第 1 章 概述
  • #git 撤消对文件的更改
  • #laravel 通过手动安装依赖PHPExcel#
  • (1)svelte 教程:hello world
  • (2.2w字)前端单元测试之Jest详解篇
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)计算机毕业设计高校学生选课系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (原創) 未来三学期想要修的课 (日記)
  • .Net MVC + EF搭建学生管理系统
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net 流——流的类型体系简单介绍