PCI Express学习篇---链路层(一)ACK/NAK协议介绍

2024-03-15 00:30

本文主要是介绍PCI Express学习篇---链路层(一)ACK/NAK协议介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

声明:此文章为原创,转载请注明 转自https://blog.csdn.net/weixin_48180416/article/details/117390013

数据链路层是为了保障TLP包的可靠传输,尽管Spec中规定了误码率小于10^-12,但是仍然会发生错误带来一些问题,单个bit的错误会使整个数据包被损坏。速率的提升会使这个问题更加显著。

为了实现链路层的保护,引入错误检测的编码---LCRC,计算范围是Sequence Number+TLP header+payload+ECRC。

接收端需要检查LCRC是否正确,Sequence Number是否正确,Receiver端通过ACK包告知接收到了正确的TLP包,通过NAK告知接收到了错误的TLP包。

以下介绍实现ACK/NAK协议的组件


发送端:

  • NEXT_TRANSMIT_SEQ: 记录下一个要发送的Sequence Number的值,最大值是4095之后会回0;
  • LCRC Generator: 产生32bit CRC, 计算范围包含TLP和Seq;
  • Replay Buffer: 按照发送的顺序存储TLP,包含Seq(2B)+Header(up to 16B)+Optional Payload(up to 4KB)+Optional ECRC(4B)+LCRC(4B),当收到ACK时会清除replay buffer内Seq小于或等于ACK包Seq的TLP,设计中允许一个ACK代表多个成功的TLP;当收到NAK时会清除replay buffer内Seq小于或等于NAK包Seq的TLP(因为NAK记录的是最后一个正确TLP的Seq),然后重传replay buffer中的所有TLP;
  • REPLAY_TIMER: 实质上是一个看门狗计数器,当timeout时还是没有收到ACK/NAK包就会replay并且restart;
  • REPLAY_NUM: 2bit Counter, 记录重传的次数,当从11 roll over到00(说明replay了4次),数据链路层就会自动force物理层重新训练状态机(LTSSM会进入Recovery状态);
  • ACKD_SEQ: 12bit寄存器,存储着最近收到的ACK/NAK的Seq,如果收到的ACK/NAK是"later Sequence Number"(可能存在4095->0 roll over的情况)可以认为是forward progress, 这个时候就可以清除replay buffer里面的TLP(replay buffer Seq <= ACK/NAK Seq),复位REPLAY_TIMER和REPLAY_NUM;
  • DLLP CRC Check: 检查DLLP的16bit CRC, 如果检测到错误,DLLP会丢弃并且会报告Correctable Error,DLLP包没有重传和校正的机制,只能期待下一个成功的ACK/NAK DLLP。

注:NEXT_TRANSMIT_SEQ - ACKD_SEQ不允许大于总Counter的一半,例如NEXT_TRANSMIT_SEQ - ACKD_SEQ = 2048时,链路层就不会从事务层接收TLP,直到有新的回应。如果发生了超过一半的情况,数据链路层会报告protocol error。

接收端:

收到的TLP会先检查LCRC错误,然后检查Sequence Number。如果没有错误的话TLP会传递到事务层,如果有错误,TLP会丢弃并且scheduled NAK除非已经有NAK outstanding。

  • LCRC Error Check:检查LCRC错误,如果计算的LCRC和TLP的LCRC不匹配,说明TLP中有bit错误,就会丢弃TLP并且发NAK;
  • NEXT_RCV_SEQ(NRS): 12bit计数器,跟踪下一个期待接收的Seq Num, TLP有CRC错误或无效包("nullified")或Seq Num Check有错误,就不会传到事务层,并且不会增加这个计数器;
  • Sequence Number Check:检查完LCRC OK后,检查接收的TLP Seq Num与NRS是否一致,存在以下三种情况:
  1. TLP Seq Num equal NRS:Good TLP,是正确的情况,当AckNak_LATENCY_TIMERS expire时,发送ACK包,包含最后一包good TLP的Seq Num(即NRS-1);
  2. TLP Seq Num earlier than NRS: Duplicate TLP,是以前发送过的重复包,NRS - TLP Seq Num不超过2048,不认为是错误,silently dropped并且发送一个带有Seq Num为(NRS-1)的ACK包;
  3. TLP Seq Num later than NRS: Invalid TLP,发生丢包的情况,会发送Nak,如果没有Nak outstanding。

由于4095后Seq Num会roll over,所以实际的范围是这样定义的:(以NRS=30/31/32为例)

  • NAK_SCHEDULED Flag: 当接收端schedule NAK的时候会置此标志位为1,当成功发送了一个带有Seq Num为(NRS-1)的NAK包后清零。目的是有outstanding NAK就不需要再发送NAK包;
  • AckNak_LATENCY_TIMER:接收到一个正确TLP后开始计数,当timer expire会发送一个带有Seq Num为(NRS-1)的ACK包,当发送了ACK或NAK包后复位;
  • Ack/Nak Generator: ACK/NAK中的Seq Num都是NRS-1,格式如下:

