[PCIE] 2 - 设备层简介

本文详细介绍了PCI Express(PCIe)设备层的结构和功能,包括设备核心/软件层、事务层、数据链路层和物理层的工作原理。重点讨论了TLP数据包的组装和解包过程,非发布交易、发布写入以及消息写入的交易类型,以及服务质量(QoS)、交易排序和流量控制机制。内容涵盖了PCIe协议的细节,旨在帮助读者理解PCIe设备层如何处理数据传输和错误检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本系列文章目录:
[PCIE] 1 - PCI Express 简介
[PCIE] 2 - 设备层简介
[PCIE] 3 - 协议回顾示例


设备层简介

PCIe 定义了一个分层架构,如图 2-12 所示。这些层可以被认为在逻辑上分为两个独立运行的部分,因为它们每个都有一个用于出站流量的发送端和一个用于入站流量的接收端 . 分层方法对硬件设计人员有一些优势,因为如果对逻辑进行仔细划分,则可以更容易地通过更改现有设计的一层而不影响其他设计来迁移到规范的新版本。 即便如此,重要的是要注意,这些层只是定义了接口职责,并且不需要根据层对设计进行分区以符合规范。本节的目标是描述每一层的职责以及完成数据传输所涉及的事件流。

图 2-12 所示的设备层包括:

  • 设备核心和事务层接口。核心实现设备的主要功能。如果设备是一个endpoint,它最多可以包含 8 个功能,每个功能实现自己的配置空间。如果设备是switch,则switch core由数据包路由逻辑和用于完成此目标的内部总线组成。如果设备是root,root核心实现一个虚拟 PCI 总线 0,所有芯片组嵌入式端点和虚拟bridge都驻留在该总线上。

  • 事务层。该层负责在发送端创建事务层数据包 (TLP),在接收端负责 TLP 解码。该层还负责QOS功能、flow control功能和传输排序功能。所有这四个事务层功能都在本书第二部分中进行了描述。

  • 数据链路层。该层负责在发送端创建数据链路层数据包 (DLLP) 并在接收端进行解码。该层还负责链路错误检测和纠正,此数据链路层功能称为 Ack/Nak 协议。

  • 物理层。该层负责在发送端创建有序集(Ordered-Set)数据包,在接收端对有序集数据包进行解码。该层处理要在链路上传输的所有三种类型的数据包(TLP、DLLP 和Ordered-Sets),并处理从链路接收到的所有类型的数据包。数据包在传输端由字节纹波逻辑、扰码器、8b/10b 编码器(与 Gen1/Gen2 协议相关)或 128b/130b 编码器(与 Gen3 协议相关)和数据包串行序列化处理。数据包最终以经过training的链接速度在所有Lane上以差分时钟方式输出。在接收端物理层,数据包处理包括串行接收差分编码位并转换为数字格式,然后对传入的位流进行反序列化。以从 CDR(时钟和数据恢复)电路恢复的时钟派生的时钟速率完成。接收到的数据包由弹性缓冲区、8b/10b 解码器(与 Gen1/Gen2 协议相关联)或 128b/130b 解码器(与 Gen3 协议相关联)、解扰器和字节反纹波逻辑处理。最后,物理层的链路训练和状态机(LTSSM)负责链路初始化和Training。

在这里插入图片描述
每个 PCIe 接口都支持这些层的功能,包括交换机端口,如图 2-13 所示。在早期的课程中经常出现一个问题,即交换机端口是否需要实现所有层,因为它通常只转发数据包。 答案是肯定的,原因是评估数据包的内容以确定它们的路由需要查看数据包的内部细节,这发生在事务层逻辑中。
在这里插入图片描述
原则上,每一层都与链路另一端设备中的相应层进行通信。上面的两层通过将一串比特组织成一个数据包来实现这一点,从而创建一个可以被接收器中的相应层识别的模式。数据包在进出链路的过程中通过其他层转发。物理层也直接与其他设备中的该层通信,但它的做法不同。

