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

PCIe学习笔记

本篇参考:https://blog.csdn.net/membre_non/article/details/139069552?spm=1001.2101.3001.10796
https://blog.csdn.net/TurboTab/article/details/130328213
https://blog.csdn.net/2402_87288810/article/details/147571295
书籍:《PCI Express Base Specification Revision 3.0》
           《PCI Express 体系结构导读》
论文:《基于FPGA实现的GPU异构通信设计与研究》

一、 简介

PCIE是新一代的总线接口,它取代了传统的PCI、AGP等总线接口,具有更高的得数据传输速率、更低的延迟和更好的扩展性,广泛应用于计算机内部的各种连接、如网卡、显卡、固态硬盘等

1.1 特点:

串行传输:PCIe采用串行传输方式,将数据分成多个位流在不同的路线上同时传输,通过差分信号来传输数据能够有效减少信号干扰,提高传输的稳定性与可靠性
点对点连接:每个设备都通过专用的链路与主板上的 PCIe 控制器直接相连,形成点到点的连接,避免了传统总线共享式架构中的数据冲突问题,提高了数据传输的效率和带宽利用率
基于数据包的传输:数据以数据包的形式进行传输,每个数据包包含了地址、数据和控制信息等,PCIe 控制器负责对数据包进行解析和路由,确保数据能够准确地传输到目标设备。
全双工传输:PCIe
是全双工协议,与SATA不同。SATA协议是半双工,不能同时收发数据。PCIe是全双工,可以同时收发数据

版本速率 (GT/s)编码单 lane 有效带宽 (GB/s)x4 总带宽 (GB/s)x16 总带宽 (GB/s)
PCIe 1.020032.58b/10b0.251.04.0
PCIe 2.0200758b/10b0.502.08.0
PCIe 3.020108128b/130b0.9853.9415.8
PCIe 4.0201716128b/130b1.977.8831.5
PCIe 5.0201932128b/130b3.9415.863.0
PCIe 6.0202264PAM4+FLIT7.8831.5126

1.2 PCIe拓扑

Root Complex:直接连接CPU,把 CPU/内存子系统接到 PCIe 世界
Switch:必须挂在 RC 或另一个 Switch 的下游,拓展PCIe接口

1.3 PCIe 分层结构

本小结内容在本篇的 五、PCIe设备层次 中详解

PCIe一共可分为三层,事物层,数据链路层,物理层,应用层凌驾于事物层。
应用层:BAR空间设计、DMA设计、组包、解包、缓存、仲裁
事物层:负责TLP包的产生与解析、协议流控、多种TLP报文仲裁、服务质量(QoS)
数据链路层:负责DLLP数据包的产生与解析、错误检测与修正(也称Ack/Nak 协议)、电源管理
物理层:字符序列包产生与解析数据继续加扰解扰、编码、串化/解串、通过差分电平发送和接收

注意:TLP、DLLP、字符序列三者并不是包含关系而是封装关系;它们的功能是相互独立的,TLP关注传输什么数据(业务数据)、DLLP关注如何可靠传输数据(链路管理)、字符序列关注物理信号如何传输(电气特性)

VC虚拟通道作用:
1.给不同“服务质量”的数据一条互不干扰的专用通道
2.让交换机/Root Port 可以做真正的优先级仲裁
3.给高阶场景(SR-IOV、多功能设备、实时音频/视频、TSN)提供确定性带宽

1.4 PCIe 配置空间

本小结内容在本篇的 六·、配置空间 中详解

PCIe配置空间是PCIe设备内部的一组寄存器,用于配置管理和识别设备;位于设备内部,是设备的“身份证”和“控制面板”

作用:
识别设备:厂商ID、设备ID、类代码、版本ID
设备控制:命令寄存器、状态寄存器
资源分配:BAR(基地址寄存器)、中断配置
电源管理:电能源状态控

二、IP核简介/配置空间

Vivado一共包含三种IP核

第一种:7 Series Intergrated Block for PCI Express,最底层IP,包含物理层、数据链路层、不包含事物层、不包含DMA,需要用户做AXI,TLP,DMA,BAR,MSI中断,开发难度大
第二种:AXI Memony Mapped To PCI Express
第三种:XDMA,开发难度小

pcie_cfg_fc:流量控制,与优先级有关
pcie2_cfg_msg_rcvd:用于兼容传统中断
user_clk_out:用户时钟,GT触发器中的user clk2
user_lnk_up:PCIE的连接指示信号
user_app_rdy:表示用户借口可以通信
m_axis_rx:PCIe 链路 → IP 核 → m_axis_rx → 用户逻辑
s_axi_tx:用户逻辑 → s_axis_tx → IP 核 → PCIe 链路
pipe_clock:时钟
sys_clk:来自GT bank的专用时钟

配置步骤一
配置步骤二
配置步骤三

