加载中...

PCIe信号详解

PCIe信号详解

PCIe简介

PCIe(peripheral component interconnect express)是一种高速串行计算机扩展总线标准,是用于连接高速组件的接口标准。每台台式电脑主板有许多PCIe插槽,可用于添加通用显卡,各种外设卡,无线网卡或固态硬盘等等,PC 中可用的PCIe插槽类型将取决于你购买的主板。

PCIe接口

PCIe的插槽

PCIe 插槽有不同的物理配置:x1、x4、x8、x16、x32。x 后面的数字表示 PCIe 插槽有多少个通道(数据如何传入和传出 PCIe 卡)。PCIe x1 插槽有一个通道,可以以每个周期一位的速度移动数据。PCIe x2 插槽有两个通道,可以以每周期两位的速度移动数据(依此类推)。就像高速一样,有单根道,有2根道的,有4根道的,不过像8根道或者更多道的公路不常见,但PCIe是可以最多32条道的。PCIe属于高速串行点对点双通道高带宽传输,所连接的设备分配独享通道带宽,不共享总线带宽。PCIe有两种存在形式M.2接口通道形式和PCIe标准插槽。

  • PCIe可拓展性强,可以支持的设备有:显卡、固态硬盘(PCIe接口形式)、无线网卡、有线网卡、声卡、视频采集卡、PCIe转接M.2接口、PCIe转接USB接口、PCIe转接Tpye-C接口等。

  • M.2接口通道也是一种PCIe接口,主要插支持M.2的固态硬盘。

  • PCIe接口的总线带宽是按长度划分的PCIe X1、PCIe X2、PCIe X4、PCIe X8、PCIe X16。

  • 满血的雷电3指的是PCIe X4、残血的指的是PCIe X2。带宽不同,支持的速度也是不一样的。

    PCIe配置

PCIe的传输速率

PCIe传输速率

为什么有的PCIe插口和M.2的插口不能共存,那是因为两种插口使用的是同一PCIe带宽通道。当使用其中一个的时候,由于被占用,另一个就失效了。

Link Width这一行,我们看到X1,X2,X4…,这是什么意思?这是指PCIe连接的通道数(Lane)。就像高速一样,有单根道,有2根道的,有4根道的,不过像8根道或者更多道的公路不常见,但PCIe是可以最多32条道的。

两个设备之间的PCIe连接,叫做一个Link,如下图所示:

从A到B,之间是个双向连接,车可以从A驶向B,同时,车也可以从B驶向A,各行其道。两个PCIe设备之间,有专门的发送和接收通道,数据可以同时往两个方向传输,PCIe spec称这种工作模式为双单工模式(dual-simplex),可以理解为全双工模式

SATA是什么工作模式呢?

和PCIe一样,SATA也有独立的发送和接收通道,但与PCIe工作模式不一样:同一时间,只有一条道可以进行数据传输,也就是说,你在一条道上发送数据,另外一条道上不能接收数据,反之亦然。这种工作模式应该是半双工模式。PCIe犹如我们的手机,双方可以同时讲话,而SATA就是对讲机了,一个人在说话,另外一个人就只能听不能说。

回到前面PCIe带宽那张表,上面的带宽,比如PCIe3.0x1,带宽为2GB/s,是指双向带宽,即读写带宽。如果单指读或者写,该值应该减半,即1GB/s的读速度或者写速度。

我们来看看表里面的带宽是怎么算出来的。

PCIe是串行总线,PCIe1.0的线上比特传输速率为2.5Gb/s,物理层使用8/10编码,即8比特的数据,实际在物理线路上是需要传输10比特的,因此:

PCIe1.0 x 1的带宽=(2.5Gb/s x 2(双向通道))/ 10bit = 0.5GB/s

这是单条Lane的带宽,有几条Lane,那么整个带宽就0.5GB/s乘以Lane的数目。

PCIe2.0的线上比特传输速率在PCIe1.0的基础上翻了一倍,为5Gb/s,物理层同样使用8/10编码,所以:

PCIe2.0 x 1的带宽=(5Gb/s x 2(双向通道))/ 10bit = 1GB/s

同样,有多少条Lane,带宽就是1GB/s乘以Lane的数目。

PCIe3.0的线上比特传输速率没有在PCIe2.0的基础上翻倍,不是10Gb/s,而是8Gb/s,但物理层使用的是128/130编码进行数据传输,所以:

