【一】PCIe基础知识

PCIe采用了点到点通讯方式,全双工,基于数据包传输,其速度随着版本提升而增加。PCIe设备间通过链路连接,采用树形拓扑结构,包括根桥(RootComplex)、交换机(Switch)和终端设备(Endpoint)。PCIe信号定义涉及数据发送和接收的差分线对,以及各种控制信号。事务层负责将上层请求打包成TLP,分为内存读写、配置、IO和消息请求四种类型,每个TLP包含Header、DataPayload和ECRC等字段。文章还介绍了PCIe的配置空间,包括设备ID、命令寄存器等,并阐述了PCIe设备的枚举、链路训练和配置空间分配过程。

一、PCIe概述

1、PCIe速度

  1. PCI采用总线共享式通讯方式;PCIe采用点到点(Endpoint to Endpoint)通讯方式,互为接收端和发送端,全双工,基于数据包传输;
  2. 两个PCIe设备之间的连接称作一条链路(link), 一条链路可以包含多个通道(每对接收和发送对称作一个通道(lane)),可增加通道个数来满足更高的带宽要求。

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

版本 编码方案 传输速率 X1 吞吐量 X4 吞吐量 X8 吞吐量 X16 吞吐量
1.0 8b/10b 2.5GT/s 250MB/s 1GB/s 2GB/s 4GB/s
2.0 8b/10b 5GT/s 500MB/s 2GB/s 4GB/s 8GB/s
3.0 128b/130b 8GT/s 984.6MB/s 3.938GB/s 7.877GB/s 15.754GB/s
4.0 128b/130b 16GT/s 1.969GB/s 7.877GB/s 15.754GB/s 31.508GB/s
5.0 128b/130b 32 or 25GT/s 3.9 or 3.08GB/s 15.8 or 12.3GB/s 31.5 or 24.6GB/s 63.0 or 49.2GB/s

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/130bit7.8769Gb/s = 7876.9Mb/s = 984.6MB/s

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


2、PCIe拓扑结构

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

在这里插入图片描述

  • root complex(RC) 根桥设备,CPU和PCIe拓扑之间的接口,负责PCIe报文的解析和生成。RC会将CPU的request转换成PCIe的4种不同的请求(ConfigurationMemoryI/OMessage);
  • switch PCIe的转接器设备(扩展PCIe端口),为挂在它上的设备(endpointswitch)提供路由和转发服务。
  • 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端口。


3、PCIe信号定义

在这里插入图片描述

  • PETpx、PETnx: 数据发送器差分线对;
  • PERpx、PERnx: 数据接收器差分线对,x代表通道号;
  • PERST#: 全局复位信号有效时(#:低电平有效),PCIe设备将对内部逻辑进行复位操作;
  • REFCLK+、REFCLK-: PCIe参考时钟信号;
  • WAKE#: CPU向PCIe设备提供唤醒请求后,为该PCIe设备提供主电源Vcc;
  • SMCLK: 系统管理总线时钟;
  • SMDAT: 系统管理总线数据;

4、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. 红色部分【事物层】: HeaderData是事务层上层给的信息,事务层给它末尾加 ECRCEnd-to-End CRC, 端到端 CRC)字段,,就构成了一个TLPTransaction Layer Packet);

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

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


二、PCIe事物层

  事务层根据上层(软件层或者应用层)请求(Request)的类型、目的地址和其它相关属性,把这些请求打包,产生TLPTransaction Layer Packet)。

TLP = Request TLP 【请求】 + Completion TLP 【响应】

1、TLP请求

  根据软件层的不同请求,事务层产生四种不同的TLP请求:

  • Memory: 【内存空间访问】,数据在彼此的Memory之间交互, PCIe总线上的主流传输;针对32bit寻址,支持4G的地址空间,针对64bit寻址,支持16G的地址空间;

  • IO:【 IO空间访问】,新的PCIe设备设备的物理空间只支持内存映射(Memory map)到Host主存,存在访问IO空间的TLP,是为了兼顾老设备;PCI最大支持4G的IO空间,但受限于x86处理器IO空间16bits带宽),很多平台将PCI的I

09-07
PCI Express(PCIe)是种高速串行计算机扩展总线标准,用于在计算机内部连接各种组件,如显卡、网卡、存储设备等。 从基本概念来看,PCIe是对传统PCI和PCI-X总线的重大改进。传统的PCI总线是并行总线,在数据传输过程中容易受到信号干扰和时序问题的影响,而且随着频率的提升,这些问题会更加严重,限制了数据传输速率的进步提高。而PCIe采用了串行差分信号传输技术,通过多个差分信号对同时传输数据,有效减少了信号干扰,并且可以通过增加通道数量来提高带宽。 PCIe以“通道(Lane)”为基本单位,每个通道包含对发送差分线和对接收差分线,能够实现双向数据传输。PCIe有不同的版本,如PCIe 1.0、PCIe 2.0、PCIe 3.0、PCIe 4.0、PCIe 5.0等,每个新版本都在数据传输速率上有显著提升。例如,PCIe 1.0每个通道的单向传输速率为2.5Gbps,PCIe 2.0将速率提升到5Gbps,PCIe 3.0达到8Gbps,PCIe 4.0为16Gbps,PCIe 5.0则高达32Gbps。 在系统中,PCIe设备通过根复合体(Root Complex)与CPU和内存进行连接。根复合体是PCIe系统的核心,负责管理和分配PCIe总线资源,协调不同设备之间的数据传输。 在应用方面,PCIe广泛应用于计算机的各个领域。在显卡领域,高端显卡通常采用x16的PCIe接口,以满足其巨大的数据传输需求,确保能够实时处理和传输高分辨率、高帧率的图像数据。在存储方面,NVMe(Non-Volatile Memory Express)固态硬盘通过PCIe接口与主板相连,大大提高了数据读写速度,缩短了系统的响应时间。 在基于FPGA的PCIe接口设计中,可以通过规划相关内容来实现对PCIe的应用。例如,先介绍PCIe的基本概念,再以xilinx提供的例程PIO为例进行仿真、板载测试等,最后承接前面的成果进行DMA的介绍,从而实现基本入门 [^1]。 ```python # 以下是个简单的伪代码示例,模拟PCIe数据传输过程 class PCIeDevice: def __init__(self, lane_count, version): self.lane_count = lane_count self.version = version self.transfer_rate = self.get_transfer_rate() def get_transfer_rate(self): rates = { "1.0": 2.5, "2.0": 5, "3.0": 8, "4.0": 16, "5.0": 32 } return rates.get(self.version, 0) def calculate_bandwidth(self): return self.lane_count * self.transfer_rate # 创建PCIe设备实例 device = PCIeDevice(16, "3.0") print(f"PCIe设备带宽: {device.calculate_bandwidth()} Gbps") ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盗骊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值