默认DMA占用的BAR空间为BAR0,64bit不要勾选,使用默认32bit,64bit与32bit决定TLP头长度的3个DW还是4DW;

配置步骤四

TLP包的最大负载(携带的数据大小)建议为512bytes,,性能为hight
电脑默认的TLP包的负载为256bytes,一是防止一个包长时间占用带宽,二是防止包出现误码

配置步骤五

取消传统中断,开启MSI中断

2.1 应用示例PIO分析

接下来打开示例工程:

PIO示例工程

进入示例工程:

顶层模块:xilinx_pcie_2_1_ep_7x
├── pcie_7x_0_support_i(支持层,用于处理硬件相关的初始化、链路训练等)
│   ├── pcie_7x_0_pipe_clock(时钟管理模块、为PCIE的PIPE提供稳定时钟)
│   └── pcie_7x_0_i(PCIE IP 核心、负责事物层处理)
└── app(用户应用层)
    └── PIO(PIO 模块,Programmed Input/Output,负责简单的BAR空间相应)
        ├── PIO_EP_inst:负责与 PCIE IP 接口对接
        │   ├── EP_MEM_inst:处理 BAR 空间内存访问
        │   │   └── EP_MEM:具体内存访问实现
        │   ├── EP_RX_inst:接收引擎(解析接收数据)
        │   └── EP_TX_inst:发送引擎(构造发送数据)
        └── PIO_TO_inst:超时控制模块

三、TLP报文

前置知识:
虚拟通道(
virtual channel):提供多条独立的逻辑通道,以便在不同类型的数据流之间提供隔离和服务质量(QoS);在PCI-E的传输中,有各种各样的数据流,既有很重要的数据流,又有不重要的数据流。那么对于重要的数据流就需要快速的传输,对于不重要的数据流可以暂存传输。因此设计出不同的虚拟通道,每个虚拟通道的优先级不同,在CPU发送数据的时候,将重要数据发送到优先级高的VC中,这样重要数据就可以优先发送。但实际中,一般只有一个VC;层次位于事务层。

流控(Flow Control):确保发送方不会发送超过接收方缓冲能力的数据,从而避免数据丢失和重传
两者的关联:每个虚拟通道都有自己独立的流控信用.因此流控是以每个虚拟通道为基础进行的,虚拟通道的使用依赖于流控机制来管理每个通道的缓冲区

3.1 TLP包分类

TLP包最常见的两种分类方式是按用途分类:请求TLP包、完成TLP包按完成特性分类:posted、non-posted

3.1.1 按功能用途分类

请求TLP包:
  1)内存操作:
       
内存读请求(MemRd)                    需要完成包
        内存写请求(MemWr)                    不需要完成包
        原子操作请求:                            需要完成包

  2)配置操作:
        Type0 配置读/写(CfgRd/Wr0)       需要完成包   
        Type1 配置读/写(CfgRd/Wr1)       需要完成包

  3)IO操作(逐渐淘汰):
        IO读请求(IORd)                           需要完成包
        IO写请求(IOWr)                           需要完成包 
 
  4)消息操作:                                 
        消息请求(Msg)、                          不需要完成包
        带数据请求(MsgD)                       不需要完成包

完成TLP包:
       无数据完成(Cpl)         用途:确认写操作完成        
       带数据完成(CplD)      用途:返回读请求数据
       带锁完成(CplLk)        用途:原子操作完成

3.1.2 按完成特性分类

Posted事务:
      特点:邮递事务,像以前邮差送信一样,只管投递,邮寄方不知到是否邮寄到,也就是说不需要特地返回去告诉邮寄方,即发送后无需等待完成包
      延迟:低
      可靠性:发送方不知道操作是否成功
      包含类型:MemWd,Msg,MsgD
      使用场景:大数据传输,实时性要求高
Non-Posted事务:
      特点:
非邮递事务,不像邮差送信。发送后需要等待完成包
      延迟:高(需要往返)
      可靠性:有确认机制
      包含类型:MemRd、CfgRd\Wr、IORd\Wr
      使用场景:控制操作,需要确认传输

3.2 TLP 报文头格式

3.2.1 简介

当两个PCIe设备需要通信时,数据报文需要先通过事务层封装成TLP报文才能通过PCIe各层有序的发送出去

TLP报文基本格式

Prefix:可选项,目的是扩展目的是扩展 Header 从而支持 PCIe 规范  中的新功能;Prefix 分为 EP-EP TLP Prefix 和 Local TLP Prefix 两大类。其中,EP-EP TLP Prefix  用于发送和接收各设备之间传递的消息,Local TLP Prefix 则是在 PCIe 链路的两端进行消息传递
Digest:可选项,它关系到传输层是否做ECRC校验来加强数据端对端的可靠性;其长度为1DW(4Byte),Digest 由Header决定是否启用。
Payload:长度可变,最长为1024DW,最短可为0DW;有些TLP包请求需要等待返回数据,比如MemRd、CfgRd/Wr0、CfgRd/Wr1、IORd/Wr;有些并不需要,比如MemWr、Msg等
Header:涵盖了PCIe路由信息、事务类型等关键信息;不同作用的header长度不同,一般由3~4DW组成,第一个DW是TLP包的通用的,剩余的2~3DW由第一个DW中的字段决定

