0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PCIe总线中的链路初始化与训练

SwM2_ChinaAET 来源:未知 作者:李倩 2018-06-05 09:06 次阅读

PCIe总线中的链路初始化与训练(Link Initialization & Training)是一种完全由硬件实现的功能,处于PCIe体系结构中的物理层。整个过程由链路训练状态机(Link Training and Status State Machine,LTSSM)自动完成,也就说基本没有数据链路层和事务层啥事。

LTSSM在PCIe体系结构中的位置的示意图如下:

在系统复位后,会自动进行链路训练,以达成以下目标:位锁定(Bit Lock)、字符锁定(Symbol Lock,Gen1 & Gen2 Only)、块锁定(Block Lock,Gen3 Only)、确定链路宽度(Link Width)、通道位置翻转(Lane Reversal)、信号极性翻转(Polarity Inversion)、确定链路的数据率(Data Rate)和通道对齐(Lane-to-Lane De-skew)等功能。

下面依次的,简要地介绍一下这些目标。

注:本次连载博文主要Gen2为主,所以一些和Gen3相关的内容只会简单提及,并不会深入地介绍,有兴趣的可以阅读PCIe Spec V3.0或者Mindshare的相关书籍。

首先是

位锁定(Bit Lock):

前面的文章中提到过,PCIe总线采用了一种嵌入式时钟的机制,即发送端只向接收端发送数据信号,并不发送时钟信号(时钟信号影藏在数据信号中)。接收端可以通过CDR(Clock and Data Recovery)逻辑将时钟从数据流中恢复出来,然后再用恢复出来的时钟对数据信号进行采样。当然,时钟恢复需要一定的时间,才能保证时钟信号与数据信号的相位对应关系符合要求。一旦CDR完成了时钟的恢复,我们就说PCIe总线完成了位锁定。

字符锁定(Symbol Lock):

完成了位锁定之后,只是能够准确地识别出数据流中的0和1,还是不知道发送的内容是个啥。对于Gen1&Gen2来说,采用的8b/10b编码,即传输的数据是以10bit为一个字符。LTSSM可以引导物理层相关逻辑通过识别COM字符(K28.5)来确定每个字符的开始与结束为止,即字符锁定。

链路宽度(Link Width):

由于PCIe允许将x1的PCIe卡插入x4、x8甚至是x16的PCIe插槽中。因此在链路训练与初始化过程中,相邻的两个PCIe设备需要相互通信来确定其支持的最大链路宽度。

注:实际上PCIe Spec还允许采用动态带宽的机制,即允许链路宽度和数据率动态调整,以实现降低功耗等功能。

通道位置翻转(Lane Reversal):

有的时候两个PCIe设备的通道排列位置可能不太一致,PCIe Spec允许对默认的通道排列位置重新排列,如下图所示。但是,从大部分的PCIe设备(PCIe卡和插槽等)都是按照统一的标准实现的,一般不会出现这种情况,因此这一功能是可选的。

信号极性翻转(Polarity Inversion):

前面的文章中介绍过,PCIe收发的都是差分信号,有的时候Link两端的设备的对应信号的极性可能是相反的。因此,PCIe Spec允许在链路训练与初始化的时候,对其进行调整,如下图所示。和通道位置翻转(Lane Reversal)不一样的是,信号极性翻转(Polarity Inversion)并不是一个可选项,而是所有标准PCIe设备都应支持的。

链路的数据率(Data Rate):

系统刚复位的时候,链路训练和初始化都是基于2.5G T/s的速率的。如果Link两端的设备都支持更高的速率,则会自动进入Re-training状态,以重新切换速率。

注:PCIe Spec规定,高速率的PCIe设备必须能够向下兼容。即Gen2必须同时支持2.5G T/s和5G T/s。

通道对齐(Lane-to-Lane De-skew):

PCIe链路完成字符锁定后,还需要进行通道对齐。因为有的通道的信号可能先到达,有的可能后到达。PCIe Spec规定PCIe链路应有能力对一定范围了的Lane-to-Lane Skew进行移除,使得各个Lane上的信号是同步的。关于通道对齐,会在后续的博文中详细地介绍。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19093

    浏览量

    304604
  • 总线
    +关注

    关注

    10

    文章

    2877

    浏览量

    88042
  • PCIe
    +关注

    关注

    15

    文章

    1233

    浏览量

    82563

原文标题:【博文连载】PCIe扫盲——链路初始化与训练基础(一)

