PCIe知识指南

大家好,我是广元兄。很高兴和大家分享信号完整性的相关知识。希望大家点赞,分享。有什么问题加微交流学习,微信号【SI_Basic】。

Slogan:一起学习,共同进步!

在现有的电子产品,从消费类产品到高速产品中,PCIe总线作为主要的主板级互连。不同于PCI 并行总线结构,PCIe 使用串行总线结构,端对端的连接模式。

数据从芯片发出,经过事务层,数据链路层,物理层,发出去后,接收端的数据通过物理层,数据链路层,事务层,再到终端设备芯片。

事务层(Transaction Layer)

事务层用于处理数据包的传送管理,是请求和处理信息的基础,这里面有四种地址空间,三种处理类型等,基本信息如下:

当处理器或其他PCIe设备访问PCIe设备时,所传送的数据报文先通过事务层被分发成一个或者多个TLP,之后才能通过PCIe总线送达各个层。

TLP为事务层的数据包,具有一定的格式,有包头,数据负载和可选的摘要。包头里的数据用于对包的管理和控制。

TLP数据传输有一定规则:数据承载量有限制;数据从低字节高位先发送,从左到右

TLP数据负载DW(Double Words)长度,定义如下:

TLP寻址方式:地址,ID识别,间接。

地址寻址主要用于内存和I/O,用于请求和读写等,支持64位和32位地址,I/O只支持32位地址ID寻址主要用于配置请求和信息响应,包含Bus Number,Device Number,Function Number。间接寻址只用于信息请求。

接收端处理机制就是对接收到的经过Data Link Layer 进行数据完整性验证过的TLP进行再处理。无效的包被去除,保留的也会被忽略。

虚拟通道机制Virtual Channel(VC)Mechanism支持整个使用TC标签区分的流量。VC 的基础是有独立的结构资源(队列/缓冲区和相关的控制逻辑), 这些资源用于不同 VC 之间,通过完全独立的流控制跨链路移动信息。这是解决流量控制引起的阻塞问题的关键。 具体的虚拟通道都是由VC ID决定和识别的

每个虚拟通道都有独立的流程控制的缓冲空间,在接收和发送双方,流程控制信息是用数据链路包(DLLP)打包发送,其中的”VC ID”就是用来载送虚拟通道的识别。

每个虚拟通道对应的流程包含6个不同的流程控制,信息如下:

数据链路层(Data Link Layer)

为了确保数据端对端的可靠性,在事务层的TLp Digtest选择性地做ECRC校验,ECRC的初值是FFFF FFFF。说到CRC 这里就有数据链路层,数据链路层为处理层和物理层的中间层,为TLP在链路传递中提供可靠机制。数据链路层的作用:

  • 数据交换
  • 误码检测和重发
  • 初始化和电源管理
  • 生成用于链路管理的DLLP

DLLP(Data Link Layer Packet)用于一个链路上的两个组件之间点对点发送。而TLP 从一个组件传输到另一个组件,可能会通过一个或多个中间组件。

数据完整性检测就是为DLLP和TLP做CRC校验。DLLP使用16bit CRC,而TLP使用的是32 bit的LCRC(Link CRC)。

这个LCRC 和Sequence Number,用于检测错误或者发送过程中丢失的TLP,让源端重新发送,保证数据的完整性。

数据链路层跟踪链路连接状态,同时和事务层以及物理层交换链路状态,并通过物理层完成对链路的管理。

物理层(Physical Layer)

物理层又分为逻辑子层和电气子层两部分。

逻辑子层有两个主要部分:

传输部分,准备从数据链路层传递的传出信息以供电气子层传输;接收部分,在将接收到的信息传递到数据链路层之前对其进行识别和准备。

逻辑子层和电气子层通过状态和控制寄存器接口或功能协调每个收发器的状态。逻辑子层指导物理层的控制和管理功能。

在物理层有两大功能:

一是编码和解码。Gen2,8b/10b编码和解码机制,Gen3,128b/130b。

