【毅力挑战】PCIe 每日一问一答(2022.05 已归档)

本文意在督促自己持续学习 PCIe。日更长文做不到,但三言两语总该能写出来。一天至少更新一个 PCIe 相关知识点,聚沙成塔、集腋成裘,相信几年下来总能覆盖绝大部分的 PCIe 知识面。本文注定越往后越难更,看我能坚持多久吧。

👉 本篇为 2022.05 归档,点击查看总目录 👈


文章目录


2022 年


5 月


2022.05.01 - First DW BE、Last DW BE 是什么?

  First DW BE 和 Last DW BE 是 Memory 读写请求 TLP Header 中的一个字段,指示读写请求数据载荷中的第一个及最后一个 DW 中的数据 Byte 是否有效。First DW BE[3:0] 对应第一个 DW 的 Byte[3:0],Last DW BE[3:0] 对应最后一个 DW 的 Byte[3:0],如图 1 所示。

  若 BE 某 bit 为 0,表示该 byte 数据不能写入 Memory 或不可预取、不可读。若请求长度大于 1 DW,First DW BE 不能为 0;若请求长度等于 1 DW,Last DW BE 只能为 0;First/Last DW BE 的 4 bit 可以不连续。对于 Zero Read/Write,First/Last DW BE 均为 0。

在这里插入图片描述

▲图 1: First/Last DW Byte Enable 位置对应关系

2022.05.02 - PCIe Scrambling 中有哪两种 LFSR 方案?

  PCIe Scrambling 中常用的两种 LFSR 方案为 Separated LFSR 与 Shared LFSR。

  1. Separated LFSR 方案,或称 Individual LFSR,是指 PCIe 链路中每条 Lane 都单独配一个 LFSR 进行 Scrambing,各条 Lane 的 LFSR 有自己的 Seed。 其原理图如图 2 所示。
  2. Shared LFSR,从名字也看得出来,共享的 LFSR,是指 PCIe 链路中所有链路共享同一 LFSR,不同 Lane 采用不同的抽头点位,其原理图如图 3 所示。

在这里插入图片描述

▲图 2: Individual LFSR 原理图

在这里插入图片描述

▲图 3: Shared LFSR 原理图

2022.05.03 - 为什么要关闭加扰 Scrambling?

  默认情况下 Scrambling 是打开的。Scrambling 的确有很多好处,比如减低 EMI,但在设备调试阶段,工程人员想要更容易地查看传输的数据,数据 Scrambling 无疑增加了数据辨识难度。为了更容易地查看传输数据,可以选择关闭 Scrambling 功能。只能在链路训练的 Configuration.Complete 阶段通过发送 Disable Scrambing 位(Symbol 5 Bit 3)为 1 的 TS1 或 TS2 来关闭对端的 Scrambling 功能,且只能在 8b/10b 编码期间来关闭 Scrambling。


2022.05.04 - 128b/130b 编码时,Sync Header 和 TS Symbol 0 不做 Scrambling,不会影响 DC Balance 吗?

  128b/130b 编码时 Sync Header 和 TS Symbol 0 不做 Scrambling,不会影响 DC Balance。Sync Header 为 01b 或 10b,TS Symbol 0 为 1Eh(00011110b),0、1 数量相同,本身已经实现了 DC Balance。


2022.05.05 - PCIe 是如何检测块对齐丢失的?

  在链路训练期间,若 Rx 检测到了未定义的 Sync Header,则认为块对齐丢失(Loss of Block Alignment)。块对齐丢失是因为 Rx Block Alignment 失败,需要重新回退到 Unaligned Phase 进行块对齐。


2022.05.06 - STP 中的 FCRC 和 FP 都是干啥的?

  STP,Start of TLP,在 128b/130b 编码 Data Block 中指示开始发送 TLP 的 Frame Token,如图 2 所示。该 Token 中携带有接下来要发送的 TLP Length 及 TLP Sequence Number。TLP Length 是个相当重要的字段,为了保护该字段,STP 中规划了 FCRC (Frame CRC) 及 FP (Frame Parity) 两个字段来对 TLP Length 进行保护。

  FCRC 通过 10 Bit TLP Length 按照一定算法计算获得,只保护 TLP Length,能够检测出 2 Bit 错误。常规 FP 奇偶校验则是校验 TLP Length 及 FCRC 字段,缩减版 FP 只检验 TLP Length 中的特定位,能够检测出奇数位的 Bit 错误。

