0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PCIe链路层里的ACK/NAK介绍

Spinal FPGA ? 来源:Spinal FPGA ? 作者:玉骐 ? 2023-06-25 10:31 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

编 者 按

读cocotbext-pcie源码,有部分牵涉到数据链路层。虽然自工作以来接触到PCIe还是蛮多的,但一般往往专注在TLP层,对于数据链路层还是接触的比较少的。PCIe Spec洋洋洒洒数千页,也不会从头到尾去通读整个协议。对于cocotbext-pcie里面牵涉到的链路层的ACK/NAK,牵涉到的PCIe背景,聊做记录。

本文仅结合PCIe Spce与cocotbext-pcie做记录。

》ACK/NAK

与TCP协议般,PCIe协议在数据链路层采用滑动窗口ACK/NAK协议来保证数据传输。对于传输层下发的TLP报文,数据链路层会做一次封装:

47234cbc-1181-11ee-962d-dac502259ad0.jpg

ACK/NAK报文格式定义如下:

474c2cf4-1181-11ee-962d-dac502259ad0.jpg

关于滑动窗口机制,往上随便搜下还是蛮多的,不做过多啰嗦。链路层的滑动窗口正是基于TLP Sequence Number。

TLP Sequence Number定义为12 bits。对于发送端而言,其会维护两个变量:

NEXT_TRANSMIT_SEQ:用于存储下一个待发送TLP报文所使用的TLP Sequence Number。初始化时赋值为0.

ACKD_SEQ: 记录从ACK、NAK中返回的 Sequence Number。初始化时赋值为0xfff。对于发送端,规定:(NEXT_TRANSMIT_SEQ - ACKD_SEQ) mod 4096 >= 2048

若上面的条件满足则停止从传输层接收TLP,等待该条件不再成立。

也就意味着在pending中的报文不超过2048(牵涉到报文重传)。

那么由此发送端对于收到的ACK/NAK中协议牵涉到的处理流程Spec定义为:

47654b94-1181-11ee-962d-dac502259ad0.jpg

由于发送端窗口中pending待确认的报文不会超过2048,故若上面1式不成立,那么则意味着用到了尚未使用到的sequence,表示为错误的TLP报文,同样单次增加的ACKD也不会超过2048,否则也应标为错误的TLP。

在式3中,如果条件不成立,则意味着可以窗口前移,可以从replay buffer中移出已发送成功的数据,设置ACKD_SEQ等变量。在cocotbext-pcie中关于dllp的处理也和spec保持一致:

4785ba50-1181-11ee-962d-dac502259ad0.png

而对于接收端,其定义了:

NEXT_RCV_SEQ:下一个待接收TLP的Sequence Number。

其处理流程为:

47a54046-1181-11ee-962d-dac502259ad0.jpg

这里可以看到,仅当收到的TLP报文的Sequence Number等于NEXT_REC_SEQ时,才会被接收。注意红框中,若条件满足则认为是重复的报文,此时则应发送ACK DLLP报文,否则认为是错误的报文,则应发送NAK。

来看cocotbext-pcie中的处理:

47c7a32a-1181-11ee-962d-dac502259ad0.png

这里在563行取了<而非<=,或可有误。当收到的是期望的报文时(555行),则会更新next_recv_seq、清除nak_scheduled,拉起ack_latency_timer(不必每个TLP均发起一个ACK,但又要确保按照Spec中规定的间隔时间来发送ACK)。而如果收到的是一个重复的TLP(563行),此时将send_ack触发条件拉起,表示要立即发送ACK,而同时关掉ack_latency_timer,避免超时条件触发后多发ACK。否则(567行)将会发送NAK报文。

》One More Thing

关于接收端的ack_latency,协议中有详细的规定,其与flow control定义有相似之处,放在后面结合cocotbext-pcie进行梳理。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接收机
    +关注

    关注

    9

    文章

    1224

    浏览量

    54742
  • 触发器
    +关注

    关注

    14

    文章

    2041

    浏览量

    62244
  • TLP
    TLP
    +关注

    关注

    0

    文章

    35

    浏览量

    16099
  • PCIe接口
    +关注

    关注

    0

    文章

    121

    浏览量

    10167

原文标题:有点儿东西—PCIe链路层里的ACK/NAK