在我们更深入之前,让我们先浏览一下概览,看看这些层是如何交互的。从广义上讲,来自设备的传出请求或完成数据包的内容是根据设备核心逻辑提供的信息在事务层中组装的,我们有时也将其称为软件层(尽管规范没有使用该术语)。该信息通常包括所需的命令类型、目标设备的地址、请求的属性等。然后将新创建的数据包存储在一个称为虚拟通道的缓冲区中,直到它准备好传递到下一层。当数据包向下传递到数据链路层时,附加信息会添加到数据包中以供相邻接收器进行错误检查,并在本地存储一个副本,以便在发生传输错误时再次发送它。当数据包到达物理层时,它会使用链路的所有可用通道进行差异编码和传输。
在这里插入图片描述
接收器对物理层中的输入位进行解码,检查在此级别可以看到的错误,如果没有错误,则将生成的数据包转发到数据链路层。 在这里检查数据包是否有不同的错误,如果没有错误,则向上转发到事务层。 数据包被缓冲,检查错误,并分解成原始信息(命令、属性等),因此内容可以传递到接收器的设备核心。 接下来,让我们使用图 2-14 更深入地探索每一层必须做什么才能使这个过程正常工作。我们从顶部开始。

Device Core / Software 层

这是设备的核心功能,例如网络接口或硬盘控制器。这在 PCIe 规范中没有被定义为一个层,但可以这样考虑,因为它位于事务层之上,并且将是所有请求的源或目标。它向事务层的发送端提供请求,其中包括事务类型、地址、要传输的数据量等信息。当接收到传入的数据包时,它也是从事务层向上转发的信息的目的地。

Transaction 层

为响应来自软件层的请求,事务层生成出站数据包。它还检查入站数据包并将其中包含的信息转发到软件层。它支持Non-Posted交易的拆分交易协议,并将入站完成与之前传输的出站非发布请求相关联。
该层处理的事务使用 TLP(事务层数据包),可以分为四个请求类别:

  1. Memory
  2. IO
  3. Configuration
  4. Message

PCI 和 PCI-X 已经支持其中的前三个,但消息是 PCIe 的一种新类型。Transaction定义为向目标设备传递命令的Request数据包与目标作为回复返回的任何Completion数据包的组合。请求类型列表在表 2-2 中给出。
在这里插入图片描述
在这里插入图片描述
请求也属于表右列所示的两个类别之一:non-postedposted。对于non-posted请求,请求者发送一个数据包,完成者应该为该数据包生成一个完成数据包形式的响应。读者可能会认为这是从 PCI-X 继承的拆分事务协议。例如,任何读取请求都不会被发布,因为请求的数据需要在完成中返回。出乎意料的是,IO写和Configuration写也是未发布请求。即使它们正在为命令传递数据,这些请求仍然希望从目标接收完成,以确认写入数据实际上已无错误地到达目的地。

相反,内存写入和消息被发布,这意味着目标设备不会向请求者返回完成 TLP。 Posted transactions 提高了性能,因为 Requester 不必等待回复或产生完成的开销。权衡是他们没有得到关于写入是否完成或遇到错误的反馈。这种行为是从 PCI 继承而来的,并且仍然被认为是一件好事,因为发生故障的可能性很小并且性能提升很大。请注意,即使它们不需要 Completions,Posted Writes 仍然参与数据链路层中的 Ack/Nak 协议,以确保可靠的数据包传输。

TLP (Transaction Layer Packet) Basics

所有 PCIe 请求和完成数据包类型的列表在表 2-3 中给出。
在这里插入图片描述
TLP 起源于发送器的事务层,终止于接收器的事务层,如图 2-15 所示。数据链路层和物理层在数据包通过传输层时将部分添加到数据包中。 发送器,然后在接收器处验证这些部分是否通过链路正确传输。
在这里插入图片描述

TLP 数据包组装

