PCIe分层结构简介

PCIe分层

PCIe定义了以下三层结构:
事务层(Transaction Layer)
数据链路层(Data Link Layer)
和物理层(Physical Layer)

事务层(Transaction Layer):主要职责是创建(发送)或者解析(接收)TLP (Transaction Layer packet),流量控制,QoS,事务排序等

数据链路层(Data Link Layer):主要职责是创建(发送)或者解析(接收)DLLP(Data Link Layer packet),Ack/Nak协议(链路层检错和纠错),流控,电源管理等。

物理层(Physical Layer):主要职责是处理所有的Packet数据物理传输,发送端数据分发到各个Lane传输,接收端把各个Lane上的数据汇总起来,每个Lane上加扰(Scramble,目的是让0和1分布均匀,去除信道的电磁干扰EMI)去扰(De-scramble),以及8/10或者128/130编码解码,等等。此外,物理层还实现了链路训练(Link Training)和链路初始化(Link Initialization)的功能,这一般是通过链路训练状态机(Link Training and Status State Machine,LTSSM)来完成的。

在这里插入图片描述

事务层

事务层处理的事务使用TLP(事务层数据包),可以分为四类请求:

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

其中,前三种都是从PCI/PCI-X总线中继承过来的,第四种Messages是PCIe新增加的类型。详细的信息如下表所示:
在这里插入图片描述
只有Memory Write和Message是Posted类型的,其他的都是Non-Posted类型的。

Non-posted,就是Requester发送了一个包含Request的包之后,必须要得到一个包含Completion的包的应答,这次传输才算结束,否则会进行等待。

Posted,就是Requester的请求并不需要Completer通过发送包含Completion的包进行应答,当然也就不需要进行等待了。很显然,Posted类型的操作对总线的利用率(效率)要远高于Non-Posted型。

TLP类型:
在这里插入图片描述
如下图,数据链路层和物理层在数据包通过发送器各层时为其添加部分内容,然后在接收端验证这些部分是否在链路上正确传输。
在这里插入图片描述
TLP Packet Assembly
在这里插入图片描述

TLP Packet Disassembly
在这里插入图片描述

Non-Posted Transactions

Ordinary Reads (普通读)

下图显示的是一个Endpoint向System Memory发送读请求(Read Request)的例子。

Endpoint的读请求通过了两个Switch,然后到达其目标,即Root。Root对读请求的包进行解码后,并从中识别出操作的地址,然后锁存数据,并将数据发送至Endpoint,即包含数据的Completion包,ClpD
在这里插入图片描述

Locked Reads

Locked请求实际上是PCIe为了兼容早期的PCI总线而设置的一种方式,对于非PCI兼容的设计中,是不允许使用Locked操作的。并且也只有Root可以发起Locked请求操作,Endpoint是不可以发起Locked请求操作的。下图显示的是一个简单的Locked Read请求操作:
在这里插入图片描述
IO and Configuration Writes

下图是一个Non-Posted IO写操作的例子。和Locked操作一样,IO操作也是为了兼容早期的PCI设备,在PCIe设备中也是不建议使用。
在这里插入图片描述

Posted Writes

Memory Writes
PCIe中的Memory写操作都是Posted的,因此Requester并不需要来自Completer的Completion。
因此没有返回Completion,所以当发生错误时,Requester也不会知道。但是,此时Completer会将错误记录到日志(Log),然后向Root发送包含错误信息的Message。
在这里插入图片描述

Message Writes

和其他的几种类型不太一样,Message支持多种Routing方式。比如Requester可以将Message发送至一个指定的Completer,但是不管指定的Completer是不是Root,Root都会自动的收到来自任何一个Endpoint发送的Message。此外,当Requester是Root的时候,Requester还可以向所有的Endpoint进行广播发送Message。
Message机制的提出帮助PCIe总线省去了很多PCI总线中的边带信号。PCI中很多用于中断、功耗管理、错误报告的边带信号,在PCIe中都通过了Message来进行实现了。

Quality of Service (QoS)
PCIe总线设计之初,充分考虑到了音频和视频传输等这些对时间要求特别敏感的应用。为了保证这些特殊应用的数据包能够得到优先发送,PCIe Spec中为每一个包都分配了一个优先级,通过TLP的Header中的3位(即TC,Traffic Class)
在这里插入图片描述