发送接收端具体实现细节


发送端:

  • Sequence Number:从事务层发往链路层,首先需要加入Sequence Number,Seq Num可能会roll over;
  • 32bit LCRC: 加入LCRC,范围是Seq Num+TLP;
  • Response to ACK DLLP: 把收到的ACK的Seq load到ACKD_SEQ中,复位REPLAY_TIMER和REPLAY_NUM,清除Replay buffer中的<=SEQ NUM的TLP;
  • Response to NAK DLLP:把收到的NAK的Seq load到ACKD_SEQ中,复位REPLAY_TIMER和REPLAY_NUM,清除Replay buffer中的<=SEQ NUM的TLP,重放buffer中剩余的包;

接收端:

  • Physical Layer: TLP接收在物理层检测到receiver error(framing,disparity, invalid symbols)如果告知链路层,链路层发NAK包并重放TLP包,如果不告知链路层,链路层也会因为Seq Num丢包而发NAK包并重放TLP包;
  • LCRC Check:检查LCRC错误,如果计算的LCRC和TLP的LCRC不匹配,说明TLP中有bit错误,就会丢弃TLP并且发NAK;
  • Next Received TLP's Sequence Number: 如果LCRC正确,会比较接收到的TLP的Seq Num和NRS;
  • Receiver Schedules a ACK:  AckNak_LATENCY_TIMER expire后发送一个ACK,含有NRS-1的Seq Num;
  • Receiver Schedules a NAK: 虽然发送端需要立刻发送NAK(因为后面的接收的其他TLP也会丢弃),但是其他的已经再处理的TLP, DLLP, Order Set优先级更高,NAK会等到它们都完成再发,同时,如果其他接收的TLP丢弃,由于NAK_SCHEDULED flag=1,就不会再有额外ACK/NAK schedule。

Replay Number Rolls Over


当REPLAY_TIMER由于没有接收到ACK或NAK而expire,replay过程可以被重复3次,如果重复大于3次,REPLAY_NUM就会从3 roll over至0.

  • 如果发生这种情况一定是链路存在一些问题,链路层就会触发物理层重新训练链路(LTSSM进入Recovery状态机);
  • 如果使能AER会报Replay Number Rollover error错误;
  • Replay Buffer的内容会保持,数据链路层不会初始化(只是重新训练链路,不会复位链路);
  • 当链路训练完成后,transmitter会再重放,以期望问题能够解决;
  • Spec没有规定如何处理repeat rollover event, PCIe Technology3.0建议记录重新训练的次数,超过规定的次数后,通过Uncorrectable Fatal Error或者中断通知软件。

Transmitter DLLP Handling


Ack/Nak Error Checking模块检查ACK/NAK DLLP的16bit CRC是否存在错误,

  • 如果存在错误,DLLP会丢弃,DLLP包没有重传和校正的机制;
  • AER会报告Correctable Error;
  • 会使ACK之间的间隔变大,REPLAY_TIMER可能会expire,导致TLP replay。

Error Situations Handled by Ack/Nak


  • LCRC错误
  • TLP Losts(物理层检测到错误后丢包)
  • Ack/Nak包损坏
  • 没有接收到Ack/Nak包
  • Receiver fails to send Ack/Nak

上述情况的详细处理过程见(二)ACK/NAK实例博文。

Switch Cut-Through Mode


当TLP经过Switch的Ingress Port的时候,当没有收到TLP的整包的时候是没有办法判断LCRC是否正确的,通常情况下用到Store-Forward模式缓存整包,没问题再送到Egress Port,但是这样的情况大包会有很大的Latency,会影响性能。

为了提高性能可以采用Cut-Through模式,这种模式下Ingress Port可能会将TLP传给Egress Port后才会发现LCRC错误。

Cut-Though Mode提供一个解决方案:“nullified” TLP

  • 这种TLP的LCRC是invert(按位取反)+EDB;
  • 这种TLP本质上处理的时候“好像不存在一样”;
  • 在Egress Port,不存入replay buffer,NEXT_TRANSMIT_SEQ回滚-1;
  • 接收端的NRS不增加,AckNak_LATENCY_TIMER不启动, NAK_SCHEDULED不设置;
  • 接收端只是简单的丢弃此包,不需要返回ACK/NAK。

 

 

 

 

这篇关于PCI Express学习篇---链路层(一)ACK/NAK协议介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/810223

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}