在这里插入图片描述

▲图 4: STP Frame Token

2022.05.07 - EIOS 截断是什么?

  128b/130b 编码时,EIOS 由 16 个 66h 组成。若当前发送的 EIOS 之后紧接着还有 EIOS,那么必须发送完完整的 16 个 66h 当前 EIOS 才算发送完毕。若发送完当前 EIOS 接下来便进入电气闲,那么发送完 14 个 66h 后就可以停止发送 剩下的 66h,仍认为当前 EIOS 发送完毕,称为 EIOS 截断。

  EIOS 截断是为了解决 128b/130b 编码期间发送端可能存在的符号边界上的时钟边界不对齐情况。EIOS 截断不会影响接收端对 EIOS 的判断,因为接收端只需要收到 6 个 EIOS 就可以做出接收到 EIOS 的判断了。


2022.05.08 - 如果发送的 FTS 不够,导致从 L0s 回退到 L0 失败了怎么办?

  从 L0s 回退到 L0 时,Tx 发送 N_FTS 个 FTS。如果 Rx 在此期间实现了位锁定、符号锁定及块对齐,那么能够成功 回退到 L0。如果 Rx 再次期间没有完成位锁定、符号锁定及块对齐,那么 Rx 会超时退到 Recovery,沟通加大 N_FTS,在 Recovery 阶段完成未完成的锁定及对齐工作,然后进入 L0。


2022.05.09 - PCIe 数据链路层是做什么的?有哪些功能?

  PCIe 数据链路层位于事务层与物理层之间,用以保证数据传输的可靠性。

  其主要功能如下:

  • TLP 数据交换。在发送端,数据链路层负责接收事务层发来的 TLP,添加 Sequence Number 及 LCRC 后交给物理层;在接收端,数据链路层负责接收物理层发来的 TLP,数据完整性检测通过后交给事务层。此外,数据链路层负责 TLP 流控。
  • 错误检测及重传。数据链路层基于 ACK/NAK 机制来检测有无 TLP 损坏或丢包,在出现损坏或丢包时通过 Retry 机制请求重传。若发送端长时间等不到相应 TLP 的 ACK,还有 Timeout 机制来保证重传。
  • 链路初始化及电源管理。PCIe 初始化过程中,数据链路层监测 PCIe Link 的 Reset、Active、Disconnected 等状态并传递到事务层。在 LTSSM 跳转到 L0 状态后,数据链路层交换 FC DLLP 进行流控初始化。此外,在允许过程中,PCIe Link 双方的数据链路层交换 PM DLLP 实现功耗管理及电源管理。

2022.05.10 - DLLP 是什么?

  DLLP,全称 Data Link Layer Packet,数据链路层包,用以 PCIe 链路管理及维护(链路初始化、电源管理等)。DLLP 仅在 PCIe 链路两端设备的数据链路层之间传输,其源于发送端设备的数据链路层,终于接收端设备的数据链路层。当 TLP 及 DLLP 均需要发送时,按照一定规则交替发送。


2022.05.11 - DLLP 分为哪几类?

  根据功能的不同,DLLP 大致可分四类:

  • ACK/NAK DLLP(TLP 应答 DLLP)。包括 ACK、NAK,用以决定重传还是丢弃 Tx Retry Buffer 中的 TLP。
  • FC DLLP(Flow Control DLLP)。包括 InitFC1-P、InitFC1-NP、InitFC1-Cpl、InitFC2-P、InitFC2-NP、InitFC2-Cpl、UpdateFC-P、UpdateFC-NP 及 UpdateFC-Cpl,用以初始化及更新流控信用量(Flow Control Credit)。
  • PM DLLP (Power Management DLLP)。包括 PM_Enter_L1、PM_Enter_L23、PM_Active_State_Request_L1 及 PM_Request_Ack,用以进行功耗及电源管理。
  • Vendor Defined DLLP。厂商自定义的 DLLP。

  ACK/NAK、FC 及 PM DLLP 均为链路管理 DLLP。此外,还有 MR、NOP 及 Data_Link_Feature DLLP。各 DLLP 类型之间通过 DLLP 中的 Tyte 字段 (Byte0) 进行区分。


