PCI Express学习篇---链路层(二)ACK/NAK实例

2024-03-15 00:30

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

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

以下为收到ACK/NAK的例子,详细原理介绍请见上一篇博文。


  • Device A发送Seq=3,4,5,6,7的包,Device B接收到Seq=3,4,5 good TLP后,NRS为6;
  • 当接收到seq=3的TLP时,AckNak_LATENCY_TIMER开始计数;
  • 当接收到完seq=4,5的TLP后,AckNak_LATENCY_TIMER expire;
  • Device B发送seq=5即NRS-1的ACK包,AckNak_LATENCY_TIMER清零,但是当收到seq=6的TLP才会重新开始计数;
  • Device A收到ACK包,清除Replay timer and Replay num,清除replay buffer里面小于等于5的TLP包

  • Device A发送Seq=4094,4095,0,1,2的包,Device B接收到Seq=4094,4095,0,1 good TLP后,NRS为2;
  • 当接收到seq=4094的TLP时,AckNak_LATENCY_TIMER开始计数;
  • 当接收到完seq=4095,0,1的TLP后,AckNak_LATENCY_TIMER expire;
  • Device B发送seq=1即NRS-1的ACK包,AckNak_LATENCY_TIMER清零,但是当收到seq=2的TLP才会重新开始计数;
  • Device A收到ACK包,清除Replay timer and Replay num,清除replay buffer里面4094,4095,0,1的TLP包。

  • Device A发送Seq=4094,4095,0,1,2的包,Device B接收到Seq=4094没有错误,Seq=4095有LCRC错误,NRS=4095
  • 当接收到seq=4094的TLP时,AckNak_LATENCY_TIMER开始计数;
  • 当接收到完seq=4095的TLP后,立刻将NAK_SCHEDULED flag置为1,发送Seq=4094的NAK包(即NRS-1);
  • Device B发送NAK时AckNak_LATENCY_TIMER清零并且停止计数;
  • Device B收到的Seq=0,1,2的尽管可能是good TLP也会丢弃(因为所有的TLP必须是in-order的),并且不会再发送NAK了,因为NAK_SCHEDULED flag=1
  • Device A收到Seq=4094的NAK,将REPLAY_TIMER和REPLAY_NUM清零,清除replay buffer中Seq=4094及之前的TLP,然后重放Seq=4095,0,1,2的包,重新计数REPLAY_TIMER并且将REPLAY_NUM+1;
  • Device B收到Seq=4095的重放包为good TLP,会清除NAK_SCHEDULED flag,重新启动AckNak_LATENCY_TIMER并且将NRS+1。

  • Device A发送Seq=4094,4095,0,1,2的包,Device B接收到Seq=4094,4095,0没有错误,NRS=1
  • 当接收到seq=4094的TLP时,AckNak_LATENCY_TIMER开始计数;
  • 当接收到完seq=4095,0的TLP后,AckNak_LATENCY_TIMER expire;
  • Device B发送seq=0即NRS-1的ACK包,AckNak_LATENCY_TIMER清零,但是当收到seq=2的TLP才会重新开始计数;
  • Device A收到ACK包,清除Replay timer and Replay num,清除replay buffer里面4094,4095,0的TLP包;
  • Seq=1的TLP Lost(也许是物理层发生问题丢包),Seq=2的TLP到达Device B,Seq Num>NRS,Device B丢弃Seq=2的包,立刻将NAK_SCHEDULED flag置为1,发送Seq=0的NAK包(即NRS-1);
  • Device A收到NAK包,清除Seq=0及之前的包(已经由ACK清除)重放Seq=1,2的包;
  • Device B接收重放的Seq=1,2的包,如果没有error就传递给事务层。

Handing Bad ACK

如果Seq=2的ACK Lost或损坏,REPLAY_TIMER可能会超时使整个replay buffer重放,Device B这个时候如果接收到Seq=4094,4095,0,1,2的包就会认为是Duplicate,会丢弃并重新发送一个Seq=2 (即NRS-1)的ACK包。

Handing Bad NAK

如果Seq=2的NAK Lost或损坏,REPLAY_TIMER可能会超时使整个replay buffer重放,Device B这个时候如果接收到Seq=4094,4095,0,1,2的包就会认为是Duplicate,会丢弃并重新发送一个Seq=2 (即NRS-1)的ACK包。

一旦Seq=3的包被Device B成功接收,会清除NAK_SCHEDULED flag,增加NRS到4,重新启动AckNak_LATENCY_TIMER。

 

 

 

 

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



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

相关文章

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

java String.join()方法实例详解

《javaString.join()方法实例详解》String.join()是Java提供的一个实用方法,用于将多个字符串按照指定的分隔符连接成一个字符串,这一方法是Java8中引入的,极大地简化了... 目录bVARxMJava String.join() 方法详解1. 方法定义2. 基本用法2.1 拼接

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

Java实例化对象的​7种方式详解

《Java实例化对象的​7种方式详解》在Java中,实例化对象的方式有多种,具体取决于场景需求和设计模式,本文整理了7种常用的方法,文中的示例代码讲解详细,有需要的可以了解下... 目录1. ​new 关键字(直接构造)​2. ​反射(Reflection)​​3. ​克隆(Clone)​​4. ​反序列化