PCIe3.0 x 1的带宽=(8Gb/s x 2(双向通道))/ 8bit = 2GB/s

同样,有多少条Lane,带宽就是2GB/s乘以Lane的数目。

由于采用了128/130编码,128比特的数据,只额外增加了2bit的开销,有效数据传输比率增大,虽然线上比特传输率没有翻倍,但有效数据带宽还是在PCIe2.0的基础上做到翻倍。

这里值得一提的是,上面算出的数据带宽已经考虑到8/10或者128/130编码,因此,大家在算带宽的时候,没有必要再考虑线上编码的问题了。

和SATA单通道不同,PCIe连接可以通过增加通道数扩展带宽,弹性十足。通道数越多,速度越快。不过,通道数越多,成本越高,占用更多空间,还有就是更耗电。因此,使用多少通道,应该在性能和其他因素之间进行一个综合考虑。单考虑性能的话,PCIe最高带宽可达64GB/s,PCIe 3.0 x 32对应的带宽,很恐怖的一个数据。不过,现有的PCIe接口SSD,一般最多使用4通道,如PCIe3.0x4,双向带宽为8GB/s,读或者写带宽为4GB/s。

在此,顺便来算算PCIe3.0x4理论上最大的4K IOPS。PCIe3.0x4理论最大读或者写的速度为4GB/s,不考虑协议开销,每秒可以传输4GB/4K个4K大小的IO,该值为1M,即理论上最大IOPS为1000K。因此,一个SSD,不管你底层用什么介质,flash还是3d xpoint,接口速度就这么块,最大IOPS是不可能超过这个值的。

PCIe是从PCI发展过来的,PCIe的”e”是express的简称,快的意思。PCIe怎么就能比PCI(或者PCI-X)快呢?PCIe在物理传输上,跟PCI有着本质的区别:PCI使用并口传输数据,而PCIe使用的是串口传输。我PCI并行总线,单个时钟周期可以传输32bit或者64bit,怎么就比不了你单个时钟周期传输1个bit数据的串行总线呢?

在实际时钟频率比较低的情况下,并口因为可以同时传输若干比特,速率确实比串口快。随着技术的发展,数据传输速率要求越来越快,要求时钟频率也越来越快,但是,并行总线时钟频率不是想快就能快的。

在发送端,数据在某个时钟沿传出去(左边时钟第一个上升沿),在接收端,数据在下个时钟沿(右边时钟第二个上升沿)接收。因此,要在接收端能正确采集到数据,要求时钟的周期必须大于数据传输的时间(从发送端到接收端,flight time)。受限于数据传输时间(该时间还随着数据线长度的增加而增加),因此时钟频率不能做得太高。另外,时钟信号在线上传输的时候,也会存在相位偏移(clock skew ),影响接收端的数据采集;还有,并行传输,接收端必须等最慢的那个bit数据到了以后,才能锁住整个数据 (signal skew)。

PCIe使用串行总线进行数据传输就没有这些问题。它没有外部时钟信号,它的时钟信息通过8/10编码或者128/130编码嵌入在数据流,接收端可以从数据流里面恢复时钟信息,因此,它不受数据在线上传输时间的限制,你导线多长都没有问题,你数据传输频率多快也没有问题;没有外部时钟信号,自然就没有所谓的clock skew问题;由于是串行传输,只有一个bit传输,所以不存在signal skew问题。但是,如果使用多条lane传输数据(串行中又有并行,哈哈),这个问题又回来了,因为接收端同样要等最慢的那个lane上的数据到达才能处理整个数据。

PCI采用总线共享式通讯方式;PCIe采用点到点(Endpoint to Endpoint)通讯方式,互为接收端和发送端,全双工,基于数据包传输;

两个PCIe设备之间的连接称作一条链路(link), 一条链路可以包含多个通道(每对接收和发送对称作一个通道(lane)),可增加通道个数来满足更高的带宽要求。