3.2.2 TLP包的第一个DW

Fmt[2:0] 表明该TLP包是否携带数据,Header是3DW还是4DW的,所有的读请求TLP都不携带数据(因为是获取数据,只需要指明要读的地址和长度);写请求的TLP带数据(因为是要提供数据);完成TLP包可能带数据,可能不带数据(响应读请求时带数据,响应写请求时不带数据)

Fmt[2:0]HeaderPaylaod
000b3DW
001b4DW
010b3DW
011b4DW
100bPrefix(PCIe4.0+) 

对于内存读写TLP包想要访问的目标设备的物理地址为32位使用3DW头(地址占用1DW)、64位地址使用4DW头(地址占用2DW)
对于配置读写TLP包总是使用3DW头(因为配置空间使用的是ID路由,不需要太长地址)
对于
完成TLP包总是使用3DW头(因为使用ID路由);Clp包不带Payload,ClpD带Payload
对于
IO读写总是使用3DW头(因为IO空间32位地址足够);IORd不带数据,IOWr带数据

Type[0:4] 与Fmt字段共同决定了TLP的事务类型、Header部分的大小以及整个TLP是否承载有效数据载荷的情况

Type与Fmt字段说明

R(Reserved)保留字段,默认为0
TC[2:0]  表示当前传输等级(Traffic Class,流量类别)共有8个级别(TC0~TC7,默认值为TC0,TC7优先级最高),用于实现PCIe的QoS机制在许多消费级处理器系统中,Root Complex通常只配置一个虚拟通道(VC0),多数端点设备(EP)也默认只使用VC0。在这种情况下,即使EP发送不同TC值的TLP,由于所有TC都被映射到同一个VC0,实际上无法实现基于VC的优先级区分
Attr[2],Attr[1:0]  属性(Attrbiute),Attr[2]:表示该 TLP 是否支持 PCIe 总线中的 ID-based Ordering;Attr[1]:表示是否支持 Relaxed Ordering;Attr[0]:表示该 TLP 在经过 RC 到达存储器时,是否需要进行 Cache 一致性处理。
当 PCIe 协议使用强序模型,在整个数据传输过程中,若接收端处理的 TLP 类型相同,则后面的TLP必须等前面的TLP处理完才能继续进行处理,一旦当前TLP发生阻塞,后面同类型的TLP也会被阻塞,该模型下只允许不同类型的TLP在同一条PCIe线路上乱序传输(比如读512KB个字节,分程两个包传回,两个包的顺序不被打乱);
当 PCIe 协议使用Relaxed Ordering 模型,乱序传输的条件被适度放宽,后面的TLP可以绕过前面相同类型的TLP提前处理,从而避免堵塞,提高总线的利用率;ID-based Ordering 模型是一种序模型,该模型与数据传输的流量相关,常用于总线的流量控制

TH(TLP Processing Hint)字段:该字段为1表示该TLP包含了提示信息,发送端可以使用提示信息,提前公布数据的特性,有助于接收端更好地预读和管理数据,  进而减少处理延时,缓解流量拥塞的情况。
TD(TLP Digest)字段:该字段表示TLP启用1DW的ECRC
EP(Poisoned Data)字段:该字段表示当前数据包是否可用,为1则表示数据已中毒,接收者应丢弃数据;为0则数据可靠,可以使用
AT(Address Type)字段:该字段主要用在总线间的地址转换,可用于不同PCI总线域之间的转换,目的是为了多个虚拟主机可以共享一个PCIe设备
Length[9:0] 10位,表示负载的数量0~1024;
     ①TLP 数据必须按4字节自然对齐,并以4字节双字 (DW) 为增量 
     ②设备在发送带数据的TLP(如内存写请求 MWr)时,单个TLP的数据载荷长度绝对不能超过该设备自己的 Max_Payload_Size (位于本篇2.1节配置步骤四)寄存器设置的值(按 DW 计算)
     ③TLP 数据载荷中的字节排列顺序,就是这些字节在内存地址空间中从低地址到高地址的自然顺序

Last DW BE[3:0]与First DW BE[3:0] BE为字节使能,用来指示一个 DW 中的4个字节里,哪些字节是有效的、需要被读写的;在一个内存读写请求TLP中,数据载荷(如果有的话)总是以 DW 为边界进行对齐和传输的。但实际软件想要读写的内存区域,其起始地址和结束地址很可能不是 DW 对齐的,并且长度也不一定是 DW 的整数倍