图 2-16 显示了完成的 TLP 在链路上发送时的各个部分,从中可以看出,数据包的不同部分被添加到每一层中。为了更容易识别数据包是如何构建的,TLP 的不同部分采用颜色编码以指示负责它们的层:红色表示事务层,蓝色表示数据链路层,绿色表示物理层。

设备核心发送在事务层中组装 TLP 核心部分所需的信息。每个 TLP 都会有一个header,尽管有些,例如读取请求,不包含数据。一个可选的端到端 CRC (ECRC) 字段会计算出来并添加到数据包中。 CRC 代表循环冗余校验(或代码),几乎所有串行架构都采用 CRC,原因很简单,即它易于实现并提供非常强大的错误检测能力。 CRC 还检测“突发错误”或重复的错误位串,直至 CRC 值的长度(PCIe 为 32 位)。由于在发送一长串位时可能会遇到这种类型的错误,因此该特性对于串行传输非常有用。 ECRC 字段通过数据包的发送方和接收方之间的任何服务点(“服务点”通常是指具有 TLP 路由选项的交换机或根端口)保持不变,这对于在目的地验证没有任何的错误很有用。

为了传输,TLP 的核心部分被转发到数据链路层,数据链路层负责附加一个序列号和另一个称为链路 CRC (LCRC) 的 CRC 字段。相邻接收器使用 LCRC 来检查错误并将检查结果报告给在该链路上发送的每个数据包的发送器。读者可能想知道,如果强制性 LCRC 检查已经验证了链路上的无差错传输,为什么 ECRC 有什么用。原因是仍然有一个地方没有检查传输错误,那就是在路由数据包的设备中。一个数据包到达并在一个端口上检查错误,检查路由,当它在另一个端口上发送时,计算一个新的 LCRC 值并将其添加到它。端口之间的内部转发可能会遇到未作为正常 PCIe 协议的一部分进行检查的错误,这就是 ECRC 有用的原因。

最后,生成的数据包被转发到物理层,在那里将其他字符添加到数据包中,让接收者得到期望的头尾数据。对于前两代 PCIe,这些是添加到数据包开头和结尾的控制字符。对于第三代,不再使用控制字符,而是将其他位附加到块中,以提供有关数据包的所需信息。然后使用所有可用通道在链路上对数据包进行编码和差分传输。
在这里插入图片描述

TLP 数据包解包

当相邻接收器看到传入的 TLP 比特流时,它需要识别并删除添加的部分,以恢复发送器核心逻辑发送的原始信息。如图 2-17 所示,物理层将验证正确的开始和结束或其他字符是否存在并将它们删除,将 TLP 的其余部分转发到数据链路层。该层首先检查 LCRC 和序列号错误。如果没有发现错误,它会从 TLP 中删除这些字段并将其转发到事务层。如果接收方是switch,则在事务层中检查数据包以查找 TLP 标头中的路由信息​​并确定应将数据包转发到哪个端口。即使它不是预期的目的地,也允许交换机检查并报告找到的 ECRC 错误。但是,不允许修改 ECRC,因此目标设备也将能够检测到 ECRC 错误。

目标设备可以检查 ECRC 错误(如果它有能力并且已启用)。如果这是目标设备并且没有错误,则删除 ECRC 字段,将数据包的标头和数据部分转发到软件层。
在这里插入图片描述

Non-Posted Transactions

普通读

