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进行梳理。




审核编辑:刘清

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

    关注

    8

    文章

    1122

    浏览量

    52643
  • 触发器
    +关注

    关注

    14

    文章

    1681

    浏览量

    60406
  • TLP
    TLP
    +关注

    关注

    0

    文章

    30

    浏览量

    15519
  • PCIe接口
    +关注

    关注

    0

    文章

    111

    浏览量

    9529

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    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电路图

    ACK电路图
    发表于 01-01 05:36 1291次阅读
    <b class='flag-5'>ACK</b>电路图

    什么是ACK (ACKnowledge Character)

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

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

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

    一文看懂数据链路层和网络层的区别

    本文开始介绍了网络层的概念及网络层的主要功能,其次阐述了数据链路层的概念和数据链路层的功能,最后介绍了数据链路层的作用以及数据
    发表于 03-14 15:38 7.1w次阅读
    一文看懂数据<b class='flag-5'>链路层</b>和网络层的区别

    Ack/Nak机制详细介绍

    Ack/Nak是一种由硬件实现的,完全自动的机制,目的是保证TLP有效可靠地传输。Ack DLLP用于确认TLP被成功接收,Nak DLLP则用于表明TLP传输中遇到了错误。
    的头像 发表于 05-29 14:46 1.5w次阅读
    <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 6062次阅读
    简单地分析几个<b class='flag-5'>Ack</b>/<b class='flag-5'>Nak</b>机制的例子

    C0603X5R226M6R3NAK 片式高容多层陶瓷电容器

    电子发烧友网为你提供EYANG(EYANG)C0603X5R226M6R3NAK相关产品参数、数据手册,更有C0603X5R226M6R3NAK的引脚图、接线图、封装手册、中文资料、英文资料,C0603X5R226M6R3NAK
    发表于 01-29 11:04

    C0603X5R226X6R3NAK 片式高容多层陶瓷电容器

    电子发烧友网为你提供EYANG(EYANG)C0603X5R226X6R3NAK相关产品参数、数据手册,更有C0603X5R226X6R3NAK的引脚图、接线图、封装手册、中文资料、英文资料,C0603X5R226X6R3NAK
    发表于 03-17 19:41

    ack文本查找工具

    ./oschina_soft/ack3.zip
    发表于 05-25 09:24 0次下载
    <b class='flag-5'>ack</b>文本查找工具