物理底层采用差分信号(PCI链路采用并行总线,而PCIe链路采用串行总线),一条Lane中有两组差分信号,共四根信号线,而PCIe Link可以由多条Lane组成,可以支持1、2、4、8、12、16、32条;

  • PCIe吞吐量计算方法: 吞吐量 = 传输速率 * 编码方案

  • PCIe1.0传输速率为2.5Gb/s,物理层使用8/10编码(8Bit数据在物理线路上需要10比特传输),PCIe1.0 x 1的带宽 =2.5Gb/s * 8/10bit = 2Gb/s = 2000Mb/s = 250MB/s

  • PCIe2.0传输速率为5Gb/s,物理层使用8/10编码, PCIe2.0 x 1的带宽 = 5Gb/s * 8/10bit = 4Gb/s = 4000Mb/s = 500MB/s

  • PCIe3.0传输速率为8Gb/s,物理层使用128/130编码进行数据传输,PCIe3.0 x 1的带宽 = 8Gb/s * 128/130bit ≈ 7.8769Gb/s = 7876.9Mb/s = 984.6MB/s

Mb/s: 兆比特每秒,指每秒传输的比特位数
MB/s: 兆字节每秒,指每秒传输的字节数量,1MB/s = 8Mb/s

PCIe拓扑结构

PCIe采用树形拓扑结构, 由root complex,switch,endpoint等类型的PCIe设备组成

  • root complex(RC): 根桥设备,CPU和PCIe拓扑之间的接口,负责PCIe报文的解析和生成。RC会将CPU的request转换成PCIe的4种不同的请求(Configuration、Memory、I/O、Message);

  • switch: PCIe的转接器设备(扩展PCIe端口),为挂在它上的设备(endpoint 或 switch)提供路由和转发服务。

  • PCIe endponit(EP): PCIe终端设备,如网卡、显卡等。

  • PCI Express-PCI bridge: 桥接设备,连接其他的PCI总线、PCI-X、PCIe总线。

和PCI并行总线不同,PCIe的总线采用了高速差分总线,并采用端到端的连接方式, 因此在每一条PCIe链路中两端只能各连接一个设备, 如果需要挂载更多的PCIe设备,那就需要用到switch转接器。

Switch扩展了PCIe端口,靠近RC的那个端口,我们叫上游端口(upstream port),而分出来的其他端口,我们叫下游端口(downstream port)。一个Switch只有一个上游端口,可以扩展出若干个下游端口。下游端口可以直接连接Endpoint,也可以连接 Switch,扩展出更多的PCIe端口。

PCIe信号定义

  • PETpx、PETnx: 数据发送器差分线对;

  • PERpx、PERnx: 数据接收器差分线对,x代表通道号;

  • PERST#: 全局复位信号有效时(#:低电平有效),PCIe设备将对内部逻辑进行复位操作;

  • REFCLK+、REFCLK-: PCIe参考时钟信号;

  • WAKE#: CPU向PCIe设备提供唤醒请求后,为该PCIe设备提供主电源Vcc;

PCIe分层结构

  • Transaction Layer:【事务层】负责TLP包(Transaction Layer Packet)的封装与解封装,此外还负责QoS,流控、排序等功能;

  • Data Link Layer:【数据链路层】负责DLLP包(Data Link Layer Packet)的封装与解封装,此外还负责链接错误检测和校正,使用Ack/Nak协议来确保传输可靠;

  • Physical Layer:【物理层】 处理所有的Packet数据物理传输,发送端数据分发到各个Lane传输(stripe),接收端把各个Lane上的数据汇总起来(De-stripe),每个Lane上加扰(Scramble,让0和1分布均匀,去除信道的电磁干扰EMI)、去扰(De-scramble),以及8/10或者128/130编码解码等。

PCIe传输的数据从上到下,都是以packet的形式传输的,每个packet都是有其固定的格式的。

  1. 红色部分【事物层】: Header和Data是事务层上层给的信息,事务层给它末尾加 ECRC(End-to-End CRC, 端到端 CRC)字段,,就构成了一个TLP(Transaction Layer Packet);

  2. 蓝色部分【数据链路层】: 负责在 TLP 中添加一个序列号、LCRC 字段(Link CRC, 链路CRC),构成了一个DLLP包(Data Link Layer Packet);

  3. 绿色部分【物理层】: DLLP下传到物理层,头上加个Start,末尾加个End符号,把这些数据分派到各个Lane上,然后每个Lane上加扰码,经8/10或128/130编码,最后通过物理传输介质传输给接收方。( 解析是一个逆向的过程)

posted @ 2024-08-16 10:50  bujidao1128  阅读(1263)  评论(0编辑  收藏  举报