图 2-18 显示了从端点发送到系统内存的内存读取请求的示例。 任何内存读取请求的一个重要部分是目标地址。内存请求的地址可以是 32 位或 64 位,并确定数据包路由。在此示例中,请求通过两个交换机路由,将其向上转发到目标,在本例中为Root。当 Root 对请求进行解码并识别出数据包中的地址以系统内存为目标时,它会获取请求的数据。为了将该数据返回给请求者,根端口的事务层会创建所需数量的完成,以将所有请求的数据传递给请求者。 PCIe 最大可能的数据有效负载是每个数据包 4 KB,但设备通常设计为使用比这更小的有效负载,因此可能需要多次完成才能返回大量数据。
在这里插入图片描述
这些完成数据包还包含路由信息以将它们指引回请求者,并且请求者为此目的在原始请求中包含其返回地址。这个“返回地址”只是为 PCI 定义的请求者的设备 ID,它是三件事的组合:系统中的 PCI 总线编号、该总线上的设备编号以及该设备中的功能编号.此总线、设备和功能编号信息(有时缩写为 BDF)是 Completions 用于返回原始请求者的路由信息​​。与 PCI-X 一样,请求者可以同时进行多个拆分事务,并且必须能够将传入的完成与正确的请求相关联。为了促进这一点,在原始请求中添加了另一个值,称为标签,每个请求都是唯一的。 Completer 复制这个 transaction Tag 并在 Completion 中使用它,以便 Requester 可以快速识别这个 Completion 正在服务的请求。
最后,完成者还可以通过设置完成状态字段中的位来指示错误条件。这至少让请求者大致了解可能出了什么问题。请求者如何处理这些错误中的大部分将由软件决定,并且超出了 PCIe 规范的范围。

锁定读

锁定内存读取旨在支持所谓的原子读取-修改-写入操作,这是一种处理器用于测试和设置信号量等任务的不间断事务。在测试和设置过程中,不能对信号量进行其他访问,否则可能会出现竞争条件。为了防止这种情况,处理器使用一个锁定指示器(例如并行前端总线上的一个单独的引脚)来阻止总线上的其他事务,直到锁定完成。以下内容只是对该主题的高级介绍。

作为一段历史,在 PCI 的早期,规范编写者预计 PCI 将实际取代处理器总线的情况。因此,PCI 规范中包含了对处理器需要在总线上执行的操作的支持,例如锁定事务。然而,PCI 很少以这种方式使用,最终,大部分处理器总线支持都被放弃了。然而,锁定周期仍然存在,以支持一些特殊情况,并且 PCIe 将这种机制向前推进以支持传统支持。也许是为了加快迁移速度,禁止新的 PCIe 设备接受锁定的请求;它只对那些自称为旧设备的人是合法的。在图 2-19 所示的示例中,请求者通过发送锁定请求 (MRdLk) 开始该过程。根据定义,这样的请求只允许来自 CPU,因此在 PCIe 中只有根端口会启动其中一个。

锁定的请求使用目标内存地址通过拓扑路由,最终到达 Legacy Endpoint。 当数据包沿途通过每个路由设备(称为服务点)时,数据包的出口端口(Egress Port)被锁定,这意味着在路径解锁之前不允许其他数据包进入该方向。
在这里插入图片描述
当 Completer 接收到数据包并对其内容进行解码时,它会收集数据并使用数据创建一个或多个 Locked Completions。这些完成使用请求者 ID 路由回请求者,然后它们通过的每个出口端口也被锁定。

如果 Completer 遇到问题,它会返回一个没有数据的锁定完成数据包(原始读取应该产生数据,所以如果没有任何我们知道有问题)并且状态字段将指示有关错误的信息。请求者将理解这意味着锁定没有成功,因此事务将被取消,软件将需要决定下一步做什么。

IO 和configuration写

图 2-20 说明了一个未发布的 IO 写入事务。与锁定请求一样,IO 循环也可以合法地仅针对 Legacy Endpoint。请求根据 IO 地址通过 Switch 路由,直到到达目标 Endpoint。当 Completer 接收到请求时,它会接受数据并返回一个没有确认数据包接收的数据的完成数据包。完成中的状态字段将报告是否发生错误,如果发生错误,请求者的软件将处理它。
如果完成报告没有错误,则请求者知道写入数据已成功交付,并且现在允许该完成者的指令序列中的下一步。这确实总结了非发布写入的动机:与内存写入不同,仅知道数据将在未来某个时间到达目的地是不够的。相反,在我们知道它已经到达那里之前,下一步是不可能在逻辑上发生的。与锁定周期一样,非发布写入只能来自处理器。
在这里插入图片描述

