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

PCIE基础学习之物理层学习基础

目录

逻辑物理层:

链路训练和初始化:

训练机制:

电气物理层:

有序集:

整体协议机制:

发起方:

接收方:


物理层是PCIE的最底层,TLP 和 DLLP数据包都要经过物理层才能发送给对方。在协议中将物理层的分为两个部分:逻辑部分和电气部分。

逻辑物理层主要包含数字处理,其中主要是将链路上的数据包采样,并串转换等处理;电气部分主要包含物理层的模拟电路接口,为每个通道提供差分驱动器和接收器。

逻辑物理层:

接收端接收到的TLP和TLLP会被物理层的buffer记录,在这个缓存中会对数据包加上start 和 end 字符,这样做是为了方便接收端能识别出边界。

在物理层中,数据包的每个字节都会被分割到链路所使用的所有通道里,这个过程叫做字节条带化。实际上,每个通道在链路上都是独立的串行传输路径,这些通道又在各自的数据接收端聚合。

在传输的过程中,每个字节都进行扰码。对于前两代PCIE来说,使用的编码方式是8b/10b。对于第三代,采用了128b/130b编码。

接收端接收到数据后解码,使用串并转换器将比特流转换成字节流,字节流再通过一个缓存跨时钟后,反条带化之后将所有通道内的字节聚合重新恢复成数据。

链路训练和初始化:

物理层的其他任务是将链路初始化以及训练。

链路训练是为了确保 发起端和接收端时钟同步,极性一致,链路宽度匹配以及速率吻合等。

训练机制:

链路训练通常会发送和接收特定的序列(sequence)来完成。发起端会发送一系列的训练符号,接收端会接收这些训练符号进行时钟恢复,符号锁定,极性检测等,然后将自身状态反馈给发起端。发起端如果发现不对就再次发起训练,直到优化完成。就像两个人反复确认一件事的细节一样。

该机制一般会涉及到几个步骤:

位锁定:接收端会从接收的串行数据中提取时钟信号,此时接收端内部的时钟恢复电路会不断调整,直到与发起端同步。

符号锁定:时钟同步之后,接收端会锁定数据的符号边界。

极性判断:由于插拔的卡槽连接翻转或者信号极性反转,接收端会自动检测发起端的极性并自动调整,以确保信号极性与发起端的一致。

链路交互:发起端和接收端会交互各自的链路通道信息,并选择一个 双方都支持的最大链路宽度。

通道翻转:发起端与接收端的通道存在物理翻转时,接收端会自动调整通道,以确保通道的连接顺序一致。

电气物理层:

物理层的发送器和接收器是通过一个交流耦合链路相连,在两设备连接的物理路径上有电容,让信号高频通过,阻塞低频部分。

由于发起端的接收端的参考电压可能不同,为了实现这个功能,串行总线常常会在物理层加入电容。

有序集:

有序集只在设备的物理层传输,起始于发送端的物理层,终止于接收端的物理层。 物理层的有序集并没有做成数据包的形式,它是一种物理层的数据流,英文称作Order set。

我们也称作它为PLP(physical layer packet)。 一个order set使用一个单独的COM字符作为起始,后面跟着3个及以上的其他字符用于定义传输信息,有序集在传输时只会终止于链路的对端设备,不会被switch路由到PCIE网络中。

有序集的长度是4字节的整数倍,主要参与链路训练,时钟补偿等,还可以指示链路进入或者退出低功耗状态

整体协议机制:

发起方:

现在以一个内存读请求的例子讲述整个PCIE协议,这个请求过程从发起方发起内存读请求开始,直到发起方从完成方获得所请求的数据为止。

首先发起方的设备核心层(软件层)向事务层发起一个请求,请求中包含了这些信息:32bit 或者64bit 的内存地址,事务类型,要读取的数据总理(以DW) 为单位,流量分类(traffic class) ,字节使能,属性等。

事务层使用这些信息来构建一个MRd TLP 。这个TLP的header大小为3DW 或者4DW,这取决于地址字段的大小(32位地址就是3DW,64位地址就是4DW) 。同时事务层会向Header中加入该请求方ID(BFD)。然后TLP将会被放入相应类型的虚拟通道中,等待被发送。一旦这个TLP被选中,那么流量控制逻辑 就会确认对端设备的接收buffer是否能够接收。之后 MRd TLP就会被发送到数据链路层。

在数据链路层,数据包被加上12bit的序列号 以及32bit的LCRC,并在replay buffer中保留这个TLP的副本,然后将数据发送至物理层。

在物理层里,数据包被加上start和end字符,然后再所有可用的通道上进行字节条带化,8b/10b编码 ,加扰,最终以差分形式输出给对端。

接收方:

接收方对输入的比特流完成串并转换后恢复成10bit,之后经过跨时钟缓存,10bit数据被解码恢复成字节,每个通道上的字节都会被解扰以及反条带化。物理层开始检测start 和 end 字符并把它们剥除,将剩下的TLP发送给链路层。

接收方链路层对该TLP进行LCRC校验,并检查序列号。检查没错时链路层会生成一乐Ack包,里面包含了与该MRd TLP相同的序列号,然后给Ack加上16bit的CRC组成一个Ack DLLP,将这个DLLP发给物理层,有物理层加上组帧符号并传送给发起方。