2022.05.12 - NOP DLLP 是什么?有何作用?什么时候发 NOP DLLP? 收到后该如何处理?

  NOP(No Operation)DLLP 是 PCIe 3.0 引入的概念,其帧格式下图所示,Payload 字段(Byte1~3)为任意值。NOP DLLP 仅用于链路测试场景,常规操作模式时不应发送 NOP DLLP,接收端接收到 NOP DLLP 后,在做完数据数据完整性检测后直接丢弃。

在这里插入图片描述

▲图 5: NOP DLLP Format

2022.05.13 - Data Link Feature DLLP 是什么?有何作用?什么时候发?

  Data Link Feature DLLP 是一种携带有数据链路层 Feature 及相关 Ack 信息的 DLLP,数据链路层处于 DL_Feature 状态(可选)时,PCIe 链路两端的数据链路层通过 Data_Link_Feature DLLP 来告知彼此支持的数据链路层特性。

  Data_Link_Feature DLLP 帧格式如下图所示,其中 Feature Support 字段来源于其 Data Link Feature Capabilities Register 的 Local Data Link Feature Supported 字段,目前只有 Local Scaled FC 这一个 Feature。当本端接收到对端发来的 Data_Link_Feature DLLP 后,回复以 Feature Ack 置一的 Data_Link_Feature DLLP。

在这里插入图片描述

▲图 6: Data_Link_Feature DLLP Format

2022.05.14 - DLLP 自身是如何保证其数据完整性的?

  首先,若能够接收到 DLLP,每一笔 DLLP 都携带有 2B CRC,来保证接收 DLLP 的正确性。

  其次,若 DLLP 丢包,对于 Ack/Nak DLLP,要么没有影响(短暂丢 Ack),要么有 Timeout 机制来保证 TLP 重传(丢 Nak,长时间丢 Ack)。对于 PM DLLP,会重复多次或者持续发送相关 DLLP,确保对端能够收到。对于 FC DLLP,发送端在收到对端发来的 InitFC 前会一直定时发送 InitFC 给对端;对于 UpdateFC,其是定时发送的,偶尔丢一个影响不大,采用最新收到的 Credit 就好了。


2022.05.15 - LCRC 和 ECRC 有何区别?

  ECRC,End-to-End CRC,由事务层生成及解析,是可选的,是 TLP 的组成部分,Size 4B,位于 Data Payload 之后。ECRC 始于 Requester,终于 Completer,不会被 Switch 等中间节点修改。ECRC 错误是不可纠正错误,若 Switch 发现 ECRC 出错,其记录错误并继续转发;若 Completer 发现 ECRC 出错,则上报错误请求系统处理。

  LCRC,Link CRC,由数据链路层生成及解析,是必选的,Size 4B,添加在 TLP 之后。LCRC 始于 PCIe 链路的发送端数据链路层,终于 PCIe 链路的接收端数据链路层,途径 Switch 时需要进行校验并重新进行计算填充。LCRC 是可纠正错误,若接收端检测到 LCRC 出错,其请求重发该 TLP。

参考与友链:ECRC vs LCRC – PCIe技术网


2022.05.16 - 几种不同的 TLP 同时要发送时候,该怎么发?

  若 Cfg/Mem/IO Write/Read、Completion、Message 等几种不同的 TLP 同时需要发送,Synopsys 推荐按照以下优先级进行发送:

  1. 当前传输中的 TLP 请求的 Completion
  2. Retry Buffer 内需要重传的 TLP
  3. PCIe Controller 内部事务层新生成的 Message
  4. PCIe Controller 内部事务层新生成的 Completion
  5. PCIe 用户接口新生成的待发 TLP

2022.05.17 - 几种不同的 DLLP 同时要发送时候,该怎么发?

  若几种不同的 DLLP 同时,建议按照以下由高到低的优先级进行发送:

  1. 当前传输中的 DLLP 请求的 Completion
  2. NAK DLLp
  3. ACK DLLP
  4. FC DLLP
  5. Vendor Defined DLLP
  6. PM DLLP 及其他 DLLP

2022.05.18 - TLP、OS、DLLP 同时要发送时,该怎么发?

  若数据链路层同时有 TLP、TS、DLLP 要发送时,是需要按照一定的优先级进行发送的。官方文档中给了一直建议的发送顺序(不强制),优先级从高到低依次为:

  1. 进行中的 TLP 或 DLLP 的 Completion
  2. Ordered Set(这个是在 Mindshare 文档提到的)
  3. Nak DLLP
  4. Ack DLLP
  5. FC DLLP(遵循流控规则要求的比较紧急的 FC DLLP)
  6. Retry Buffer 内需要重传的 TLP
  7. FC DLLP(其他不紧急的 FC DLLP)
  8. 事务层待发的 TLP
  9. 其他 DLLP,比如 NOP DLLP 及 Vender Defined DLLP