Posted Writes

Memory写

内存写入总是被发布并且永远不会收到完成。一旦请求被发送,请求者在继续下一个请求之前不会等待任何反馈,并且不会花费时间或带宽来返回完成。因此,发布的写入比非发布的请求更快、更高效,并提高了系统性能。如图 2-21 所示,数据包使用其目标内存地址通过系统路由到完成器。一旦一个 Link 成功发送了请求,该事务就在该 Link 上完成,并且可用于其他数据包。最终,Completer 接受数据,事务就真正完成了。当然,这种方法的一个权衡是,由于没有发送完成数据包,因此也没有办法将错误报告给请求者。如果 Completer 遇到错误,它可以记录它并向 Root 发送 Message 以通知系统软件有关错误,但 Requester 不会看到它。
在这里插入图片描述

Message写

有趣的是,与我们目前看到的其他请求不同,消息有几种可能的路由方法,消息中的一个字段指示使用哪种类型。例如,一些消息是针对特定完成者的写入请求,其他消息从根广播到所有端点,而还有一些从端点发送的消息会自动路由到根。
消息在 PCIe 中很有用,有助于实现减少引脚数的设计目标。它们消除了 PCI 用来报告诸如中断、电源管理事件和错误之类的边带信号的需要,因为它们可以通过正常数据路径以数据包的形式报告这些信息。

Quality of Service (QoS)

PCIe 从一开始就被设计为能够支持流式音频或视频等应用程序的时间敏感事务,在这些应用程序中,数据必须及时交付才能发挥作用。这称为提供服务质量,是通过添加一些东西来完成的。首先,软件通过在其中设置一个称为流量类别 (TC) 的 3 位字段来为每个数据包分配一个优先级。一般而言,为数据包分配更高编号的 TC 预计会在系统中赋予它更高的优先级。其次,多个缓冲区,称为虚拟通道 (VC),内置于每个端口的硬件中,并根据其 TC 将数据包放置到适当的缓冲区中。第三,由于一个端口现在有多个缓冲区,其中包含在给定时间可用于传输的数据包,因此需要仲裁逻辑来在 VC 中进行选择。最后,交换机必须在竞争输入端口之间进行选择,以访问给定输出端口的 VC。这称为端口仲裁(Port Arbitration),可以是硬件分配的或软件可编程的。所有这些硬件部件都必须到位,以允许系统对数据包进行优先级排序。如果正确编程和设置,这样的系统甚至可以为给定路径提供有保证的服务。

为了说明这个概念,请考虑图 2-22,其中摄像机和 SCSI 设备都需要将数据发送到系统 DRAM。不同之处在于相机数据是时间关键的;如果到目标设备的传输路径无法跟上其带宽,则会丢弃帧。系统需要能够保证至少与相机一样高的带宽,否则捕获的视频可能会出现断断续续的情况。同时,SCSI 数据需要准确无误地传递,但需要多长时间并不重要。显然,那么,当需要同时发送一个视频数据包和一个SCSI包时,视频流量应该具有更高的优先级。 QoS 是指系统为数据包分配不同优先级并通过具有确定延迟和带宽的拓扑路由它们的能力。
在这里插入图片描述

Transaction排序

在 VC 中,数据包通常都以它们到达的相同顺序流过,但是这个一般规则有例外。 PCI Express 协议继承了 PCI 事务排序模型,包括对随 PCI-X 架构添加的宽松排序情况的支持。 这些排序规则保证使用相同流量类别的数据包将以正确的顺序通过拓扑,防止潜在的死锁或活锁情况。 需要注意的一个有趣的点是,由于排序规则只适用于一个 VC,并且使用不同 TC 的数据包可能不会映射到同一个 VC,因此使用不同 TC 的数据包被软件理解为没有排序关系。 这种排序在事务层内的 VC 中维护。

流量控制

