PCIE学习----数据链路层(1)

本文详细描述了PCIe体系结构中数据链路层的工作原理,包括TLP的发送与接收、ACK/NAK协议的运用、ReplayBuffer确保数据可靠性和ErrorCheck功能。同时讨论了ReplayBuffer容量对系统资源和功耗的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---摘抄于PCI EXPRESS体系结构导读(侵权即删)

        (1)数据链路层主要处理端到端的数据传送。在事务层中,源设备与目标设备间的传送距离较长,设备直接可能经过若干个switch,而在数据链路层中,源设备与目标设备在一条PCle链路的两端。


        (2)数据链路层使用ACK/NAK协议发送和接收TLP,由发送部件和接收部件组成。发送部件由Replay Buffer、ACK/NAK DLLP接收逻辑和TLP发送逻辑组成;而接收部件由Error Check逻辑、ACK/NAK发送逻辑和TLP接收逻辑组成。每一个PCIe设备的数据链路层都含有发送部件和接收部件------图在书中185页,书很好。


        (3)PCIe设备进行数据传递时,首先在事务层中产生TLP,然后通过事务层将这个TLP发送给数据链路层,数据链路层将这个TLP加上Sequence前缀和LCRC后缀后,将这个TLP放入到Replay Buffer中,然后再发送到物理层。


        (4)PCIe总线的数据链路层使用Replay Buffer和Error Check部件共同保证数据传送的可靠性和完整性。来自事务层的TLP首先暂存在Replay Buffer中,然后发送到目标设备。源设备的数据链路层根据来自目标设备的ACK/NAK DLLP报文决定是否重发这些TLP,还是清除Replay Buffer中的TLP。


        (5)Replay Buffer的大小决定了事务层可以暂存在数据链路层的报文数,Replay Buffer的容量越大,在PCIe设备发送流水线中容纳的报文数越多,但容量越大占用的系统资源越多,影响功耗。


        (6)Error check单元检查接收到的TLP,如正确接收,发送ACK DLLP。没有正确接收发送NAK DLLP。


道路且长,行则将至----2024/01/22

### PCIe 数据链路层功能与协议实现详解 #### 数据链路层概述 PCIe数据链路层位于物理层和事务层之间,起到承上启下的作用[^4]。它主要负责确保 TLP(Transaction Layer Packet)在链路上的可靠传输,并通过一系列机制来管理数据流。 --- #### 数据链路层的主要功能 1. **TLP 封装与解封装** 数据链路层接收来自事务层的 TLP 并为其添加序列号以及校验字段(LCRC),形成完整的 DL_Packet 后发送给物理层。同样,在接收到物理层传来的 DL_Packet 后,会验证 LCRC 和序列号并将其还原为原始 TLP 提交给事务层[^2]。 2. **ACK/NAK 协议** 数据链路层实现了基于 ACK/NAK 的重传机制,用于保障数据传输的可靠性。当接收方成功接收到无误的数据包时,会返回 ACK;如果发现错误,则返回 NAK 请求重新发送该数据包。 3. **DLLP (Data Link Layer Packets) 处理** DLLP 是一种特殊类型的短消息帧,主要用于链路管理和状态更新等操作而非实际有效载荷传送。常见的 DLLP 类型包括 Flow Control Credit Return、Power Management State Change Request 等[^1]。 --- #### 发送端逻辑 ##### 总体流程 发送端将从事务层获取到的 TLP 转化成适合于链路上传输的形式——即加上必要的头部信息如 Sequence Number 及 CRC 校验位之后再交由物理层进行电气信号转换输出。 具体步骤如下: - 对每一个新的 TLP 设置初始序号; - 添加相应的 LCRC 字段完成整个 DL_Packet 构造过程; - 随后依据当前可用资源情况决定是否立即发出或者暂时存储等待后续时机尝试再次提交。 ##### 使用 ACK/NAK 协议 对于每一次成功的发送动作都需要期待对方反馈确认信息(ACK),如果没有按时获得正面回应则认为此次通信失败进而触发自动重试机制直至最终能够得到肯定答复为止。 --- #### 接收端逻辑 ##### 处理流程 接收端的任务是对到达的数据单元执行初步检验工作以判断其合法性及完整性状况: - 检查 LCRC 是否匹配; - 核实 Sequence Number 连续性; - 如果一切正常就向源地址回执一份 ACK 报告表明已妥善接纳此份资料副本同时继续准备迎接下一个预期到来者; - 若存在问题则需及时告知发件人存在异常情形以便采取补救措施比如请求重复递交特定编号范围内的项目列表等等。 --- #### 特殊场景支持 当物理层检测不到有效的对端链接时,会通知数据链路层进入 DL Inactive 状态,这意味着此时无法与其他设备建立正常的通讯联系[^3]。这种情况下通常意味着另一侧可能根本没有安装任何硬件组件或者是由于某些原因导致未能激活相应接口电路从而造成双方失去同步关系。 --- ```python class PCIEDataLinkLayer: def __init__(self): self.sequence_number = 0 def send_tlp(self, tlp_data): """ Encapsulate and send a TLP with sequence number and LCRC """ dl_packet = { 'sequence': self.sequence_number, 'data': tlp_data, 'lcrc': calculate_lcrc(tlp_data) } self.sequence_number += 1 return physical_layer_send(dl_packet) def receive_dl_packet(self, packet): """ Process incoming DL Packet by verifying LCRC & Seq Num""" if verify_lcrc(packet['data'], packet['lcrc']) and \ check_sequence_continuity(packet['sequence']): ack_response() else: nak_response() def ack_response(): pass # Implement sending ACK logic here def nak_response(): pass # Implement sending NAK logic here ``` --- #### 结论 综上所述,PCIe 数据链路层不仅承担着基础性的数据转发职责,还引入了一系列复杂的控制策略用来增强系统的稳定性和鲁棒特性。通过对上述内容的学习可以帮助工程师们更加深刻理解 PCI Express 设计背后的智慧结晶及其背后蕴含的技术魅力。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值