例如:要从起始地址0x1003写入6个字节的,0x1003并不是DW的倍数,它落在 DW 0x1000 - 0x1003 的最后一个字节上,要写入的 6 个字节,覆盖的地址范围是 0x10030x1008,也就是跨了3个DW。


①PCIe是如何打包这6个字节的数据给到接收端呢?
PCIe会找到包含起始地址 0x1003 的那个 DW 对齐的基地址,即 0x1000;计算需要多少个DW才能覆盖从0x10000x1008的范围。答案 3个DW;所以MWr请求的TLP会携带3个DW,尽管实际只想写其中连续的6个字节


②接收端怎么知道这 12 个字节里,只有 0x10030x1008 这 6 个字节是有效的,其他的不应该被写入呢?

这时Last DW BE与First DW BE将发挥作用,在携带的3DW中,First DW BE字段作用于第一个DW,Last DW BE字段作用于第三个DW(左右一个DW)

在地址0x1000,0x1001,0x1002,0x1003中,地址0x1003对应的地址的数据有效,而0x1000,0x1001,0x1002地址对应的数据无效,也即是说携带的数据中的第一个DW的低三个字节无效,最高位字节有效,所以First DW BE=1000
同理可知所携带3个DW中的最后一个DW中的低字节有效(对应地址0x1008),所以Last DW BE=0001

3.3 不同类型TLP包

3.3.1 存储器读写请求报文

内存读写

发送端发送内存读请求的TLP包给到接收端,接收端必须返回一个完成的TLP包,如果TLP包携带数据(CplD),说明读到了数据;如果返回的为不带数据的TLP包则读出错。
发送端发送内存写请求的TLP包给接收端,接收端无需返回TLP包,(MWr为邮递事务)。
对于内存读写请求的TLP包,TLP包是3DW还是4DW取决于要访问的目标设备的物理地址为多少位

目标设备为不同位的物理地址内存读写请求TLP包

Transaction ID字段由Requester ID和Tag共同构成 ,  Requester ID字段表征了生成该报文的 PCIe 设备的 Bus Number(总线号)、Device  Number(设备号)和 Function Number(功能号)
在实际应用中,存储器写请求的TLP虽然存在该字段且常常设置为有效,但并不是必须的,因为接收端并不需要做出反馈。而对于以Non-posted方式处理的读请求,该字段则是必须的,因为接收端需要生成完成报文发给发送端。由于PCIe总线中,以 Non-posted 方式处理的数据请求皆需要等到对应的完成报文才算结束当前的数据传输。
Tag字段决定了发送端可以缓存同一 类型 TLP 的数量,为了避免报文混乱的情况,开发者需要管理好该字段,使当前PCI域不会存在两个及以上Transaction ID一模一样的TLP(比如读512KB个数据,分成两个TLP包读回,这两个TLP包的Tag字段用于区分并依据Tag字段给TLP包排序)。
Address字段为接收端设备(目标设备)内存映射空间中的物理地址

3.3.2 完成报文

完成报文一般由Predix、Header、Payload 构成,但MWr,IOWr,CfgWr不需要Payload部分;完成报文是接收端对发送端的一种反馈。

完成报文Headerg格式

完成报文Header总是3DW的,(因为使用ID路由),
Requester ID 字段和 Tag 字段由之前解存储器读请求TLP时保存的Transaction ID直接赋值。
Completer ID 字段用用来存放该完成报文发送方的 ID 信息

status字段

3.3.3 配置请求报文

一般由RC发起配置请求TLP访问各个PCIe设备的配置空间,非RC设备不能发起配置空间请求去访问其他设备的配置空间
RC发起配置请求的时机一般包括:系统启动阶段 - 设备枚举、操作系统初始化阶段
PCIe配置请求TLP采取ID路由,并支持Type 0和Type 1的配置请求       

配置请求报文Header格式

Bus  Number、Device Number 和 Function Number 用来存放配置请求 TLP 想访问的目标设备  的 ID 信息

3.3.4 消息请求报文

消息请求报文基本使用隐式路由。中断消息报文、错误消息报文、电源管理消息报文、锁定事务消息报文、插槽电源限制消息报文以及供应商定义消息报文是 PCIe 协议中常见的六种消息请求报文。除了最后一种消息报文会使用到 Header 中第 3、4DW,  其余的消息报文都无需该字段,即 Header 只拥有两个DW的长度。

消息请求报文Header格式

3.4 如何收发

MRd\MWr报文有Requester ID字段,Cpl报文中有Requester ID与Completer ID,CfgRd/CfgWr报文中有Requester ID与Bus Number、Device Number、Function Number (BDF),这些字段起着路由的作用

