产品搜索: 睿盛仿真
您在这里: 首页 > 支持与下载 >  技术文章

技术文章

数据链路层协议

    数据链路层作为处理层和物理层的中间层,为处理层TLP在链路中传递提供可靠机制。数据链路层主要负责TLP的可靠传输。所以数据链路层完成的主要任务是:1、数据交换。接收发送方处理层的TLP包,并送到物理层。另外从物理层接收TLP包并送到接收端的处理层。2、出错检测和裁决。LCRC和序列号(TLP Sequence Number)的生成;存储发送端的TLP用于再试重发;为TLP和DLLP做数据完成性检测(crc校验);DLLP的ack和nack响应;错误指示;链接确认超时重试机制。3、初始化和电源管理。跟踪链路状态并传送链路活动、链路复位、链路失去连连等状态给处理层;4、生成DLLP。用于链路管理功能包括TLP确认、电源管理、流程控制信息(VC通道初始化)交流。在链接两端的数据链路层点对点传输.
    数据完整性检测就是为DLLP和TLP做crc校验DLLP使用crc-16,TLP使用32bit的LCRC,此外,TLP还有一个序列号(sequence Number),用于检测TLP丢失与否。LCRC和sequence Number检测有误的TLP或者在发送过程中丢失的TLP,将被发送端重新发送。发送端存放TLP的备份,在需要的时候将备份发送或者在收到接收端的正确接收确认后清除备份。
    数据链路层跟踪链路连接的状态,并和处理层和物理层交流链路状态,通过物理层来完成对链路的管理。链路层中包含状态机DLCMSM(Data Link Control and Management State Machine)来完成这些任务,以下详细介绍。
    DL_Inactive – Physical Layer reporting Link is non-operational or nothing is connected to the Port
    DL_Init – Physical Layer reporting Link is operational, initialize Flow Control for the default Virtual Channel
    DL_Active – Normal operation mode
Status output:
    DL_Down – The Data Link Layer is not communicating with the component on the other side of the Link.
    DL_Up – The Data Link Layer is communicating with the component on the other side of the Link.

 


    Dl_Inactive状态随PCIE复位之后,将所有数据链路状态信息恢复到默认值,并放弃数据层重试缓冲器中的内容。当数据链路处于DL_Inactive状态时,将通知处理层链路处于非连接状态(DL_Down),处理层将停止发送TLP。数据链路层将不产生和接收DLLP。当接收到处理层的链路不是因软件致不使能的报告和物理层的Physical LinkUP=1b(一个物理层连接标志位)时,状态转换至DL_Init。
    处于DL_Init状态时,初始化流程控制成为VC0通道,当在FC_INIT1初始化阶段时输出DL_Down链路状态给处理层,在FC_INIT2初始化阶段时输出DL_UP连接状态给处理层。在初始化成功和物理层继续传递Physical LinkUp=1b后,状态转换至DL_Active。如果Physical LinkUp=0b,状态转换至DL_Inactive。
    DL_Active就是总线正常运转的状态,数据包TLP和DLLP正常发送和接收,发送DL_Up至处理层。物理层的Physical LinkUp=0b报告使得状态转换至DL_Inactive。
    接下来就要提到流程控制初始化协议(Flow Control Initialization)。上电或者互连复位后,总线正常操作前,需要流程控制初始化至默认虚拟通道VC0。如果需要额外使能其他虚拟通道,必须在初始化VC0之后初始化相应虚拟通道的流程控制机制。VC初始化过程包括以下两个状态:1、FC_INIT1,2、FC_INIT2。
    首先介绍FC_INIT1状态,在需要初始化VC通道时进入FC_INIT1状态,条件是链路处于DL_Init状态,VCx=VC0;某VC通道(1-7)被软件使能。在FC_INIT1状态,处理层阻止TLP的发送,数据链路层为VC通道按以下顺序发送InitFC1 DLLP:1、InitFC1—p;2、InitFC1—NP;3、InitFC1—Cpl。这些DLLP包的发送至少持续24us,并且建议按特定频率重复发送。在这期间,数据链路层不能阻止其他已经被初始化的虚拟通道的数据包发送(包括物理层初始化信息、ack和nak DLLP、TLP)。对接收到的InitFC1和InitFC2 DLLP按以下处理:1.记录FC值(以credit为单位的基本缓冲空间值和类型)2.P、NP、CPL的FC值被记录后,设置Flag FI1。在Flag FI1被设置后,状态转至FC_INIT2。
    在FC_INIT2状态,所做的处理基本与FC_INIT1状态相同,除了对接收到的InitFC2 DLLP处理:以接收到的InitFC2 DLLP设置flag FI2。之后,流程控制初始化结束。
    上面多次提到DLLP,是用于支持链路操作数据信息包。
    Ack DLLP:TLP序列数据确认(sequence Number),用于表明成功接收到某些TLP。
    Nak DLLP:TLP序列数据否定确认,用于初始化数据链路层再试机制。
    InitFC1、InitFC2、UpdataFC DLLP:流程控制初始化。
    此外还有电源管理DLLP。
    数据链路包(DLLP)规范,包结构如下:

 


    保留信息R应设置为0,并被接收端忽略,采用CRC-16bit校验。DLLP Type的编码如下:

    v[2:0]指明需要初始化的虚拟通道。
    Ack、Nak:

    AckNak_Seq_Num域表明那些TLP包受影响,详细介绍后续。
    InitFC1、InitFC2、UpdateFC DLLP:

    HdrFC包含P、NP、Cpl的包头Header的credit值,DataFC包含P、NP、Cpl有效数据负荷的credit值。
PM DLLP:电源管理链路数据包。


    Vendor Specific:


    接下来就讨论数据的完整性了,在数据链路层,使用TLP sequence Number和LCRC校验做TLP的错误检测,用CRC-16做DLLP 的错误检测。包括两部分:一、发送端的LCRC、sequence Number处理和重试(retry)机制。二、接收端的LCRC、sequence Number处理机制。
    在发送端,TLP通过数据链路层进行发送,并进行LCRC计算确保TLP通过链路(Link)时的数据完整性。Sequence Number用于TLP重发机制,在发送端,TLP被存在重发缓冲器,TLP将被重发除非接收到接收端的ack,数据重发多次不成功则发送端裁决链路连接不正常,动用物理层对链路重试,如果接收不到Physical LinkUp=1b,则数据链路层跳转进DL_Inactive状态。12位计数器NEXT_TRANSMIT_SEG用于存贮TLP的Sequence Number,在DL_Inactive设置为000h。12位计数器ACKD_SEG存贮最近接收到的Ack或者Aak DLLP 的Sequence Number确认,初始值设为fffh。2位计数器REPLAY_NUM计数重发次数,初始值为00b。REPLAY_TIMER计时器计时判决什么时候需要重发,有如下规则:在每一次发送的最后一位开始计时,在每一次重发或者nak之后复位重新开始。
    在接收端同样有很多数据位和计时器。NEXT_RCV_SEG保存预期接收到的TLP Sequence Number。标志位NAK_SCHEDULED。计时器AckNak_LATENCY_TIMER,为一个ack应答计时。

  • 地址:西安市高新区丈八一路蓝海大厦西座17层11708室
  • 电话:029-68209877
  • 传真:029-68209867
  • 邮编:710077
  • 邮箱:hr@rasun.cc