串行传输使用的典型协议是要求发送器仅在有足够的缓冲区空间来接收数据包时才向其邻居发送数据包。这减少了总线上的性能浪费事件,例如 PCI 允许的断开连接和重试,从而消除了传输中的此类问题。权衡是接收器必须经常报告其缓冲区空间以避免不必要的停顿,并且报告占用自己的一点带宽。在 PCIe 中,此报告是使用 DLLP(数据链路层数据包)完成的,我们将在下一节中看到。原因是为了避免在使用 TLP 时可能发生的死锁情况,在这种情况下,发送器无法获得缓冲区大小更新,因为它自己的接收缓冲区已满。无论缓冲区情况如何,都可以发送和接收 DLLP,从而避免了该问题。该流控制协议在硬件级别自动管理,并且对软件透明。
在这里插入图片描述
如图 2-23 所示,接收器包含保存接收到的 TLP 的 VC 缓冲区。 接收器使用流控制 DLLP 将这些缓冲区的大小通告给发送器。 发送器跟踪接收器的 VC 缓冲区中的可用空间,并且不允许发送超过接收器可以容纳的数据包。 当接收器处理 TLP 并将它们从缓冲区中删除时,它会定期发送流控制更新 DLLP,以使发送器保持最新的可用空间。

数据链路层

该逻辑负责链路管理并执行三个主要功能:TLP 纠错、流量控制和一些链路电源管理。 它通过生成 DLLP 来实现这些,如图 2-24 所示。

DLLP(数据链路层数据包)

DLLP 在链路上两个相邻设备的数据链路层之间传输。 事务层甚至不知道这些数据包,这些数据包只在相邻设备之间传输,不会路由到其他任何地方。 与 TLP 相比,它们很小(总是只有 8 个字节),这是一件好事,因为它们代表了维护链路协议的开销。
在这里插入图片描述

DLLP 打包

如图 2-24 所示,DLLP 源自发送器的数据链路层,并由接收器的数据链路层使用。 一个 16 位 CRC 被添加到 DLLP 内核以检查接收器的错误。 DLLP 内容被转发到物理层,物理层将开始和结束字符附加到数据包(对于前两代 PCIe),然后使用所有可用通道在链路上对其进行编码和差分传输。

DLLP 解包

当物理层接收到 DLLP 时,将解码比特流并删除开始和结束帧字符。 数据包的其余部分被转发到数据链路层,该层检查 CRC 错误,然后根据数据包采取适当的措施。 数据链路层是 DLLP 的目的地,因此它不会被转发到事务层。

Ack/Nak 协议