TC值越大,表示优先级越高,对应的包也就会得到优先发送。一般来说,支持QoS(Quality of Service)的PCIe总线系统,对于每一个TC值都会有一个独立Virtual Channel(VC)与之对应。这个Virtual Channel实际上就是一个Buffer,用于缓存数据包。

在这里插入图片描述

数据链路层

数据链路层不仅可以转发来自事务层的包(TLP),还可以直接向另一个相邻设备的数据链路层直接发送DLLP,比如应用于Flow Control和Ack/Nak的DLLP。如下图所示:
在这里插入图片描述

DLLP组装。
如上图,DLLP起源于数据链路层,并被接收器的数据链路层消耗。一个16位的CRC被添加到DLLP核心,以检查接收器的错误。DLLP内容被转发到物理层,物理层在数据包上附加一个Start和End字符,然后编码并使用所有可用的通道在链路上传输它。

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

Ack/Nak
数据链路层还实现了一种自动的错误校正功能,即Ack/Nak机制。如下图所示,发送方会对每一个TLP在Replay Buffer中做备份,直到其接收到来自接收方的Ack DLLP,确认该DLP已经成功的被接受,才会删除这个备份。如果接收方发现TLP存在错误,则会向发送发发送Nak DLLP,然后发送方会从Replay Buffer中取出数据,重新发送该TLP。
在这里插入图片描述
数据链路层的2种包
一种是只在数据链路层传输的DLLP
一种是转发来自事务层的TLP
在这里插入图片描述
链路层的第二个主要功能是流量控制。在上电或复位之后,该机制由数据链路层在硬件中自动初始化,然后在运行时更新。

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

物理层

物理层处于PCIe体系结构中的最底层,所以无论是TLP还是DLLP都必须通过物理层完成收发操作。来自数据链路层的TLP和DLLP都会被临时放入物理层的Buffer中,并被加上起始字符(Start & End Characters),这些起始字符有的时候也被称为帧字符(Frame Characters)。具体如下图所示:
在这里插入图片描述
物理层完成的一个重要的功能就是8b/10b编码和解码(Gen1 & Gen2),Gen3及之后的PCIe则采用了128b/130b的编码和解码机制。

物理层的另一个重要的功能时进行链路(Link)的初始化和训练(Initialization & Training),且是完全自动的操作,并不需要人为的干预。完成链路的初始化和训练之后,便可以确定当前PCIe设备的一些基本属性:
• Link width
• Link data rate
• Lane reversal ‐ Lanes connected in reverse order
• Polarity inversion ‐ Lane polarity connected backward
• Bit lock per Lane ‐ Recovering the transmitter clock
• Symbol lock per Lane ‐ Finding a recognizable position in the bit‐stream
• Lane‐to‐Lane de‐skew within a multi‐Lane Link

PCIe物理层处理可以转发TLP和DLLP之外,还可以直接发送命令集(Ordered Sets)。之所以称其为命令集,是因为它并不是真正意义上的包(Packet),因为物理层不会为其添加起始字符(Start & End Characters)。并且命令集始于发送端的物理层,结束语接收端的物理层。虽然命令集没有起始字符,但是对于Gen1&Gen2版本的PCIe物理层来说,会为其添加一个叫做COM的字符作为开始字符,随后跟着三个或者更多的信息字符。

命令集(Ordered Sets)的收发示意图,如下图所示:
在这里插入图片描述

命令集(Ordered Sets)的结构图如下图所示:
在这里插入图片描述
命令集主要用于链路的训练操作(Link Training Process)。此外,命令集还用于链路进入或者退出低功耗模式的操作。

示例

现在,让我们通过一个示例来回顾整个Link协议,以说明从Requester发起内存读取请求到从Completer获得所请求的数据所发生的步骤。

Memory Read Request
在这里插入图片描述

Completion with Data
在这里插入图片描述

参考链接:
https://blog.youkuaiyun.com/zsmcdut/article/details/120037283
https://blog.youkuaiyun.com/zsmcdut/article/details/120037261
https://blog.youkuaiyun.com/zsmcdut/article/details/120037299