2022.05.19 - ACK/NAK 机制是什么?

  PCIe 通过 ACK/NAK 机制来保证 TLP 在 PCIe 链路上的 End-to-End 可靠传输。

  PCIe ACK/NAK 机制示意图如下图所示,通过几个关键要素来简单介绍 ACK/NAK 机制:

  • Sequence Number,LCRC。发送端数据链路层在每一笔要发送的 TLP 前添加连续编号的 Sequence Number(SN)及 LCRC,然后发送到对端。
  • ACK/NAK DLLP。接收端数据链路层接收到 TLP 后,依据 SN 及 LCRC 来判断 TLP 是否被正确传输、有无丢包/坏包,并给发送端反馈 ACK 或 NAK。
  • Tx Retry Buffer。发送端发出的每一笔 TLP 均在 Tx Retry Buffer 中进行备份。若后续接收到了 ACK,则清理 Tx Retry Buffer 中的相关 TLP;若收到了某 TLP 的 NAK 或超时未收到 ACK,则从 Tx Retry Buffer 中取出相关 TLP 进行重传。

在这里插入图片描述

▲图 7: PCIe ACK/NAK 机制示意图

友链:ACK & NAK – PCIe技术网


2022.05.20 - 每个 TLP 都要回复 Ack 吗?Ack 要多久发一次?

  并非每一笔 Good TLP 都需要回复一笔 Ack DLLP,这样效率太低了。

  PCIe Rx 数据链路层内部有个 AckNak_Latency_Timer,从收到某笔没有回复 Ack 的 TLP 就开始计时,达到指定时间后(取决于 Timer 设计)才会要一次 Ack。此前有可能会收到多比 Good TLP,这些 TLP 只回复一次 Ack,Ack 的 Sequence Number (SN) 为最新 Good TLP 的 SN。Tx 端收到 Ack 后,会把 Tx Retry Buffer 中 SN 之前的 TLP 清理掉。


2022.05.21 - 什么情况下会发送 Nak DLLP?

  简单而言,Rx 发现 Bad TLP 或 TLP 丢包时会发送 Nak。通过检测 LCRC 来检测 TLP 是否为 Bad TLP,通过 SN 还判断是否有 TLP 丢包。


2022.05.22 - TLP Tx 收到 Nak 后如何处理?

  根据 Nak DLLP 中的 SN,从 Tx Retry Buffer 中取出相应 TLP 进行重传,重传次数计数器 REPLAY_NUM 加一,重传计时器 REPLAY_TIMER 启动。


2022.05.23 - 连续多次重传失败后如何处理?

  若 TLP 多次重传均以失败告终,重传计数器 REPLAY_NUM 会溢出时,此时考虑是物理链路出现了问题,应记录错误事件并通知物理层重新对物理链路进行训练。此时数据链路层仍然是 Active 的,其 Tx Retry Buffer 不清空,相关计数器及寄存器值也不复位,等待物理链路训练完成后接着进行重传。


2022.05.24 - Retry 机制中用到的 Tx Retry Buffer Size是如何计算的?

  跟绝大多数 Buffer Size 的设计原则相同,在设计 Tx Retry Buffer Size 时应遵循两大原则:

  • Size 足够大,确保常规操作时收到 Ack 并清掉其对应 TLP 前 Buffer 不溢出。

  • 在满足以上需求的前提下,Size 尽量小,以降低成本。

  第一条“收到 Ack 并清掉其对应 TLP 前 Buffer 不溢出”,这里有两个关键因素:①收到 Ack 前,②不溢出。也就是说,从某 TLP 发出并存到 Tx Retry Buffer,到收到其 Ack 后从 Tx Retry Buffer 清掉该 TLP 为后来者腾空间,这段时间内发出的所有 TLP 都能够存放在 Buffer 中且 Buffer 不溢出。需要考虑以下时延:

  • Rx 收到 TLP 到开始回复 Ack 的时延。
  • Ack 的处理时延。
  • TLP、DLLP 在物理层及物理链路上的时延。
  • Tx Retry Buffer 所在 Device 的 Rx 从 L0s 退出到 L0 的时延。
  • 此外,对于 SRIS 时钟的 Device 或者 PCIe Retimer,也会引入额外时延。