在传输端,加扰应用于 8b/10b 编码之前的字符。在接收端,对 8b/10b 解码后的字符应用解扰。这里面会有数据加扰功能,加扰功能可以通过多通道链路上的一个或多个线性反馈移位寄存器 (LFSR) 来实现

 当每个链路有多个传输 LFSR 时,它们必须协同工作,在每个 LFSR 中保持相同值(通道到通道输出偏移)。当每个链路有多个接收 LFSR 时,它们必须协同工作,在每个 LFSR 中保持相同的时延值(总偏斜),如下图:

不管它们是如何实现的,LFSR 必须在逐个通道的基础上与数据交互,就好像对于该链路中的每个通道有一个单独的 LFSR,如此处所述。

  • 数据加扰规则如下:
  • COM 符号初始化。
  • 对于除 SKP之外的每个符号,LFSR值提前8个连续移位。
  • 除训练序列命令设置(例如TS1、TS2)和一致性模式中的数据符号(D 代码)外,所有数据符号(D代码)都要加扰, 所有特殊符号(K代码)均未加扰。

  • LFSR (D0-D15) 的初始化值为FFFFh,COM退出,初始化发送端的LFPS,COM进入,初始化接收端的LFPS。
  • 配置/检测过程中默认开启加扰。

第二大功能就是链路初始化和训练(Initialization & Training)。在训练过程中,确认和完成以下内容:

  • 链路宽度(X4,X8……)
  • 链路速率(5Gbps,10Gbps……)
  • 通道互换
  • 极性互换

在训练序列查询期间,接收端将 TS1 和 TS2 有序集的符号 6-15 作为通道极性反转的指示符(D+ 和 D- 交换)。如果发生通道极性反转,则接收到的 TS1 符号 6-15 将为 D21.5,而不是预期的 D10.2。类似地,如果发生通道极性反转,则 TS2 有序集的符号 6-15 将为 D26.5,而不是预期的 D5.2。如果检测到极性反转,接收端必须反转接收到的数据。

发射端不能反转传输的数据。所有通道上的所有 PCIe接收端都需要独立支持通道极性反转。

PCIe链路两端设备所用的Lane可以错序连接,称之为“Lane Reversal”,相同的Lane上,差分信号的极性也可以错序连接,称之为“Polarity Inversion”。

在实际的工作中,会根据这样的功能来捋顺走线,进行版图优化设计:

不同于2.0&3.0三种不同的时钟架构,4.0只给出两种。每个都有一个相关的滤波器功能,可以理解 PLL 带宽/峰值和等效抖动的最坏情况组合。

不同于2.0&3.0三种不同的时钟架构,4.0只给出两种。每个都有一个相关的滤波器功能,可以理解 PLL 带宽/峰值和等效抖动的最坏情况组合。

PCIe参考时钟的架构分为共同时钟和独立时钟架构:

这里面有一个延迟值需要注意,就是数据和 Refclk 之间的累积传输延迟12 ns。Tx和Rx的最大内部传输延迟为2.0 ns

这里面还有一个链路损耗的标准概念,放到PCIe CEM里再讲。

电源管理Power

Power Management PM 除了软件与硬件上的兼容模式,更多的是硬件上管理模式。PCIe设备之间通过功耗管理事件(Power Management Event,PME)来进行通信,同时控制功耗状态的切换。规范文档就定义了PCIe 设备的PM状态:

  • D0状态:Full-on。又分为两个状态:未初始化和活动状态。
  • D1状态:Light Sleep,轻睡眠状态,该状态可选。
  • D2状态:Deep Sleep,深睡眠状态,该状态也可选。
  • D3状态:Full-off,分为两个状态:热状态(电源未切断)和冷状态(电源切断)

在链路训练状态机(Link Training and Status State Machine ,LTSSM)这部分,有三种状态和电源有关:

  • L0 是可以发送和接收数据和控制数据包的正常操作状态。所有的电源管理状态都是从这个状态进入的。
  • L0s是一种省电状态,也允许链路快速进入并从省电状态恢复,没有延迟。
  • L1 也是一种省电状态。L1 状态允许在L0上额外省电,但是需要额外的恢复延迟。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 4
收藏 5
关注 145
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