前面的文章介绍过PCIe的Gen1和Gen2模式下,物理层使用的是8b/10b的编码。这种编码方式能够实现直流均衡,并且能将数据流中的连0连1控制在5个以内(最多5个连续的1或者0),从而可以降低物理层CDR设计的复杂度。但是8b/10b编码的缺点也很明显:浪费了20%的带宽资源,以PCIe Gen2为例,5GT/s的速率却只有4Gbps的带宽。

注:PCIe的真实带宽还受到TLP包中的非数据内容,DLLP和Ordered Sets,甚至Root端的驱动和应用程序的影响。具体可以参考之前的文章:http://blog.chinaaet.com/justlxy/p/5100062236

本文将简要地介绍PCIe Gen3及以上版本中所使用的128b/130b编码技术。128b/130b编码是以太网中使用的64b/66b的演进版本,关于64b/66b,可以参考:http://blog.chinaaet.com/justlxy/p/5100064750

128b/130b相比于8b/10b,在带宽利用率上有了显著地提升,从80%到98.46%。在评估总线性能的时候,甚至可以忽略不计。与以太网中使用的64b/66b类似,128b/130b编码是在128 bit的Payload前面加上了2 bit的同步头,如下图所示:

该同步头(Sync)为01b时,表示其后面跟的是Ordered Set;为10b是,则表示其后面跟的为非Ordered Set数据。需要注意的是,Byte Striping逻辑会将同步头在每一个Lane上重复(如果有的话,即非x1模式),以便于接收端识别同步头。我们将这2bit的同步头和128bit的Payload,一起称为数据块(Data Block)。在Gen1/2模式下,物理层首先完成位锁定(Bit Lock),然后尝试去完成字节锁定(Byte Lock)。而在Gen3(以及以上版本),物理层完成位锁定之后,会尝试进行块锁定(Block Lock,与Gen1/2的字节锁定对应,Gen3中并没有字节锁定的概念)。

注:当然,完成块锁定需要借助特定的数据流,在PCIe中使用的00h和FFh交替的数据流,即EIEOS(Ordered Set的一种)。

PCIe一共定义了5种类型的Ordered Set:

※ TS1 and TS2 Ordered Set (TS1OS/TS2OS) :用于链路初始化和训练

※ Electrical Idle Ordered Set (EIOS) :用于电气空闲状态

※ FTS Ordered Set (FTSOS) :用于L0s状态到L0状态的切换

※ SKP Ordered Set (SOS) :用于CTC(Clock Tolerance Compensation)

※ Electrical Idle Exit Ordered Set (EIEOS) :V2.0 Spec增加的

※ Start of Data Stream Ordered Set(SDS):仅适用于Gen3及以上版本,当链路准备发送数据流时,会先发送SDS,然后进入L0状态。

需要注意的是,与发送有效数据流(非Ordered Set)不同,发送Ordered Set时,所有的内容都需要在同一时刻在所有的Lane上(如果有的话)同时发送。以FTS为例,如下图所示:

注:几乎所有的Ordered Set的Payload的都是16个字节,但是有一个例外:SOS(SKP Ordered Set),其Payload可以是8,12,16,20或者24个字节。

对于同步头为10b(即非Ordered Set)时,还需要借助Tokens(Gen3及以上版本才有的概念)来区分Payload中的数据的类型是TLP还是DLLP。PCIe Spec一共定义了5种数据结构(即5种Tokens):

※ Start TLP (STP) — followed by a TLP

※ Start DLLP (SDP) — followed by a DLLP

※ Logical Idle (IDLA) — sent when there is no packet activity

※ End of Data Stream (EDS) — Precedes the transition to Ordered Sets

※ End Bad (EDB) — reports a nullified packet has been detected

每种Token的结构如下图所示:

以STP为例:

有人可能有疑问了,128b/130b编码之所在128bit的Payload前面增加了2bit的同步头,严格意义上都不能称之为编码。显然仅仅依靠128b/130b编码根本不可能实现8b/10b编码那样的直流均衡,因为Gen3使用了全新的扰码方式,以达到直流均衡的目标。Gen3的扰码算术表达式如下:

G(x)=x^23+x^21+x^16+x^8+x^5+x^2+1

为了减少各个相邻的Lane之间的干扰,每个Lane使用的扰码种子是不同的,如下表所示:

注:对于x16/x32的应用而言,可以依次重复使用各个Lane的种子,即Lane 8继续使用Lane 0的值,Lane 9使用Lane 1的值,依次类推。

注:与以太网中使用的64b/66b编码类似,128b/130b无法像8b/10b编码那样将连续的0(或者连续的1)限制在较小的范围之内,理论上,128b/130b可能出现的最大的连续0(或者连续1)可以达到128(最坏的情况下)。128b/130b编码只能借助扰码来实现较长时间内的直流均衡。这也是为什么PCIe Gen3的速率仅仅比Gen2的物理传输速率提高了3GT/s,其物理层(主要是CDR)的设计复杂度却增加了很多很多的原因。