2022.05.25 - 数据链路控制状态机是做什么的?

  数据链路层状态机(Data Link Control and Management State Machine, DLCMSM),用以①控制及管理数据链路层工作状态,②在事务层、物理层之间沟通链路状态,③触发物理层进行链路状态管理等。DLCMSM 状态转移图如下图所示。

在这里插入图片描述

▲图 8: 数据链路层控制管理状态机

2022.05.26 - DLCMSM 跟 LTSSM 有啥关系?

  DLCMSM 是数据链层状态机,LTSSM 是物理层链路训练状态机,两者各自为各自层次负责,同时又有一定的联系。

  在物理层 LTSSM 进入 Target Speed L0 之前,DLCMSM 都处于 DL_Inactive 状态,物理层训练完毕(Target Speed L0,PL_LinkUp=1)之后,DLCMSM 进入 DL_Feature 交换 DL Feature 或直接进入 DL_Init 进行流控初始化。流控初始化完成之后才进入 DL_Active 状态,至此DL_LinkUp=1。


2022.05.27 - DL_Feature 期间要交换哪些 Feature?

  DL_Feature 是一个可选的状态,只有 ①PCIe 设备支持且开启了 Data Link Feature Exchange 且 ②物理层 PL_LinkUp=1 之后,DLCMSM 才会由 DL_Inactive 进入 DL_Feature 状态。

  数据链路层处于 DL_Feature 状态(可选)时,PCIe 链路两端的数据链路层通过 Data_Link_Feature DLLP 来告知彼此支持的数据链路层特性。

Data_Link_Feature DLLP 的 Feature Support 字段来源于其 Data Link Feature Capabilities Register 的 Local Data Link Feature Supported 字段,目前只有 Local Scaled FC 这一个 Feature。当本端接收到对端发来的 Data_Link_Feature DLLP 后,回复以 Feature Ack 置一的 Data_Link_Feature DLLP。


2022.05.28 - PCIe Flow Control 是什么?

  PCIe Flow Control (FC) 是一种基于信用量 (Credit) 的点到点的 TLP 流控机制(非端到端),确保接收端有足够缓存的前提下才会发送 TLP。

  PCIe 流控逻辑位于事务层,通过 FC DLLP 来进行流控初始化及 Credit 更新。PCIe 多个虚通道(Virtual Channal, VC)之间独立进行流控,同一 VC 内,也按照根据事务类型(P/NP/CPL)及 Header/Data 分为多种 Credit 独立流控。

在这里插入图片描述

▲图 PCIe Flow Control 基本逻辑框图
(图源 Mindshare PCIe Technology)

友链:PCIe扫盲——Flow Control基础


2022.05.29 - PCIe Flow Control 用到了哪些 DLLP?

  PCIe 基于 FC DLLP 来实现流控初始化及流控 Credit 的更新。流控初始化用到的 FC DLLP 包括 InitFC1-P、InitFC1-NP、InitFC1-Cpl、InitFC2-P、InitFC2-NP、InitFC2-Cpl,Credit 更新用到的 DLLP 包括 UpdateFC-P、UpdateFC-NP 及 UpdateFC-Cpl。


2022.05.30 - Flow Control 初始化流程是怎样的?

  PCIe 流控初始化发生于物理层 LinkUp=1 之后、数据链路层 DLCMSM=DL_Init 状态时。

  PCIe 流控初始化先后分为两个阶段:

  • FC_Init1 阶段,PCIe 设备先后重复发送 InitFC1-P、InitFC1-NP、InitFC1-Cpl 这 3 笔 FC DLLP 到对端设备,至少每 34us 发送一次,告知其 Rx Buffer 的 Size。直到接收到对端发来的 InitFC1 DLLP 之后才停止发送,并把对端的 Buffer Size 保存起来。
  • FC_Init2 阶段,PCIe 设备先后重复发送 InitFC2-P、InitFC2-NP、InitFC2-Cpl。此时的 FC DLLP 中不携带初始化 Credit 信息。

2022.05.31 - InitFC1 和 InitFC2 有何区别?

  InitFC2 期间发送的 InitFC2 DLLP 不携带 Credit 信息,仅用以确认流控初始化是否成功。InitFC1 期间不能发送 TLP,InitFC2 期间可以。


评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MangoPapa

请作者喝瓶可乐吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值