文章出处:【微信号:ChinaAET,微信公众号:电子技术应用ChinaAET】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    SRIO重复初始化不通了

    专家好: 调试接口时经常会出现重新load程序的情况,发现如果SRIO双方已经进行数据通信,重新加载程序进行SRIO初始化后,srio不通了,需要重新断电重连,这样调试起来比较浪费时间,请问有什么好的方法,可以节省调试时间
    发表于 01-07 11:15

    使用iMPACT无法初始化

    使用iMPACT我无法初始化。在初始边界扫描时,弹出以下错误:有许多未知设备被检测到。按是继续或按否停止。我还收到以下错误:错误:iMPACT - 硬件配置可能存在问题。电缆,扫描
    发表于 09-16 10:32

    CAN总线初始化

    1、CAN总线初始化void can_init(void){CAN_InitTypeDefCAN_InitStructure
    发表于 08-19 07:17

    手机模块初始化向导

    手机模块初始化向导:为了刚好的对手机模块进行初始化,所以把最基本的向导写下来.本向导适用于本公司的西门子TC35I和华为GT9000模块。一、在初始化手机模块前,请先确定DT
    发表于 09-18 09:41 17次下载

    RDA1846S初始化设置

    RDA1846S初始化设置RDA1846S初始化设置RDA1846S初始化设置
    发表于 01-15 17:08 0次下载

    CAN总线控制器SJA1000的初始化程序设计

    CAN总线控制器SJA1000的初始化程序设计。
    发表于 05-06 11:29 12次下载

    UCOS_III_配置与初始化

    UCOS_III_配置与初始化
    发表于 12-20 22:53 5次下载

    objc源码NSObject如何进行初始化

    + alloc 和 - init 这一对我们在 iOS 开发每天都要用到的初始化方法一直困扰着我, 于是笔者仔细研究了一下 objc 源码 NSObject 如何进行初始化。 在具
    发表于 09-26 09:58 0次下载

    PCIe总线必须要先完成Flow Control初始化

    由于VC0是默认使能的,所以当Flow Control初始化开始时,其会被自动的初始化。其他的Virtual Channel是可选的,只有当被配置为使能的时候才会被初始化
    的头像 发表于 05-24 09:18 7924次阅读
    <b class='flag-5'>PCIe</b><b class='flag-5'>总线</b>必须要先完成Flow Control<b class='flag-5'>初始化</b>

    PCIe总线的三种错误报告方式

    PCIe设备的配置空间中的状态与控制寄存器如上图所示,通过这些寄存器可以使能(或禁止)通过错误消息(Error Message)发送错误报告、查询错误状态信息,以及训练
    的头像 发表于 08-23 10:14 1.4w次阅读
    <b class='flag-5'>PCIe</b><b class='flag-5'>总线</b>的三种错误报告方式

    IIC总线初始化基本驱动参考程序应用代码免费下载

    本文档的主要内容详细介绍的是IIC总线初始化基本驱动参考程序应用代码免费下载。程序功能:为IIC总线的基本驱动程序(此程序没有写主函数,只是一些IIC必备的子函数)
    发表于 01-16 08:00 5次下载
    IIC<b class='flag-5'>总线</b><b class='flag-5'>初始化</b>基本驱动参考程序应用代码免费下载

    神经网络如何正确初始化?

    初始化训练深度神经网络的收敛性有重要影响。
    的头像 发表于 05-17 16:32 8116次阅读
    神经网络如何正确<b class='flag-5'>初始化</b>?

    C++之初始化列表学习的总结

    可以使用初始化列表对成员进行初始化
    的头像 发表于 12-24 17:39 839次阅读

    如何在Segger J-Flash设置芯片初始化序列?

    许多微控制器在烧录之前需要一个自定义的初始化序列来初始化目标硬件,例如初始化PLL时钟,关闭看门狗或定义Flash的等待状态。在使用这些对初始化过程有特殊要求的芯片时,在Segger
    的头像 发表于 12-12 10:56 2263次阅读

    DDR4-初始化训练和校准

    上电与初始化是由一系列精心设计的步骤组成的序列(sequence)。一般来说,在系统上电之后,ASIC/FPGA/处理器的 DDR 控制器会被从复位状态释放,自动执行上电与初始化
    的头像 发表于 07-03 11:48 6814次阅读
    DDR4-<b class='flag-5'>初始化</b>、<b class='flag-5'>训练</b>和校准