<think>我们正在讨论PCIe协议的分层结构工作原理。根据引用[1],PCIe规范采用三层结构:事务层(Transaction Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer)。每一层都分为发送和接收两个功能块。下面我将详细解释每一层的工作原理。 1. **事务层(Transaction Layer)**: - 这是最高层,负责生成和处理事务层包(TLP)。TLP用于承载通信事务,如读写请求、配置请求等。 - 在发送端,应用程序(设备核)生成TLP,并将其存储在发送缓冲器中,等待向下层传递。 - 在接收端,事务层从下层接收TLP,提取出有效数据,并传递给上层应用程序。 2. **数据链路层(Data Link Layer)**: - 位于事务层和物理层之间,主要负责错误检测和纠正,确保数据的可靠传输。 - 在发送端,数据链路层在TLP包上添加附加信息(如序列号和CRC校验码),形成数据链路层包(DLLP)。这些附加信息用于接收端进行错误检查。 - 在接收端,数据链路层检查DLLP的完整性。如果检测到错误,会请求重传;如果无误,则去除附加信息,将TLP传递给事务层。 3. **物理层(Physical Layer)**: - 最底层,负责实际的信号传输。包括信号的编码、串行化、发送和接收。 - 在发送端,物理层对DLLP进行编码(如8b/10b编码或更高版本的128b/130b编码),并将其分配到可用的通道(Lane)上,通过差分信号发送出去。 - 在接收端,物理层接收串行数据,进行解码和去串行化,然后将数据链路层包(DLLP)传递给数据链路层。 整个数据传输过程可以概括为: - **发送端**:事务层生成TLP → 数据链路层添加附加信息形成DLLP → 物理层编码并发送。 - **接收端**:物理层接收并解码 → 数据链路层检查错误并去除附加信息 → 事务层提取有效数据。 这种分层结构确保了数据传输的可靠性和高效性[^1]。 §§相关问题§§ 1. PCIe事务层支持哪些类型的TLP? 2. PCIe数据链路层如何实现错误检测和重传? 3. PCIe物理层的编码机制如何提升传输效率? </think>### PCIe协议分层结构的工作原理 PCIe协议采用三层架构实现高效数据传输,各层独立工作且协同完成设备通信[^1]: #### 1. **事务层(Transaction Layer)** - **核心功能**:生成和处理事务层包(TLP),封装读写请求、配置命令等操作。 - **发送端**:应用程序生成TLP(含地址、命令类型、载荷数据),存储至发送缓冲区。例如:CPU发起内存读请求时,TLP格式为: $$ \text{Header} + \text{Payload} + \text{CRC} $$ - **接收端**:解析TLP包头,提取操作指令并传递给上层应用(如将数据写入GPU显存)[^1]。 #### 2. **数据链路层(Data Link Layer)** - **核心功能**:确保传输可靠性,通过数据链路层包(DLLP)实现错误检测和流控制。 - **发送端**: - 为TLP添加序列号(Sequence Number)和链路CRC校验码 - 封装成DLLP包:$ \text{TLP} + \text{Seq\#} + \text{LCRC} $ - **接收端**: - 验证LCRC和序列号连续性 - 若检测错误,通过NAK信号触发发送端重传 - 成功则剥离DLLP头部,将TLP递交事务层[^1]。 #### 3. **物理层(Physical Layer)** - **核心功能**:信号编解码与物理传输,采用差分串行传输(对比PCI的并行传输)[^2]。 - **发送端**: - 对DLLP进行编码(如PCIe 3.0+的128b/130b编码) - 串行化数据并分配到多条通道(Lanes) - 通过差分信号驱动传输 - **接收端**: - 时钟恢复与信号均衡 - 解串行化数据并解码 - 将原始比特流递交数据链路层[^1]。 #### **分层协作流程** ```mermaid graph LR A[应用程序] -->|生成请求| B(事务层:组TLP包) B -->|TLP传递| C(数据链路层:加Seq#/LCRC) C -->|DLLP传递| D(物理层:编码/串行化) D -->|差分信号| E[接收端物理层] E -->|解码| F(接收端数据链路层) F -->|错误校验| G(接收端事务层) G -->|提取数据| H[目标应用程序] ``` 该架构通过分层解耦实现: 1. **事务层**处理语义级操作(如地址映射) 2. **数据链路层**保障传输可靠性(错误重传) 3. **物理层**优化信号完整性(高速串行传输)[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值