【摘要】:数据链路层使用ACK/NAK协议发送和接收TLP,由发送部件和接收部件组成。图7-1 数据链路层的拓扑结构实际上每个PCIe设备的数据链路层都含有发送部件和接收部件。图7-2 数据链路层TLP的格式数据链路层使用ACK/NAK协议保证TLP的正确传送,ACK/NAK协议是一种滑动窗口协议,该协议的详细介绍见第7.2节。源设备的数据链路层根据来自目标设备的ACK/NAK DLLP报文决定是重发这些TLP,还是清除保存在Replay Buffer中的TLP。
数据链路层使用ACK/NAK协议发送和接收TLP,由发送部件和接收部件组成。其中发送部件由Replay Buffer、ACK/NAK DLLP接收逻辑和TLP发送逻辑组成;而接收部件由“Error Check”逻辑、ACK/NAK发送逻辑和TLP接收逻辑组成。数据链路层的拓扑结构如图7-1所示。在该图中含有两个PCIe设备,分别为Device A和Device B,使用的PCIe链路为Device A的发送链路,同时也为Device B的接收链路。
图7-1 数据链路层的拓扑结构
实际上每个PCIe设备的数据链路层都含有发送部件和接收部件。而上图为简化起见,仅含有Device A的发送部件和Device B的接收部件,即Device A发送链路两端使用的两个部件。Device A和Device B也具有接收部件和发送部件,这两个部件由Device B的发送链路使用,Device B发送链路的工作原理与Device A类似,本节对此不做详细介绍。
当PCIe设备进行数据传递时,首先在事务层中产生TLP,然后通过事务层将这个TLP发送给数据链路层,数据链路层将这个TLP加上Sequence前缀和LCRC后缀后,首先将这个TLP放入到Replay Buffer中,然后再发送到物理层。
目标设备(Device B)从物理层接收TLP时,将首先获得带前后缀的TLP,该TLP经过数据链路层传递给事务层时,将被去掉Sequence前缀和LCRC后缀。在数据链路层中,TLP的格式如图7-2所示。
(www.chuimin.cn)
图7-2 数据链路层TLP的格式
数据链路层使用ACK/NAK协议保证TLP的正确传送,ACK/NAK协议是一种滑动窗口协议,该协议的详细介绍见第7.2节。其中Sequence前缀存放当前TLP的序列号,滑动窗口协议需要使用这个序列号。该序列号可以循环使用,但在同一个时间段内,一条PCIe链路不能含有Sequence前缀相同的多个TLP。而LCRC后缀存放当前TLP的校验和。
PCIe总线的数据链路层使用Replay Buffer[29]和Error Check部件共同保证数据传送的可靠性和完整性。来自事务层的TLP首先暂存在Replay Buffer中,然后发送到目标设备。源设备的数据链路层根据来自目标设备的ACK/NAK DLLP报文决定是重发这些TLP,还是清除保存在Replay Buffer中的TLP。
Replay Buffer的大小决定了事务层可以暂存在数据链路层的报文数,Replay Buffer的容量越大,在PCIe设备发送流水线中容纳的报文越多,从而也容易保证流水线不会因为发送部件出现underrun而中断,但是Replay Buffer的容量越大,占用的系统资源也越多,从而影响PCIe设备的功耗。在一个实际应用中,芯片设计者需要根据PCIe链路的延时确定数据链路层Replay Buffer的大小,在第12.4.1节中将进一步介绍Replay Buffer的大小与PCIe链路延时间的关系。
在PCIe设备的数据链路层中,还含有一个Error Check单元。PCIe设备使用Error Check单元检查接收到的TLP,并决定如何向对端设备进行报文回应。如果TLP被正确接收,PCIe设备将向对端设备发送ACK DLLP[30];如果TLP没有被正确接收,PCIe设备将向对端设备发送NAK DLLP。
除了ACK/NAK DLLP之外,数据链路层还定义了一系列数据链路层报文DLLP,以保证PCIe链路的正常工作。这些DLLP都产生于数据链路层,并终止于数据链路层,并不会传送到事务层。有关DLLP格式的详细描述见第7.1.3节。
相关推荐