举例:
设备A为发送端,设备B为接收端
①配置请求(A设备读取B设备的配置空间)
    A的TLP中的 Requester ID=A的BDF、而TLP包中的Bus Number,Device Number,Func Number为B的BDF;A的配置请求的TLP给到B后,B会给A一个带有数据的TLP完成包,B的TLP包Completer ID为B的BDF,TLP包中的Requester ID为A的BDF,而B的TLP包携带的数据为厂商ID与子厂商ID
②内存读请求(A设备读取B设备的内存空间) 
    A的TLP中的 Requester ID=A的BDF,给到B后,B会给A一个带数据的TLP包,B的TLP包Completer ID为B的BDF,TLP包中的Requester ID为A的BDF,而B的TLP包携带的数据为读取的内容

对于A设备读取B设备空间时,A的配置空间读TLP包中的Bus Number,Device Number,Func Number字段,A设备是如何知道的?
设备A(通常是Root Complex)并不是一开始就知道B的BDF,而是通过一个系统性的枚举过程来发现和分配BDF的

四、路由方式

PCIe的路由方式有三种,分别为 基于地址的路由(Address-Based Routing)、基于ID的路由(ID-Based Routing)、隐式路由(Implicit Routing)

4.1 基于地址的路由

简介:基于地址的路由用于内存读写请求(MRd/MWr)和原子操作请求(AtomicOp Requests)。这种路由方式使用TLP头中的地址字段(32位或64位)来确定目标位置。
工作原理:当TLP被发出时,其头中包含目标内存地址。PCIe交换机根据其配置的路由表检查该地址,确定该TLP应该从哪个出口端口转发。路由表通常由系统软件在启动时配置,记录了不同地址范围对应的出口端口

4.2 基于ID的路由

简介:基于ID的路由使用TLP头中的总线/设备/功能号(BDF)来路由。这种路由方式用于配置请求(Configuration Requests)和完成包(Completions)。
工作原理:每个PCIe设备都有一个唯一的BDF标识符(由总线号、设备号和功能号组成)。当TLP使用ID路由时,其头中包含目标设备的BDF。PCIe交换机根据BDF中的总线号确定出口端口,因为每个端口都关联一个总线号范围。

4.3 隐式路由

简介:隐式路由仅用于某些消息TLP(Message TLPs)。这种路由方式不依赖于地址或BDF,而是根据TLP的类型(Message Code)来确定路由路径。隐式路由是指从下游端口到上游端口进行数据传递的使用路由方式,或者用于RC向EP发出广播报文
工作原理:隐式路由的TLP没有明确的地址或BDF字段,而是由TLP头中的消息类型指示其应该被发送到根复合体(例如,用于错误报告、电源管理事件等)。交换机识别这些TLP类型,并自动将其向上游(RC)转发

五、PCIe设备层次

PCIe一共分为三层,从上到下依次为事务层,数据链路层,物理层,凌驾于事物层之上的是设备核心层或软件层(Device Core/Software Layer)

PCIe 层次

5.1 设备核心层

设备核心层并不是 PCIe 协议规范中所定义的一个层级,但其位于事务层的上方,是所有请求的源头或目的地。设备核心层为事务层提供了需要发送的请求信息,其中的信息包括事务类型、地址、需要传输的数据量等

5.2 事务层

为了响应来自软件层的请求,事务层生成出站数据包(outbound packet);事务层也会检查入站数据包(inbound packet),并将入站数据包内包含的信息向上转发给软件层。
当 TLP 途经发送方各层次时,各层次分别会向数据包中添加一些信息,逐层包裹组包;接收方各层次会分别根据对应层所添加的信息来进行拆包和校验。

TLP包

5.3 解包/组包

组包:
①事务层会根据软件层的要求组包,TLP必须含有Header,但可能没有数据
②事务层可选择向TLP包中添加ECRC(End to End CRC,端到端循环冗余检测)字段,用于事务层错误检测
③数据链路层向数据包中添加序列号(Sequence Number)和 LCRC(Link CRC, 链路CRC) ,LCRC被用于数据链路层错误检测
④物理层向数据包中添加特定的字段,例如Start和End字段

组包

解包:
①物理层将确认当前比特流中是否存在正确的Start、End或者其他字段,并将它们剥除,然后将剥除了这些字段后的数据包转发给数据链路层
②数据链路层将进行 LCRC 以及序列号的校验。如未发现错误,那么数据链路层将会把 LCRC 和序列号从数据包剥除,并将其转发给事务层
③事务层的处理存在需考虑以下情况:如果接收方是一个switch,事务层将从TLP的首部中获取路由信息并确定这个数据包要被转发到哪一个端口,此时switch可以选择对这个 TLP 进行 ECRC校验并及时汇报错误,但是switch无权更改TLP中的ECRC字段;如果接收方是TLP 的目的设备,且ECRC校验正确,事务层将剥除 ECRC 字段并将剩余部分转发给设备核心层

解包

