PCIe数据链路层图文详细总结-PCIe专题知识(二)

news2024/12/22 14:25:43

目录

  • 前言
  • 一、简介
    • 1.1 接收部件组成
    • 1.2 发送部件组成
  • 二、数据链路层功能详细介绍
    • 2.1 DLLP介绍
    • 2.2 ACK/NAK协议
    • 2.3 发送端逻辑
      • 2.3.1 发送端TLP包处理总流程
      • 2.3.2 使用ACK/NAK协议详解
    • 2.4 接收端逻辑
      • 2.4.1 接收端TLP包处理流程
      • 2.4.2 如何使用ACK/NAK协议
    • 2.5 数据链路层发送报文的顺序
  • 三、其他相关知识介绍
      • 1、PCI总线及发展历程总结
      • 2、PCIe物理层总结-PCIE专题知识(一)

前言

本文主要介绍数据链路层的相关知识,通过详细的图文解析,方便读者快速掌握。

一、简介

PCIe 总线的数据链路层(Data Link Layer)处于事务层和物理层之间,主要进行链路管理(Link Management)、TLP错误检测,Flow Control和Link功耗管理,负责数据链路层包(Data Link Layer Packet,DLLP)的创建,解码和校检,保证来自事务层的 TLP 在 PCIe 链路中的正确传递。
与事务层不同, 数据链路层主要处理端到端的数据传送,本层还实现了Ack/Nak的应答机制,数据链路层不仅可以转发来自事务层的包(TLP),还可以直接向另一个相邻设备的数据链路层直接发送DLLP,比如应用于Flow Control和Ack/Nak的DLLP,如下图所示,具体的知识本章会在下面详细介绍。
在这里插入图片描述

数据链路层由发送和接收两部分组成:

1.1 接收部件组成

1、ACK/NAK DLLP发送逻辑;
2、“Error Check”逻辑;
3、TLP接收逻辑;

1.2 发送部件组成

1、ACK/NAK接收逻辑;
2、Replay Buffer;
3、TLP发送逻辑;

二、数据链路层功能详细介绍

一个正常的数据包经过事务层、数据链路层和物理层会被封装加上不同的头尾用于保存特定的信息,具体如下:
在这里插入图片描述

2.1 DLLP介绍

DLLP产生于数据链路层,终止于数据链路层,设置DLLP的目的是保证TLP的正确传输和管理PCIe链路。
一个DLLP长度为6byte,其中byte0存放DLLP的类型,byte1~ byte3与DLLP的类型有关,byte4~byte5位DLLP的16bit的CRC校验结果。
DLLP报文类型有:
1、 ACK DLLP:由数据接收方发送给数据发送方,该DLLP表示接收方正确接收到来自发送方的TLP。
2、 NAK DLLP:由数据接收方发送给数据发送方,该DLLP表示哪些TLP没有被正确接收,在接收到该TLP时,接收方“Replay Buffer”加释放已经被正确接收的TLP。
3、 Power Management DLLPs:PCIe设备使用过该组DLLPs进行电源管理,并向对端设备通知当前PCIe链路的状态,拥有保证电源管理状态机的正确运行。
4、 FLOW Control Packet DLLPs:流控制DLLP,包括InitFC1、InitFC2、UpdateFC DLLP等类型,用于流量控制。
5、 Vendor_Defined DLLPs:厂商自定义DLLP。
在这里插入图片描述

2.2 ACK/NAK协议

数据链路层还实现了一种自动的错误校正功能,即Ack/Nak机制。
如下图所示,发送方会对每一个TLP在Replay Buffer中做备份,直到其接收到来自接收方的Ack DLLP,确认该DLP已经成功的被接受,才会删除这个备份。
在这里插入图片描述

