数据链路层介于事务层和物理层,主要进行数据链路管理和辅助TLP报文的传输。

一、概述

二、硬件模块

DLL层连通事务层和物理层,硬件架构如下图所示

在这里插入图片描述

  • DLLP_check模块主要功能是接收物理层发送的DLLP和TLP包,并进行包格式检查,按DLLP包的类型进行分类。
  • TLP_check模块功能是对接收到的TLP包进行CRC和协议检查。如果没有出现问题,则将数据发送到事务层,并告知DLLP GEN模块,发送DLLP给发送方确认数据传输情况。
  • ACK/NAK packets模块是对收到的ACK/NAK DLLP进行解析,并把结果发送给retry buffer,帮助retry buffer判断是否需要重新发送TLP或是将存储的TLP删除。
  • Retry buffer模块:缓存已发送的TLP包,并根据收到的ACK/NAK DLLP包的结果判断是否需要重新发送或是将已经收到确认信息的TLP删除。Retry Buffer在进行重发的时候,数据链路层不再从事务层接收TLP,因此不能同时进行读写,所有是单端口的RAM。
  • DLLP_ARB模块:对要发送的DLLP和TLP进行仲裁,并按优先级进行发送,一般顺序是:完成事务TLP的数据包和当前需要发送的DLLP优先级最高,其次是Nak DLLP,接下来是Ack DLLP、retry buffer中的重传TLP,最后是正在等待的TLP。
  • TLP packets Gen模块:接收事物层发送的数据,并加上sequence、LCRC等数据链路层信息。再发送给DLLP_ARB,同时把数据存入retry buffer,并在需要retry的时候,从retry buffer取数据发送。
  • DLLP_Gen模块:根据事物层发送的信息和DLCMSM、接收到的TLP包、POWER management状态等条件产生DLLP包。
  • DLCMSM模块:Data Link Control and Management State Machine,数据链路控制与管理状态机。将物理层和PCIe的链路层状态报告给数据链路层进行监控,管理和控制数据链路层,包含DL_Inactive、DL_Init、DL_Active三个状态并把链路层状态发送给事物层和物理层,与物理层的链路训练与重定向关联紧密。
  • PM(power management, 电源管理)模块功能负责系统的电源状态与管理。

三、数据链路层的状态机(DLCMSM)

3.1 数据链路层状态

根据DLCMSM的值,数据链路层将对外表现出两种状态:DL_Down和DL_Up

  • DL_Down:DLL将不会和链路对面的设备进行通信
  • DL_Up:DLL可以和链路另一侧设备通信

3.2 数据链路控制和管理状态机(DLCMSM)

PCIe总线的数据链路层通过数据链路控制和管理状态机(DLCMSM)实现状态的切换,该状态机共有三个状态,分别为:

  1. DL_Inactive(表示链路无效状态,不可用,或者没有连接设备)
  2. DL_Init(链路可用,将进行VC0的初始化)
  3. DL_Active(链路可正常使用)

状态机转换如图所示:
在这里插入图片描述

3.2.1 DL_Inactive

  • 如何进入DL_Inactive状态
  1. hot reset、warm reset、cold reset的初始化阶段,注意DL状态不会被FLR所影响
  2. 复位所有DLL状态为初始值
  3. 丢弃DLL retry buffer内容
  • DL_Inactive行为
  1. 向事务层和数据链路层其他模块报告DL Down状态,事务层将停止发送TLP
    对下游设备来说等同于“hot-remove”,对上游设备来说等同于“hot-reset”操作。
  2. 丢弃来自事务层和物理层的TLP信息
  3. 不再产生或接收DLLP报文
  • 如何退出DL_Inactive状态
    事务层报告软件没有失能建立链路,同时物理层报告建立链路,linkUp=1(PCIe gen3/gen4/gen5达到gen1速度即可)
    从该状态推出后进入DL_Init状态

3.2.2 DL_init

  • DL_Init状态行为
  1. 初始化默认VC(virtual channel)的Flow control
  2. 当在FC_Init1状态时报告DL_Down,挡在FC_Init2状态时报告DL_Up。
    FC状态详细参考:PCIe控制器——数据链路层——flow control
  3. 若某设备DLL表现DL_Down状态,一旦发送ACK的DLLP报文而不能识别对应的TLP,该DLL可以丢弃该TLP
  • 如何退出DL_Init状态进入DL_Active状态
    FC初始化完成,同时物理层报告链路建立,linkUp=1

  • 如何退出DL_Init状态进入DL_Inactive状态
    物理层报告链路断开,linkUp=0

2.3 DL_Active

DL_Active是正常操作状态

  • DL_Active状态行为
  1. 在事务层和物理层之间接收和传输TLP
  2. 产生和接收DLLP
  3. 向事务层和数据链路层报告DL_Up
  • 如何退出DL_Inactive
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