注意:在数据包转发过程中,事务层的信息(TLP 头和数据)通常保持不变,但在特定情况下(如配置请求的路由转换)会被修改。如果事务层信息被修改,修改它的设备(如交换机)必须重新计算 ECRC。ECRC 的最终作用,是确保目标设备收到的事务层信息,与最后一个修改它的设备发出的信息一致,从而实现了从‘最后一个修改点’到‘最终接收者’的端到端保护

5.4 数据链路层

数据链路层主要实现错误纠错、流量控制以及链路电源管理,该层具有容错和重传机制
数据链路层对来自事务层的TLP包添加序列号和LCRC,对来自物理层的数据包剥离序列号与LCRC,还单独生成DLLP包用于 Ack/Nak、流控制、电源管理

DLLP生成示意图


序列号:数据链路层为每一个TLP分配一个唯一的连续递增的编号,序列号不可以重复使用,但可以循环使用
DLLP包:

DLLP包通用格式

DLLP从数据链路层开始和结束,不会出现数据链路层的上层,目的是分层管理链路并使其可以正确传输 TLP,并且不对上层造成影响;由6Byte数据组成,第1个Byte用来存放DLLP类型 , 第2~4Byte 用来存放与DLLP类型相关的数据 , 第 5~6Byte用来存放CRC校验信息
最常用的Type 字段为 0000_0000的Ack DLLP和Type字段为 0001_0000 的Nak DLLP

5.4.1 Ack/Nak协议

Ack/Nak DLLP包格式

Ack/Nack_Seq_Num字段用于传递接收端的序列号状态信息
Ack DLLP中
    Ack_Seq_Num表示包括其在内以及此前的所有TLP都被成功接收,比如接收端Ack DLLP的Ack_Seq_Num=8,将Ack DLLP给到发送端,发送端收到后理解为序列号为8的TLP 都已安全到达,可以清除副本。
Nak DLLP中
    Nak_Seq_Num表示期望收到但未收到的序列号,比如接收端Nak DLLP的Ack_Seq_Num=5,将Nak DLLP给到发送端,发送端收到后理解为序列号为5的TLP出错了,发送端需要重传序列号为5的TLP。

Ack/Nack_Seq_Num的值来自于哪?
Ack/Nak_Seq_Num 的值来自接收端的 NEXT_RECEIVE_SEQ 寄存器

数据包流程图


数据链路层在将带有序列号以及LCRC的TLP包发送到物理层前,会在数据链路层的重传缓冲区保存副本。

正常传输
举例:设备A(发送端)写设备B(接收端)的内存
初始:接收端的 NEXT_RECEIVE_SEQ=5
接收端数据链路层收到来自发送端序列号为5的TLP,且LCRC正确
此时数据链路层:
   ①TLP包正确,将TLP给到事务层
   ②赋值Ack_Seq_Num = 5(取自 NEXT_RECEIVE_SEQ)
   ③NEXT_RECEIVE_SEQ递增为6
   ④生成Ack_Seq_Num=5的字段的Ack DLLP
发送端收到Ack(5)后,清除重传缓冲区中序列为<=5的所有TLP副本


TLP包丢失

初始:接收端的 NEXT_RECEIVE_SEQ=5
接收端数据链路层收到来自发送端序列号为6的,且LCRC正确的TLP,但没有收到序列号为5的TLP
此时数据链路层:
   ①由于接收到序列号为6的TLP但NEXT_RECEIVE_SEQ=5,数据链路层知道TLP包错误,将Nak_Seq_Num赋值为5(取自 NEXT_RECEIVE_SEQ)
   ②NEXT_RECEIVE_SEQ保持为5
   ③生成Nak_Seq_Num=5的字段的Nak DLLP
发送端收到Nak(5)后,重传序列号为5的TLP副本

注意:如果多次尝试传输TLP包不成功,发送器将判定链路运行不正常,并指示物理层重新训练链路,如果链路重新训练失败,物理层将指示链路不再正常运行

5.5 物理层

物理层是 PCIe 协议层次中的最底层,实现链路训练(Link Training)和链路初始化(Link Initialization)的功能,这一般是通过链路训练状态机(Link Training and Status State MachineLTSSM)自动完成
链路训练:主要为确认PCIe设备的基本属性:链路宽度(X1、X2、X4…)、速率(Link Data Rate)、通道位置翻转(Lane Reversal)、信号极性翻转(Polarity Inversion)、位锁定且时钟恢复(Bit Lock per Lane)等
TLP 和 DLLP都需要经过物理层后进行传输。PCIe协议规范中将物理层分为两个部分进行讨论:逻辑部分电气部分

逻辑部分:

发送端,物理层逻辑部分将由数据链路层转发来的 TLP 与 DLLP数据包,并向数据包添加包起始字段和包结束字段并进行字节条带化和扰码
字节条带化(byte striping):在物理层中,数据包中的每一个字节都将被分割到链路所使用的所有lanes,这一过程被称为字节条带化,每个lane在链路上都扮演着一个独立的串行传输路径,这些lanes各自传输的数据会在接收端被聚合
扰码:传输前每个字节都进行了扰码,以减少传输连续重复的“0”或“1”,这有助于减少链路上的 EMI(electro-magnetic interference,电磁干扰),并有利于将参考时钟从数据流中恢复(Clock Data Recovery,CDR,时钟数据恢复)

电气部分:

电气部分的发送器和接收器通过一个交流耦合链路相连接,其物理路径上放置电容,信号的高频部分通过,而阻塞低频(直流)部分。这种方式允许发送端和接收端的共模电压存在差异,意味着发送端和接收端可以使用不同的参考电压

六、配置空间

PCIe上电后主要经历链路训练、枚举扫描、配置BAR空间三个过程

6.1 PCIe 拓扑结构

PCIe 拓扑图

Root Complex(RC):根复合体,是PCIe拓扑结构的根,它连接CPU和内存子系统与PCIe设备
主要作用:
   ①将CPU的请求转换为PCIe事务;将PCIe设备的请求转换为内存访问或传递给CPU
   ②生成配置请求,RC是唯一能够发起配置请求(CfgRd/CfgWr)的组件,用于枚举和配置PCIe设备
   ③中断控制器,接收来自PCIe设备的中断消息(MSI/MSI-X)并传递给CPU
   ④流量管理、电源管理等
Endpoint(EP):
通常是一个功能设备(如网卡、显卡、存储控制器等)
主要作用
   提供设备功能、响应配置请求、发起内存请求、发起完成包、发起消息请求(中断消息、电源管理消息)
Switch 是PCIe架构中的交换设备,用于扩展PCIe端口;靠近RC的端口为上游端口,经过其扩展出的端口为下游端口
Bridge 用于兼容旧的PCI协议,PCI-X协议

6.2 PCIe上电枚举

CPU需知道系统中有那些PCIe设备,PCIe的上电枚举发生在主板上电的时候,上完电后,主桥芯片(北桥)开始扫描PCIe的总线,扫描的过程中采用DFS(深度优先算法:纵向查找)为每个PCIe总线分配编号。(PCIe的link是在主板上电期间完成的,并不是由CPU控制的,因此只有一些特殊的主板,如服务器主板才能支持热拔插。普通PC主板不支持)

PCIe总线编号由Primary Bus Number(上游总线号)、Secondary Bus Number(下游总线号)、Subordinate Bus Number(远端总线号)组成。

每一个PCIe设备都有自己的ID,用于区分其他的PCIE设备ID由三个成员组成(BDF):分别为:Bus NumberDevice Number、Function Number

Bus Number(总线号):标识该设备所在的总线。
Device Number(设备号):标识总线上的设备编号,范围为031
Function Number(功能号):标识该设备中的功能编号,范围为07

注意:一个PCIe设备的BDF是可以改变的,第一次上电后与第二次上电后CPU会重新分配BDF

6.3 PCIe 配置空间

PCIe配置空间是PCIe设备内部的一组寄存器,用于配置管理和识别设备;位于设备内部,是设备的“身份证”和“控制面板”

作用:
识别设备:厂商ID、设备ID、类代码、版本ID
设备控制:命令寄存器、状态寄存器
资源分配:BAR(基地址寄存器)、中断配置
电源管理:电能源状态控

随着PCI的发展,原本的256B的PCI配置空间已经满足不了PCIe,于是就对PCI配置空间进行了扩展,扩展的3840 B只适用于PCIe,不适用于PCI。

PCIe配置空间布局

配置空间Header分为两种类型,Type0(通常为EP设备)和Type1(通常为RC/Switch设备),无论是Type0还是Type1,两者的配置空间头的前4DW是相同的

PCIe Type0 配置空间Header
PCIe Type1 配置空间Header

Device ID:该字段由16bit,表示该PCI设备的设备号,只读
    注意Device ID和Vendor ID表示设备的身份证信息,出厂后就不会发生改变;而枚举所得的ID由 Root Complex 在枚举阶段动态分配,每次上机可能不同;操作系统在枚举时把设备号与枚举所得ID登记到同一张表里,完成关联