ACK/NAK协议详细介绍:
如果接收方发现TLP存在错误,则会向发送发发送Nak DLLP,然后发送方会从Replay Buffer中取出数据,重新发送该TLP。
ACK/NAK是一种滑动窗口协议,PCIe设备数据链路层的发送端和接收端分别有一个滑动窗口,发送端在发送TLP时,首先将这个TLP存放到发送窗口(这个窗口就是“Replay Buffer”)中,并对这些TLP从0~n进行编号,只要发送窗口不满,发送端就一直发送端就一直可以从事务层接收报文存放到发送窗口中。
当发送端收到接收端第n个ACK确认报文后,表示第n、n-1……0等在“Replay Buffer”的报文已被正确接收,然后滑动窗口,释放已被确认的TLP,提高PCIe总线的传输效率。

下图是数据链路层Ack/Nak机制详细的结构图,理解了这幅图就基本掌握了Ack/Nak机制,下面会详细介绍该图。
在这里插入图片描述

2.3 发送端逻辑

2.3.1 发送端TLP包处理总流程

1、为TLP分配Sequence ID;
2、为TLP增加LCRC;
3、将TLP在Retry Buffer备份;
4、发送端检查接收端返回的DLLPs;

2.3.2 使用ACK/NAK协议详解

1、数据链路层在发送TLP之前,首先要给这个TLP添加一个Sequence前缀和LCRC后缀,之后再将TLP放入“Replay Buffer”中。
2、发送端设置了一个12bit的计数器NXT_TRANSMIT_SEQ, 简称NTS,这个计数器的初始值为0,在数据链路层处于Inactive状态时该计数器保持为0。
3、发送端使用NXT_TRANSMIT_SEQ保存即将发送TLP的Sequence号,PCIe设备每发送完一个TLP,该计数器加一,然后把累加后的数值再赋值给下一个TLP,直到4095。
4、同时接收方也有一个12bit的NXT_RCV_SEQ,该计数器记录接收端即将接收的TLP总线号(Sequence Number)。
5、发送端为了处理来自接收端的ACK/NAK DLLPs,设置了一个ACKD_SEQ,该计数器记录ACK/NAK DLLP中的AckNack_Seq_Num字段,该计数器的初始值为全1,数据链路层为Inactive状态时,保持为全1,在接收到接收方的ACK/NAK DLLP时,将使用ACK/NACK DLLP中的AckNak_Seq_Num字段更新ACKD_SEQ计数器。
在这里插入图片描述

2.4 接收端逻辑

2.4.1 接收端TLP包处理流程

1、接收端对接收的TLP进行LCRC检查;
2、LCRC检查OK,检查Sequence ID;
3、Ack/Nak Latency Timer;

2.4.2 如何使用ACK/NAK协议

接收端首先从物理层获得TLP,此时这个TLP中包含Sequence前缀和LCRC后缀,接收端收到这个TLP后,首先将这个报文放入receive buffer中,然后进行CRC检查,检查成功时,结束段将根据缓存的阈值发送ACK DLLP给发送端。
ACK 应答原则:
(1)接收端收到一定数量的报文后,统一发送给一个ACK给发送方
(2)接收端收到的报文未达到阈值,但是ACK_NACK_LATENCY_TIMER计数器超时后,仍要发出ACK DLLP。
在这里插入图片描述

2.5 数据链路层发送报文的顺序

数据链路层还规定了报文发送的顺序,因为DLLP、TLP、PLP(物理层包)使用同一链路,因此PCIe链路需要合理安排报文发送顺序,防止死锁:
1、 正在发送的TLP、DLLP报文,为了报文的完整性,正在传输的报文享有最高优先级。
2、 PLP,协议底层的报文优先级高于协议高层的报文,这是避免传输死锁的一种有效方法。
3、 NACK(原因同2)
4、 ACK,(一般来说。错误信息报文具有更高优先级)
5、 重传的TLP,也是一种发现错误后的恢复手段,在错误未处理完毕之前,所有TLP的传递没有意义,接收端都将丢弃这些报文。
6、 数据缓冲区的TLP
7、 其他DLLP,包括地址路由、电源管理等报文,与数据报文的传递无关,是PCIe总线规定的一些控制报文,优先级高的话会占用较多传输资源,降低通信带宽,所有优先级最低。