文章出处:【微信号:Spinal FPGA,微信公众号:Spinal FPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    PCIe引脚定义和PCIe协议层介绍

    本文我们将向大家介绍PCIe引脚定义以及PCIe协议层。
    发表于 09-26 11:39 ?2.3w次阅读
    <b class='flag-5'>PCIe</b>引脚定义和<b class='flag-5'>PCIe</b>协议层<b class='flag-5'>介绍</b>

    CY7C65215A作为从站,在主站写入时响应NAK是怎么回事?

    设备写入数据时,总是在主设备向从设备写入的每个字节上响应 ACK。 我遇到的问题是,当我的微控制器作为主站向作为从站的赛普拉斯写入数据时,赛普拉斯对最后一个字节的响应是 NAK,而不是 ACK
    发表于 07-04 06:30

    nvme IP开发之PCIe

    ,获取其它设备的响应。 PCIe层次结构 PCIe 总线是一种分层协议总线,采用数据包进行数据传输。数据包在收发过程中需要经过事务层、数据链路层和物理层三个层次的处理和转发。PCIe
    发表于 05-17 14:54

    BLE中的ACK机制

    ACK
    橙群微电子
    发布于 :2023年03月31日 09:52:36

    TLP的数据链路层组成与操作

    、 Vendor_Defined DLLPs:厂商自定义DLLP。  ACK/NAK协议  ACK/NAK是一种滑动窗口协议,PCIe设备数
    发表于 01-08 17:25

    【每日一知识点】在STM32F4上OTG 主机库在 BULK 传输上对 NAK 的处理

    数据后,不再回复 NAK 握手,而是回复主机要获取的数据,然后主机硬件回复 ACK 来结束本次 transfer。BULK IN通道对 NAK的处理和 CTRL IN通道对 NAK的处
    发表于 06-02 15:22

    介绍车用CAN通讯的基础知识,数据链路层部分

    本博文主要介绍了车用CAN通讯的基础知识,数据链路层部分,主要包括帧类型、帧起始&帧结束、仲裁段、控制段、数据段、CRC段&ACK段和错误帧等。
    发表于 01-07 06:16

    一文详解CXL链路层格式的定义

    4.1 CXL.io链路层CXL.io链路层充当CXL.io事务层和Flex Bus物理层之间的中间层。其主要职责是提供可靠的机制,用于在链路上的两个组件之间交换事务层数据包(TLP)。PCIe
    发表于 02-21 14:27

    什么是ACK (ACKnowledge Character)

    什么是ACK (ACKnowledge Character)  英文缩写: ACK (ACKnowledge Character) 中文译名: 确认字符 分  类: 传输与接入
    发表于 02-22 10:12 ?1987次阅读

    数据链路层到底是什么_数据链路层工作原理是怎样的

    本文开始阐述了什么是数据链路层,其次阐述了数据链路层的分类和数据链路层的工作原理,最后介绍了常用的数据链路层
    发表于 03-14 14:10 ?3.1w次阅读
    数据<b class='flag-5'>链路层</b>到底是什么_数据<b class='flag-5'>链路层</b>工作原理是怎样的

    PCIe总线的通信机制

    那么为什么要分为Non-Posted和Posted两种类型呢?对于Memory Writes来说,对效率要求较高,因此采用了Posted的方式。但是这并不意味着Posted类型的操作不需要Completer进行应答,只是此时Completer采用了另一种应答机制——Ack/Nak
    的头像 发表于 04-24 09:41 ?1.2w次阅读
    <b class='flag-5'>PCIe</b>总线的通信机制

    Ack/Nak机制详细介绍

    Ack/Nak是一种由硬件实现的,完全自动的机制,目的是保证TLP有效可靠地传输。Ack DLLP用于确认TLP被成功接收,Nak DLLP则用于表明TLP传输中遇到了错误。
    的头像 发表于 05-29 14:46 ?1.6w次阅读
    <b class='flag-5'>Ack</b>/<b class='flag-5'>Nak</b>机制详细<b class='flag-5'>介绍</b>

    简单地分析几个Ack/Nak机制的例子

    设备B接收到了TLP4095,但是该TLP并未通过CRC校检(即存在错误)。此时无论AckNak_LATENCY_TIMER处于何种状态,设备B都会立即向设备A返回Ack4094(注意返回的Ack
    的头像 发表于 05-30 09:16 ?6683次阅读
    简单地分析几个<b class='flag-5'>Ack</b>/<b class='flag-5'>Nak</b>机制的例子

    什么是PCIe

    PCIe是一种高速串行计算机扩展总线标准,自2003年推出以来,已经成为服务器(Server)和PC上的重要接口。今天为大家简单介绍一下PCIe的发展历史以及它的工作原理。 一、PCIe
    的头像 发表于 07-04 18:15 ?2.2w次阅读

    PCIE数据链路层架构解析

    数据传输的完整性和一致性(TLP ACK/NAK),此外数据链路层还需要对PCIe链路进行管理(电源管理)和监控(流量控制)。
    的头像 发表于 11-05 17:06 ?1074次阅读
    <b class='flag-5'>PCIE</b>数据<b class='flag-5'>链路层</b>架构解析