Vendor ID: 表示生产该设备的厂商的编号,只读
Status :用于保存PCIe设备的状态,如中断状态或运行产生错误时的状态
Command:在PCI设备使能pci_enable_device时会配置该寄存器。主要负责使能或关闭pci设备的I/O访问memory访问INTx中断
Class Code:设备分类信息, 表示pci设备属于哪一种类别(比如:多媒体设备,桥设备等)
Rev ID:表示PCI设备的版本号。该寄存器可以被认为是Device ID寄存器的扩展。 只读
BIST:用于其内部自检
Header:[7]代表此设备是单功能设备(0)还是多功能设备(1);[6~0]代表配置空间的类型是Type0还是Typ1
Latency Timer:PCIe设备不需要使用该寄存器,该寄存器的值必须为0。因为PCIe总线的仲裁方法与PCI总线不同,使用的连接方法也与PCI总线不同
Cache Line SizeCache行长度
Subsystem ID和Subsystem Vendor IDSubsystem Vendor ID代表生产子厂商;Subsystem ID代表子设备ID
CapPtr:链表头指针,指向该设备支持的所有扩展能力结构,比如链路状态寄存器,设备控制寄存器等
Base Address register: BAR地址寄存器负责PCI设备内部空间的映射

6.4 BAR 配置空间

对于RC/Switch设备(Type1),最多提供两个BAR,对于EP设备(EP),最多提供6个BAR;如果某个设备的BAR没有被全部使用,则对应的BAR应被硬件全被设置为0

问题一、BAR的作用?
对于接入操作系统的每个设备而言,BIOS/操作系统均会为其分配内存,PCIe设备也不例外,当PCIe设备接入操作系统后,BIOS/操作系统在启动枚举时会为PCIe设备分配内存空间,并将PCIe设备的资源(如寄存器、缓冲区)在系统物理地址空间中的基地址存放到该设备的BAR空间中。此后,对该基地址范围内地址的访问就会被路由到该设备

问题二、操作系统怎样确定PCIe设备所需空间大小?
对于接入到操作系统的PCIe设备,操作系统会向设备的BAR中写入1,然后读回其值,通过分析读回值的比特模式来计算所需空间大小;比如往BAR中写入0xFFFFFFF,读取返回值为0xFFFF0000,根据读回的值从最低位连续的0开始计算2^16=64KB,即为所需大小

问题三、内存读写请求的TLP包是如何根据Address字段找到目标设备的?
交换机有一个地址路由表,这个表的内容正是基于各个设备 BAR 所分配的地址范围建立的,交换机设备会检查TLP头中的 Address 字段,交换机发现TLP的目标地址落在连接的设备的BAR范围内,于是将该TLP 转发到该设备

6.4.1 BAR 结构

32位地址 BAR空间结构

七、PCIe 接口原理图

一个发送通道(TX)和一个接收通道(RX)合起来构成一个完整的 PCIe Lane,每一个lane由两对差分信号线组成

PCIe 2.0 ×4

PRSNT:全局复位信号,PCIe设备使用该信号复位内部逻辑
REFCLK ±:PCIe设备用该信号与处理器系统同步;时钟频率范围为100MHz±300ppm;时钟源可以来自系统内部,也可来至独立时钟
WAKE:用于系统将PCIe设备从睡眠中唤醒,非必选
SMCLK与SMDAT:与x86处理器的SMBus(System Mangement Bus)相关,可选
JTAG:一种国际标准测试协议
PRSNT1:用于检测PCIe设备是否插入
 

http://www.dtcms.com/a/549834.html

相关文章:

  • 处理 rstudio-server 卡死问题
  • C 盘清理技巧分享
  • 零基础小白如何高效入门项目管理?
  • 安装与切换Rust版本
  • 云服务器建立多个网站文山知名网站建设公司
  • 深圳网站建设网站制作网站推广vps一键安装wordpress
  • 定制网站和模板建站室内设计培训网课
  • 云免网站空间自己怎么做网站模块
  • 佰力博检测与您探讨压电薄膜介电温谱测试的目的
  • 所有权转移在函数调用中的表现:Rust 内存安全的函数边界管理
  • WebRTC学习中各项概念笔记
  • 外包网站问些什么问题一个网站可以做几级链接
  • 网站开发商怎么关闭图片显示上海网站外包
  • K8s练习
  • 订阅飞书审批事件
  • 网站被降权怎么办河北政务服务网
  • ELEMENT_ERF 1150X_CASSETTE装配(ERF1150 OR EDT1150多国语言)
  • 网站备案撤销再备案英国做电商网站有哪些方面
  • 网站开发 税率wordpress 网站打不开
  • 永乐视频网页入口 - 免费高清影视在线观看网站
  • 砂轮姿态调整的几何艺术:摆角与抬角变换的数学原理
  • 下行数据处理模块(DownFrame_PKG) v2.0:架构优化与流水线创新
  • 从无状态到有状态,LLM的“记忆”进化之路
  • 公司网站开发 中山网站建设選宙斯王
  • 用php做电商网站展馆设计公司排名
  • Bootstrap 标签页
  • 做亚马逊有哪些网站可以清货亚泰润德建设有限公司网站
  • [Ai Agent] 05 LangChain Agents 实战:从 ReAct 到带记忆的流式智能体
  • 网站建设信用卡取消店铺小程序如何开通
  • 【React Fiber的重要属性】