数据链路层 介于事务层和物理层,主要进行数据链路管理和辅助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)实现状态的切换,该状态机共有三个状态,分别为:
DL_Inactive(表示链路无效状态,不可用,或者没有连接设备) DL_Init(链路可用,将进行VC0的初始化) DL_Active(链路可正常使用)
状态机转换如图所示:
3.2.1 DL_Inactive
hot reset、warm reset、cold reset的初始化阶段,注意DL状态不会被FLR所影响 复位所有DLL状态为初始值 丢弃DLL retry buffer内容
向事务层和数据链路层其他模块报告DL Down状态,事务层将停止发送TLP 对下游设备来说等同于“hot-remove”,对上游设备来说等同于“hot-reset”操作。 丢弃来自事务层和物理层的TLP信息 不再产生或接收DLLP报文
如何退出DL_Inactive状态 事务层报告软件没有失能建立链路,同时物理层报告建立链路,linkUp=1(PCIe gen3/gen4/gen5达到gen1速度即可) 从该状态推出后进入DL_Init状态
3.2.2 DL_init
初始化默认VC(virtual channel)的Flow control 当在FC_Init1状态时报告DL_Down,挡在FC_Init2状态时报告DL_Up。 FC状态详细参考:PCIe控制器——数据链路层——flow control 若某设备DLL表现DL_Down状态,一旦发送ACK的DLLP报文而不能识别对应的TLP,该DLL可以丢弃该TLP
2.3 DL_Active
DL_Active是正常操作状态
在事务层和物理层之间接收和传输TLP 产生和接收DLLP 向事务层和数据链路层报告DL_Up