图 2-25 所示的纠错功能是通过基于硬件的自动重试机制提供的。如图 2-26 所示,LCRC 和序列号被添加到每个传出 TLP 并在接收器处检查。发送器的重放缓冲区保存已发送的每个 TLP 的副本,直到相邻设备的接收得到确认。该确认采用 Ack DLLP(肯定确认)的形式,由 Receiver 发送,并带有它所看到的最后一个良好 TLP 的序列号。当发送器看到 Ack 时,它会将具有该序列号的 TLP 连同在被确认的 TLP 之前发送的所有 TLP 一起从重放缓冲区中刷新。
如果 Receiver 检测到 TLP 错误,它会丢弃 TLP 并向 Transmitter 返回 Nak,然后 Transmitter 重放所有未确认的 TLP,以期下次获得更好的结果。由于检测到的错误几乎总是瞬态事件,因此重放通常会纠正问题。这个过程通常被称为 Ack/Nak 协议。
在这里插入图片描述
在这里插入图片描述
DLLP 的基本形式也显示在图 2-26 中,它由一个 4 字节的 DLLP 类型字段组成,其中可能包含一些其他信息和一个 2 字节的 CRC。
图 2-27 显示了通过 Switch 进行内存读取的示例。一般来说,这种情况的步骤如下:

  1. 步骤 1a:请求者发送内存读取请求,并在其 Replay Buffer 中保存一份副本。 Switch 接收到 MRd TLP 并检查 LCRC 和序列号。
    步骤 1b:没有发现错误,因此 Switch 向请求者返回一个 Ack DLLP。作为响应,请求者从Replay Buffer中丢弃其 TLP 副本。
  2. 步骤 2a:交换机使用内存地址将 MRd TLP 转发到正确的 Egress Port,并在 Egress Port 的 Replay Buffer 中保存一份副本。 Completer 接收 MRd TLP 并检查错误。
    步骤 2b:没有发现错误,因此 Completer 向 Switch 返回一个 Ack DLLP。交换机端口从其Replay Buffer中清除其 MRd TLP 副本。
  3. 步骤 3a:作为请求的最终目的地,完成者检查 MRd TLP 中可选的 ECRC 字段。没有看到错误,因此请求被传递到核心逻辑。根据该命令,设备获取请求的数据并返回完成数据 TLP (CplD),同时将副本保存在其Replay Buffer中。 Switch 接收 CplD TLP 并检查错误。
    步骤 3b:没有发现错误,因此 Switch 返回一个 Ack DLLP 给 Completer。Completer从其Replay Buffer中丢弃其 CplD TLP 副本。
  4. 步骤 4a:交换机解码 CplD TLP 中的 Requester ID 字段并将数据包路由到正确的 Egress Port,在 Egress Port 的 Replay Buffer 中保存一份副本。请求者收到 CplD TLP 并检查错误。
    步骤 4b:没有看到错误,所以请求者返回 Ack DLLP 给 Switch。 Switch 丢弃其Replay Buffer中的 CplD TLP 副本。请求者检查可选的 ECRC 字段并没有发现错误,因此数据被传递到核心逻辑。

在这里插入图片描述

流量控制

第二个主要的链路层功能是流量控制。 在上电或复位后,此机制由数据链路层在硬件中自动初始化,然后在运行时更新。 关于 TLP 的部分已经对此进行了概述,因此这里不再重复。

能源管理

最后,链路层也参与电源管理,因为 DLLP 用于传达与链路和系统电源状态相关的请求和握手。

物理层

通用

物理层是 PCIe 的最低分层,如图 2-14 所示。TLP 和 DLLP 类型的数据包都从数据链路层向下转发到物理层,以便通过链路传输并向上转发到接收端的数据链路层。规范将物理层讨论分为两部分:逻辑部分和电气部分,我们也这样划分。 逻辑物理层包含与准备数据包以在链路上进行串行传输以及为入站数据包反转该过程相关的数字逻辑。 电气物理层是连接到链路的物理层的模拟接口,由每个通道的差分驱动器和接收器组成。

物理层 - 逻辑

来自数据链路层的 TLP 和 DLLP 被记录到物理层的缓冲区中,其中添加了开始和结束字符以方便在接收器处检测数据包边界。 由于开始和结束字符出现在数据包的两端,因此它们也被称为“帧”字符。 在图 2-28 中显示了附加到 TLP 和 DLLP 的帧字符,其中还显示了每个字段的大小。
在这里插入图片描述
在这一层中,数据包的每个字节在一个称为字节条带化(Byte Striping)的过程中被拆分到用于链接的所有通道中。实际上,每个通道都作为跨链路的独立串行路径运行,并且它们的数据在接收器处全部聚合在一起。每个字节都经过加扰,以减少传输线上的重复模式并减少链路上的 EMI(电磁干扰)。对于前两代 PCIe(Gen1 和 Gen2 PCIe),使用所谓的 8b/10b 编码逻辑将 8 位字符编码为 10 位“符号”。这种编码增加了传出数据流的开销,但也增加了许多有用的特性。 Gen3 物理层逻辑在以 Gen3 速度传输时,不使用 8b/10b 编码对数据包字节进行编码。而是采用另一种称为 128b/130b 编码的编码方案,以加密传输的数据包字节。然后,每个通道(Gen1 和 Gen2)上的 10b 符号或每个通道(Gen3)上的数据包字节被串行化,并在链路的每个通道上以 2.5 GT/s(Gen1)或 5 GT/s 的不同时钟输出(Gen2) 或 8 GT/s (Gen3)。