注:2bit的同步头不会被扰码,当发送/接收到EIEOS或者FTSOS后,扰码器会重新初始化。除了TS1OS和TS2OS之外的所有的Ordered Set的所有Symbol都不会被扰码,TS1OS和TS2OS的Symbol0不会被扰码,Symbol 1~13会被扰码,而Symbol 14~15是否被扰码取决于扰码器判断扰码或者不扰码,谁更有利于直流均衡。

注:原文最早发表于本人的ChinaAET博客(http://blog.chinaaet.com/justlxy/)

PCIe扫盲——128/130b编码详解相关推荐

  1. pcie握手机制_【博文连载】PCIe扫盲——Ack/Nak 机制详解(一)

    原标题:[博文连载]PCIe扫盲--Ack/Nak 机制详解(一) 前面在数据链路层入门的文章中简单地提到过Ack/Nak机制的原理和作用,接下来的几篇文章中将对Ack/Nak机制进行详细地介绍. A ...

  2. 字符、字符集和字符编码详解(一文扫清疑惑)

    前言 字符.字符集和字符编码时常看见,之前也看过一些博文,看得迷迷糊糊地,看过即忘,今天有幸碰到一篇能让我醍醐灌顶的文章,整理一下相关知识点与大家分享! 原博文地址:字符集编码详解(学习,看一篇就够了 ...

  3. 字符编码详解及由来(UNICODE,UTF-8,GBK)

    字符编码详解及由来(UNICODE,UTF-8,GBK) 各种字符编码方式详解及由来(ANSI,UNICODE,UTF-8,GB2312,GBK) - 2009-01-29 09:53     一直对 ...

  4. Python2.7字符编码详解

    Python2.7字符编码详解 目录 Python2.7字符编码详解 声明 一. 字符编码基础 1.1 抽象字符清单(ACR) 1.2 已编码字符集(CCS) 1.3 字符编码格式(CEF) 1.3. ...

  5. 转1:Python字符编码详解

    Python27字符编码详解 声明 一 字符编码基础 1 抽象字符清单ACR 2 已编码字符集CCS 3 字符编码格式CEF 31 ASCII初创 311 ASCII 312 EASCII 32 MB ...

  6. 可能是最详细的字符编码详解

    Created By JishuBao on 2019-04-02 12:38:22 Recently revised in 2019-04-03 12:38:22   欢迎大家来到技术宝的掘金世界, ...

  7. x.509数字证书编码详解

    转自:http://blog.sina.com.cn/s/blog_49b531af0102eahs.html x.509数字证书编码详解 一. X.509数字证书的编码 X.509证书的结构是用AS ...

  8. 计算机编程种常见的几种编码详解

    计算机编程种常见的几种编码详解 其实计算机编程离不开编码 但是大多数都不能真正全面了解各种编码 今天就来好好和几位编码熟悉熟悉 一.字符.字符集和字符编码方式 字符:字符是抽象的最小文本单位.它没有固 ...

  9. 字符编码详解及利用C++ STL string遍历中文字符串

    作者:非妃是公主 专栏:<笔记><C++> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文 ...

最新文章

  1. ctags: 提示错误ctags: unrecognized option '--format=2'
  2. Activity管理(二):adj内存管理机制
  3. C++中 int char 的相互转换
  4. boost::hana::at用法的测试程序
  5. linux .net core 后台执行,.NET Core基于Generic Host实现后台任务方法教程
  6. 设计模式——代理模式与装饰模式的异同
  7. layoutSubview 总结
  8. 【探索PowerShell 】【二】基本操作
  9. linux查看行数命令 set,Linux显示文件行数之nl命令详解
  10. YOLO算法之车型识别
  11. 照片编辑工具 Affinity Photo for Mac 1.7.1
  12. java删除某些段落word_Java 批量删除Word中的空白段落
  13. 信息化建设中的IT规划精要
  14. hdu 1862 hdoj 1862
  15. 3DTouch的分享
  16. 管理薪酬 穆穆-movno1
  17. 有什么好用的财务分析软件?
  18. 如何查看Linux版本.
  19. 事务隔离级别——未提交读、已提交读、可重复读、串行
  20. 渗透测试|网络安全常用靶场

热门文章

  1. 有什么可以免费pdf编辑软件吗
  2. IOS使用照相机的功能
  3. paip 一千 常用汉字 高频汉字 覆盖率90
  4. 解决驱动器中没有磁盘的问题
  5. 尽吾力,而不能至者,可以无悔矣(NOIP2018游记)
  6. php台阶走两步余一步,【原创BG】嗨,那条龙 CP:阿莱克丝X大王
  7. 卡尔曼(Kalman)滤波算法原理、C语言实现及实际应用
  8. linux 程序怎么执行文件格式,linux汇编之——(1)ELF:Linux可执行程序文件格式
  9. EAN-13 编码原理
  10. ubuntu更换源文件