三、其他相关知识介绍

1、PCI总线及发展历程总结

2、PCIe物理层总结-PCIE专题知识(一)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/484302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java每日一练(20230503)

1. 外观数列 给定一个正整数 n ,输出外观数列的第 n 项。 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列: countAndSay(1) "1"c…

[AION]我眼中的《永恒之塔私服》

当我第一次看到《永恒之塔私服》我被它那华丽的画面吸引了。      三维做的很逼真,他的三维技术,华丽的三维景象,从maya设计者专业的角度上说,他是一部做工完美的游戏,不管是他的背景还是他的人物。都比以前很多游…

Python每日一练(20230503)

目录 1. 外观数列 🌟🌟 2. 找出素数对 ※ 3. 子集 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 外观数列 给定一个正整数 n…

Dockercompose编排

目录 一、Dockercompose简介 1、compose概述 2、YAML简介 1、概述 2、YAML支持的数据结构 二、compose部署 1、Docker compose环境安装 Docker compose常用字段 Docker compose常用命令 Docker Compose文件结构 2、准备依赖文件 3、编写配置文件docker-compose.yml…

fps枪械案例

文章目录 一、 介绍二、 知识点三、 鼠标移动控制视角四、 人物行走、奔跑、跳跃、下蹲、音效五、 射击、射速、瞄准、弹痕、枪火、弹壳、文本六、 手臂摇摆七、 步枪切换到手枪八、 切枪效果九、 添加各种动画 一、 介绍 经典fps案例 行走、奔跑、跳跃、切枪、换弹、武器展示…

gitlab搭建以及自动化部署

一、安装gitlab 首先下载gitlab的安装包,地址如下: https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu/pool/bionic/main/g/gitlab-ce/ 然后安装下载的包即可,一般还需要安装openssh-server等依赖包,在安装gitlab包之前可以…

正则表达式-基本元字符和语法规则

© Ptw-cwl 文章目录 字符匹配元字符.元字符[]元字符[^]元字符*元字符元字符?元字符{}元字符|元字符()元字符^元字符$元字符\元字符\d元字符\w元字符\s元字符\b元字符\B元字符*?、?、??、{n,m}?元字符(?)、(?!)元字符(?:)元字符\1、\2等元字符^、$元字符&#x…

【刷题之路Ⅱ】LeetCode 274275. H指数ⅠⅡ

【刷题之路Ⅱ】LeetCode 274&275. H指数Ⅰ&Ⅱ 一、题目描述二、解题1、方法1——排序1.1、思路分析1.2、代码实现1.3、升级到275题的二分法1.3.1、思路分析1.3.2、代码实现 2、方法2——计数排序2.1、思路分析2.2、代码实现 一、题目描述 原题连接: 274. H…

C语言专升本编程题复习

1.求100以内的素数 int main( ) { int i,j,count0;for(i1;i<100;i){for(j2;j<i;j){if(i%j0)break;}if(ij){count; printf("%d ",i);if(count%50)printf("\n");}} }2.求1000以内的完数 * 完数&#xff1a;等于其因子&#xff08;不含本身&…

【五一创作】SAP入门到放弃系列之批次确定配置

概念&#xff1a; 在后勤涉及物料移动或消耗流程中&#xff0c;从采购到生产到销售&#xff0c;涉及启用批次的物料&#xff0c;需要一次又一次地为出入库业务中的库存指定批次。如果企业的出库库批次管理有一定的管理要求&#xff0c;比如先进先出&#xff0c;就可以针对货物…

基于Java语言开发B/S架构实现的云HIS

一、云HIS系统框架简介 1、技术框架 &#xff08;1&#xff09;总体框架&#xff1a; SaaS应用&#xff0c;全浏览器访问 前后端分离&#xff0c;多服务协同 服务可拆分&#xff0c;功能易扩展 &#xff08;2&#xff09;技术细节&#xff1a; 前端&#xff1a;AngularNg…