发起方的物理层接收到Ack DLLP之后,对其组帧符号进行检查和剥除,然后发到链路层。如果链路层CRC检查无错,它会用Ack DLLP内的序列号与replay buffer中的TLP副本的序列号作比较,匹配的TLP副本会从replay buffer中清除。相反,如果接收到Nak DLLP, 那么就会将匹配的这个MRd TLP进行重传。

除了产生Ack DLLP之外,接收端的链路层还会将TLP发送给它的事务层。在事务层中,TLP被放置于合适的虚拟通道接收缓存中,等待对TLP进行ECRC校验(可选),若是校验无错就会发送给软件层。

为了完成请求,接收端的设备核心层(软件层)完成数据访问之后会向它的事务层发送一个Cpld请求(completion with data) ,cpld中包含了于Mrd 相同的requester ID tag 以及事务类型和数据payload等。

事务层使用这个cpld请求中的信息构建一个CplD TLP ,这种TLP的header固定为3DW(CplD TLP使用requester ID进行路由,不会使用到64bit地址)。同时该事务层会将自身的completer ID加到 CplD TLP Header中。之后这个数据包被放到适合的虚拟通道发送缓存中,一旦虚拟通道的冲裁机制选中要发送的cpld TLP ,流量控制逻辑会先确认对端是否有可用空间,之后再发给链路层。

接收端的链路层同样会给数据包加上12bit 的序列号和32bit的LCRC,同时在自身的replay buffer中保留副本,之后将数据发送至物理层。

物理层加入同样的start和end字符并进行同样的硬件操作,最终发送给对端。

发起端接收到这个完成请求包并作一系列的解码,剥除后,其链路又会产生一个ack DLLP,以同样的方式发送给接收端,由接收端判断是否需要重传。

同时发起端的事务层校验TLP(ECRC可选),校验无错之后将收到的cpld TLP 的header和数据payload交给软件层,至此数据请求就全部完成了。


文章转载自:

http://LBoTZbU7.Lstmg.cn
http://HMIojx96.Lstmg.cn
http://ddBHJJfL.Lstmg.cn
http://qDVG9TQX.Lstmg.cn
http://0cwc0xM7.Lstmg.cn
http://vBcwcVQJ.Lstmg.cn
http://bGc68ry2.Lstmg.cn
http://JDtstUFe.Lstmg.cn
http://fgkCNlPE.Lstmg.cn
http://ZtTxRstG.Lstmg.cn
http://QsixpLIh.Lstmg.cn
http://xTx7bTYx.Lstmg.cn
http://Y0yNoCRN.Lstmg.cn
http://aviIyNn6.Lstmg.cn
http://C4whNUUu.Lstmg.cn
http://vCzGVewK.Lstmg.cn
http://GFkSxKvF.Lstmg.cn
http://KwZGEjhi.Lstmg.cn
http://fojOKSZl.Lstmg.cn
http://OTrPp7ng.Lstmg.cn
http://GKtMYYY2.Lstmg.cn
http://REHIucQi.Lstmg.cn
http://GraNxG10.Lstmg.cn
http://1h4vReOo.Lstmg.cn
http://C8NMj6yK.Lstmg.cn
http://aJRkSAjl.Lstmg.cn
http://FsyJFa75.Lstmg.cn
http://ug4i8I0C.Lstmg.cn
http://Jiy0kRkA.Lstmg.cn
http://qz1Ymjq7.Lstmg.cn
http://www.dtcms.com/a/382317.html

相关文章:

  • Day 02 geant4如何构建几何模型以及材料填充-------以B1为实例
  • C# LINQ 的发展故事:从 “碎片化查询” 到 “语言级统一”
  • 电涌保护器:为现代生活筑起一道隐形防雷网
  • STM32项目分享:基于物联网的灭火器智能监测系统
  • 嵌入式 Linux 启动机制全解析:从 Boot 到 Rootfs
  • 图神经网络分享系列-SDNE(Structural Deep Network Embedding) (三)
  • DDIM和DDPM之 间的区别与联系
  • dumpsys power 简介
  • NO.10:氖:霓虹灯
  • TA-VLA——将关节力矩感知融入VLA中:无需外部力传感器,即可完成汽车充电器插入
  • Ubuntu 系统中 Miniconda 虚拟环境(以 SGlang 为例)的备份与还原详细总结
  • Q2(门式)起重机司机实操考点有哪些?
  • leetcode58:最后一个单词的长度(尾指针逆向扫描,结合151反转字符串对比)
  • 链表运用到响应式中
  • 自动驾驶中的传感器技术46——Radar(7)
  • Windows_MediaFeaturePack_x64_1903_V1.msu
  • Class56 束搜索
  • 【Redis#10】渐进式遍历 | 数据库管理 | redis_cli | RES
  • Java面试问题记录(三)
  • 在Excel和WPS表格中批量删除数据区域的批注
  • 商品库存扣减方案
  • smartctl Current_Pending_Sector 硬盘待处理扇区
  • 并发和高并发
  • 科技信息差(9.13)
  • 文档长期不更新导致知识过时如何解决
  • Python学习-day9 字典Dictionary
  • Ubuntu22.04更换阿里镜像源,ubuntu更换源
  • 仓颉编程语言青少年基础教程:Struct(结构)类型
  • C语言数据结构实战:从零构建一个高性能的顺序栈
  • 数据链路层总结