当数据包位到达所有通道时,接收器以经过training的时钟速度输入数据包位。如果使用 8b/10b(在 Gen1 和 Gen2 模式下),则使用解串器将数据包的串行比特流转换为 10 位符号,以便为 8b/10b 解码做好准备。但是,在解码之前,符号会通过一个弹性缓冲区,这是一种巧妙的设备,可以补偿两个连接设备的内部时钟之间的细微频率差异。接下来,通过 8b/10b 解码器将 10 位符号流解码回正确的 8 位字符。 Gen3 物理层逻辑,当以 Gen3 速度接收数据包的串行比特流时,将使用已建立块锁定的解串器将其转换为字节流。字节流通过一个弹性缓冲区,该缓冲区进行时钟容差补偿。考虑到以 Gen3 速度计时的数据包不是 8b/10b 编码的,8b/10b 解码器阶段将被跳过。所有通道上的 8 位字符都被解扰,来自所有通道的字节被解条带回单个字符流,最后,来自发送器的原始数据流被恢复。

链接Training和初始化

物理层的另一个职责是链路上的初始化和训练过程。 在这个全自动过程中,需要采取几个步骤来准备 Link 以进行正常操作,其中包括确定几个可选条件的状态。 例如,链路宽度可以从 1 Lane到 32 Lanes,并且可能有多种速度可供选择。 训练过程将发现这些选项并通过状态机序列来解决最佳组合。 在该过程中,会检查或确定几件事以确保正确和最佳的操作,例如:

  • Link 宽度
  • Link 数据速率
  • Lane 反转 - 以相反顺序连接的Lane
  • 极性反转 - 通道极性反向连接
  • 每个通道的位锁定 - 恢复发送器时钟
  • 每个通道的符号锁定 - 在比特流中找到一个可识别的位置
  • 多Lane Link 中的Lane-to-Lane 去扰。

物理层 - 电气

链路上的物理发送器和接收器通过交流耦合链路连接,如图 2-29 所示。术语“交流耦合”仅表示电容器物理地驻留在设备之间的路径中并用于 通过信号的高频 (AC) 分量,同时阻断低频 (DC) 部分。 许多串行传输使用这种方法,因为它允许发送器和接收器的共模电压(信号的正负版本交叉的电平)不同,这意味着它们不需要具有相同的参考电压。 如果两个设备在附近并且在同一个盒子里,这不是一个大问题,但如果它们在不同的建筑物中,那么它们很难有一个完全相同的共同参考电压。
在这里插入图片描述

有序集

设备之间发送的最后一种流量仅使用物理层。尽管接收者很容易识别,但这些信息在技术上并不是包的形式,例如,它没有开始和结束字符。相反,它被组织成所谓的有序集(Ordered-Sets),起源于发射器的物理层,终止于接收器的物理层,如图 2-30 所示。对于 Gen1 和 Gen2 数据速率,有序集以单个 COM 开始字符后跟三个或更多其他定义要发送的信息的字符。现在,可以说 COM 字符具有使其能够很好地用于此目的的特性。
在这里插入图片描述
有序集的大小始终是 4 字节的倍数,如图 2-31 所示。在 Gen3 操作模式下,有序集格式与上述 Gen1/Gen2 不同。有序集始终终止于相邻设备,并且不通过 PCIe 结构进行路由。有序集用于链路training过程。它们还用于补偿发送器和接收器内部时钟之间的细微差异, 称为时钟容差补偿的过程。 最后,有序集用于指示进入或退出链路上的低功耗状态。
在这里插入图片描述


如果你想了解更多
[PCIE] 1 - PCI Express 简介

[PCIE] 3 - 协议审查示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

山猫Show

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

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

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

打赏作者

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

抵扣说明:

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

余额充值