级数可视化

泰勒级数 数学家们普遍偏爱多项式&#xff0c;如果评选一下高等数学里面最重要的公式&#xff0c;泰勒公式一定榜上有名&#xff0c;泰勒公式的核心思想就是把一个给定的任意函数&#xff0c;展开成多项式的形式&#xff0c;如果是有限项&#xff0c;就像作泰勒多项式&#xf…

深入了解云计算:发展历程、服务模型、未来趋势

开篇博主 bluetata 的观点&#xff1a;PaaS 服务必将是未来10年云计算权重最高的趋势&#xff08;05/02/2023 15:32&#xff09; 文章目录 一、前言二、认识了解云计算2.1 什么是云计算2.1.1 维基百科上的云计算定义2.1.2 NIST 标准云计算定义2.1.3 如果被面试如何解释云计算 2…

MYSQL-数据库管理(下)

查看数据库信息 show database 查看数据库中的表信息 use 数据库名 #切换到书库中 show tables show tables in mysql 显示数据表的结构&#xff08;字段&#xff09; describe user; Field:字段名称 type:数据类型 Null :是否允许为空 Key :主键 Type:数据类型 Null :是否…

武忠祥老师每日一题||不定积分基础训练(五)

∫ x f ′ ( x ) d x \int xf{}(x)\,{\rm d}x ∫xf′(x)dx ∫ x d f ( x ) \int x\,{\rm d}{f(x)} ∫xdf(x) x f ( x ) − ∫ f ( x ) d x xf(x)-\int f(x)\,{\rm d}x xf(x)−∫f(x)dx 由题知&#xff1a; f ( x ) ( ln ⁡ 2 x ) ′ 2 ln ⁡ x 1 x 2 ln ⁡ x x f(x)({…

宋爽:利用大数据解码遗传学的秘密 | 提升之路系列(七)

导读 为了发挥清华大学多学科优势&#xff0c;搭建跨学科交叉融合平台&#xff0c;创新跨学科交叉培养模式&#xff0c;培养具有大数据思维和应用创新的“π”型人才&#xff0c;由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

【Git】Gitee免密push(TencentCloudLinux)

前提&#xff1a; 我用的是腾讯云的Centos(Linux)服务器 我创建好了仓库 我配置过git 可以正常用密码push 以上自行解决 我们直接配置公钥解决免密push 1.在服务器上创建公钥 在用户根目录创建 公钥 邮箱写自己的 随意写 我写的是gitee绑定的邮箱 ssh-keygen -t ed25519 -C…

第四期 微信云开发之订阅消息以及定时发送(触发器)

前言 在我们开发过程中&#xff0c;很多场景都会使用到微信小程序订阅消息功能&#xff0c;例如打卡通知、订餐通知等等。但是在云开发过程中&#xff0c;没有后台的情况下&#xff0c;如何进行消息的定时通知呢&#xff1f;下面我将从小程序订阅消息到定时发送订阅消息进行一个…

改进YOLOv5:结合位置编码CoordConv,提升行人目标等预测能力 | 卷积加上坐标,从而使其具备了空间感知能力

CoordConv:给卷积加上坐标,从而使其具备了空间感知能力 核心代码CoordConv代码common代码:yolo注册yaml文件:测试众所周知,深度学习里的卷积运算是具有平移等变性的,这样可以在图像的不同位置共享统一的卷积核参数,但是这样卷积学习过程中是不能感知当前特征在图像中的坐标…

STM-32:SPI通信外设

目录 一、前言二、SPI功能框图三、SPI通信读写数据 一、前言 STM32的SPI外设可用作通讯的主机及从机&#xff0c;支持最高的SCK时钟频率为fpclk/2 (STM32F103型号的芯片默认 fpclk1为 36MHz&#xff0c;fpclk2为 72MHz)&#xff0c;完全支持 SPI协议的4种模式&#xff0c;数据…