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

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

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


文章目录


2022 年


11 月


2022.11.01 - 什么是 Scaled Flow Control? 跟 Flow Control 区别是什么?

  常规情况下,FC DLLP 中 Header Credit 位宽为 8bit,Header Credit 最大为 127;Data Credit 位宽 12bit,最大为 2047。对于一些 Rx Buffer 较大的设备,这些最大 Credit 不够用,如果不加大,势必会影响传输性能。

  从 PCIe 4.0 开始,PCIe 支持 Scaled Flow Control,通过 FC DLLP 中的缩放因子 HdrScale 及 DataScale,在 DLLP 中相关 Credit 位宽不变的情况下,来代表更多的 Credit 数目,从而支持更多数量的 Credit 通报。这种开启了 Scaled Factor 的流控即 Scaled Flow Control。


2022.11.02 - PCIe 6.0 的 Flit Mode 是什么?

  在 PCIe 1.0~5.0 中,TLP 是事务层包的基本传输单元。考虑到 TLP Header 的 Prefix 及 Data Payload Length 不定,TLP 总长度也是不定的。尤其当 Data Payload Length 较长时,传输一笔 TLP 耗时较长,需要较长的时间才能对该 TLP 有效性进行确认,时延较大。为了降低该时延,PCIe 6.0 中采用了基于 Flit 的传输方案,以 Length 更小的 Flit 为基本单位进行 Retry 及 Flow Control (FC 计算 Credit 时仍然看 TLP)。

  PCIe 6.0 采用 256B 固定长度的 Flit,单个 Flit 由 236B TLP + 6B DLP + 8B CRC + 6B FEC 组成。每一笔 Flit 中都有 6B DLP,此外无需单独传输 DLLP。对于 Length 大于 236B 的 TLP,需要进行拆分,分发到多笔 Flit 中进行发送;对于 Length 小于 236B 的 TLP,多笔 TLP 可以共享同一 Flit;TLP 在 Flit 中的起始位置不局限于任何边界。

  PCIe Gen6 速率下必须采用 Flit Mode,若开启了 Flit Mode,在 Gen6 以下速率时仍然需采用 Flit Mode。即便为 8b/10b 或 128b/130b 编码,考虑到 Flit 中的 TLP、DLP 等有其固定位置,Flit Mode 时不再使用 STP、SDP、END、END 等 Packet Marker 及 Frame Token。


2022.11.03 - PCIe Flit Mode 支持几种 Flit?

  从 Flit Size 看,目前(PCIe 6.0)仅支持 256B 固定长度的 Flit。

  按照 Flit Type 分类,Flit Mode 支持 3 中 Flit,分别为 Idle Flit、NOP Flit 及 Payload Flit。Flit 中 DLP Bytes 的 DLP[0] 中 Flit Usage 及 Prior Flit was Payload 位域来指示当前及前一 Flit 的类型。考虑到 Idle Flit 和 NOP Flit 在 Rx 端的处理方式相同,协议中并未对 Idle Flit 和 NOP Flit 进行区分,Rx 端更关心是否为 Payload Flit。


2022.11.04 - Flit 是在哪一层封装的?是如何封装的?

  Flit 最终是在数据链路层封装完毕的,大致的封装过程如下:

  1. 事务层提供完整 TLP,该 TLP 下发给数据链路层。
  2. 数据链路层对事务层发来的 TLP 进行切片/拼接、缓存,用作 Flit 中的 TLP Bytes 。
  3. 接着,数据链路层提供 Flit 传输过程中所需的 DLP,包括 Flit Sequence Number、Ack/Nak、Flow Control 及 Power Management 等信息。
  4. 获取到 Flit 所需的所有 TLP 及 DLP Bytes 后,计算 CRC 及 FEC。其中 CRC 计算的输入信息为 236B TLP + 6B DLP 共 242B,FEC 计算的输入信息为 TLP+DLP+CRC 共 250B。NOP Flit、Idle Flie 也是由数据链路层进行添加。

2022.11.05 - PCIe 6.0 规定的 Flit Size 有几种?

  PCIe 6.0 规定的 Flit Size 只有一种,即 256B Flit。即便 TLP Length 远远不够 236B,甚至只需发送 DLP 的场景,仍然需要发送 256B 长度的 Flit。

  256B Flit 中,TLP 236B 占比 92%,即带宽有效率 92%。若采用 Size 更大的 Flit,带宽有效率能够得到提升,同时也使得 Flit 时延更大;若采用 Size 更小的 Flit,能够降低 Flit 传输时延,但是带宽有效率会打折扣。256B Flit Size 是综合考虑 PCIe 带宽效率及 Flit 时延后选择的一种较优方案。


2022.11.06 - 每个 Flit 都需要 Ack/Nak 握手吗?这不会影响效率吗?

  首先,跟 Non-Flit Mode 相同,没有必要对每一个 Flit 相应 Ack,可以对多个正确接收到的 Flit 统一回复一个 Ack。若接收到的某个 Flit 的 Ack 信息,则该 Ack DLP 中 Flit Sequence Number 之前未进行确认的 Ack 都可以认为是已经正确接收到了。

  其次,Ack/Nak 并不会影响传输效率。PCIe 6.0 Flit 中给 DLP 分配了 6B,其中 DLP[1:0] 用来传输 Sequence Number 及 Ack/Nak,并不会额外占用其他 Slot。


2022.11.07 - DLP 是嵌合在 Flit 中的,当没有要发送的 TLP 时,Flit 中 TLP Payload 位置如何填充?

  当没有 TLP 要传输时,TLP Bytes 位置需要填充 NOP TLP。NOP TLP 对应的 Flit 可以为 NOP Flit 或 Idle Flit。 NOP Flit 中的 DLP Byte 仍然填充有有效的 DLP,Flit Seqence Number 有实际值,跟前一 Flit Sequence Number 相同且不消耗新的 Sequence Number,NOP Flit 出错时也无需 Retry;Idle Flit 中 DLP 字段也是空的,DLP 字段填充了 NOP2 DLLP(全零),Flit Sequence Number 为 0,出错时也无需 Retry。

  跟 NOP/Idle Flit 相对的 Flit 便是 Payload Flit。当前 Flit Type 存放在了 DLP[0] 中。


2022.11.08 - Flit Mode 时,TLP Header 需要放在 Flit 固定位置吗?

  Flit Mode 时,TLP 起始位置是 4DW 对齐的。Flit Mode 时只规定了 TLP、DLLP、CRC、ECC 等在 Flit 的位置,但没有要求 TLP 中的 Header 具体应该放在哪儿,可以放在 Flit TLP Bytes 任意 4DW 对齐的位置。接收端通过 NOP 来查找 TLP 边界。


2022.11.09 - Flit Mode 时,若 TLP Size 小于 236B,该如何生成 Flit?大于 236B 时呢?

  TLP Size 大于 236B 时,一个 Flit 不够用,肯定需要拆分到多笔 Flit 中去。TLP Size 小于 236B 时,有可能该 TLP 能够完成得放在一个 Flit 中,也有可能会被拆成两笔放在两笔相邻的 Flit 中。不论 TLP Size 是多少,放在 Flit TLP Bytes 位置就好了。


2022.11.10 - Flit Mode 与 Non-Flit Mode 时的 TLP Header 有何不同?

  主要看到以下几点不同:

  • 取消了 Fmt,合并到 Type,Type 种类更多。
  • 新加了 TS (Trailer Size),用来指示 Trailer Size。目前,TS=000b 时表示没有 Trailer,TS=001b 时表示当前 TLP 包含 1DW 的 ECRC。OHC-C 时,TS=101b 指示 3DW IDE MAC,TS=110 指示 4DW IDE MAC 及 PCRC。其他的预留。
  • 新加了 OHC (Orthogonal Header Content),
  • TLP Prefix 相关内容合并到 OHC 中,通过 OHC 来指示。
  • 预留了 Suffix 后缀。

2022.11.11 - TLP Trailer 是什么?

  PCIe TLP 后可以跟一些 Trailer,比如 ECRC 及 IDE 机制的 IDE MAC。Flit Mode 下的 TLP Header 中新加了 TS (Trailer Size) 位域(如下图)来指示该 TLP 是否存在 Trailer 并指示 Trailer Size。目前,TS=000b 时表示没有 Trailer,TS=001b 时表示当前 TLP 包含 1DW 的 ECRC。对于 IDE TLP 而言,其 TLP Header 必须采用 OHC-C,TS=101b 指示 3DW IDE MAC,TS=110 指示 4DW IDE MAC 及 PCRC。其他的预留。

在这里插入图片描述


2022.11.12 - TLP Header 中的 OHC 是什么?

  OHC,全称 Orthogonal Header Content,正交头内容,是 PCIe Flit Mode 下新加的一个 TLP 字段。TLP Header Base (TLP 第一 DW,如下图) 中的 OHC 用来指示其后是否存在 OHC、是何种 OHC。不同的 OHC 代表了不同的 TLP Header 格式。更多 OHC 介绍请见《PCIe OHC 介绍》

在这里插入图片描述


2022.11.13 - PCIe TLP PCRC 是什么?

  PCRC 全称 Plaintext CRC,纯文本 CRC,是 IDE TLP 中的概念,PCIe 6.0 才出现。具体请查看 IDE 机制或者 Plaintext 机制。


2022.11.14 - NOP TLP 是什么?

  PCIe 工作在 Flit Mode 下,发送端没有 TLP 要发送时需要插入 NOP TLP。NOP TLP Header 中的 Type 字段全 0,其他所有字段 Reserved。NOP TLP 不携带 Data Payload,一笔 NOP TLP Size 为 1DW,在不消耗流控机制的 Credit。接收端收到 NOP TLP 后进行丢弃。

  若开启了 IDE 机制,NOP TLP 不能作为 IDE TLP 进行传递,接收端收到 NOP IDE TLP 后按照 Malformed TLP 处理。


2022.11.15 - NOP DLLP 是什么?

  NOP DLLP Payload 格式如下如所示,其 DLLP Type 为31h,Payload 字段可以为任意值。Flit Mode 及 Non-Flit Mode 时都有 NOP DLLP 的概念。Non-Flit Mode 时,NOP DLLP 仅用于链路测试场景,常规操作模式时不应发送 NOP DLLP;Flit Mode 时,发送端没有 DLP 要发送时需要插入 NOP DLLP。接收端接收到 NOP DLLP 后,在做完数据数据完整性检测后直接丢弃。

在这里插入图片描述


2022.11.16 - NOP2 DLLP 是什么?

  NOP2 DLLP Payload 格式如下如所示,其 DLLP Type 及 Payload 字段必须为全 0。NOP2 DLLP 是 PCIe 6.0 出现的概念,仅用于 Flit Mode。Idle Flit 时,DLP[2:5] 必须填充 NOP2 DLLP。

在这里插入图片描述


2022.11.17 - NOP DLLP 和 NOP2 DLLP 有何区别?

  大致有以下几点不同:

  • 格式不同。NOP DLP 是有具体意义的 DLP Type,DLP Payload 字段为任意值;NOP2 DLLP 的 DLP Type 及 Payload 均为全零。
  • 用处不同。NOP DLLP 支持 Flit Mode 及 Non-Flit Mode,而 NOP2 DLLP 仅出现于 Flit Mode。

2022.11.18 - Idle Flit 是什么?有何作用?

  Idle Flit 的 236B TLP Byte 全部为 NOP TLP,且 DLP Bytes 为全零,DLP[2:5] 为 NOP2 DLLP。Idle Flit 的 Sequence Number 为 0,且无需 Retry。

  Idle Flit 用于 PCIe 训练过程中。Flit Mode 下,LTSSM 处于 Configuration.Idle 或 Recovery.Idle 状态时,为 Idle Flit Handshake Phase,Tx 持续发送 Idle Flit。Rx 连续接收到两笔有效的 Idle Flit 后跳转到 Sequence Number Handshake Phase。


2022.11.19 - NOP Flit 是什么?有何作用?

  NOP Flit 是一种 TLP Byte 全部为 NOP TLP 的 Flit,出现于 PCIe 链路训练完毕之后。NOP Flit 的 236B TLP Byte 全部为 NOP TLP,DLP Byte 可以为任意有效的 DLP。只要有一笔为 Non-NOP TLP,该 Flit 就称不上是 NOP Flit。NOP Flit 的 DLP 字段仍然是有效的,可以承载流控等相关 DLP。

  NOP Flit 不占用流控相关 Credit,不占用 Flit Sequence Number 且无需 Retry,其 Sequence Number 采用前一 Flit Sequence Number。


2022.11.20 - Idle Flit 和 NOP Flit 有何区别?

  • 格式不同。Idle Flit 的 236B TLP Byte 全部为 NOP TLP,且 DLP Bytes 为全零,DLP[2:5] 为 NOP2 DLLP。NOP Flit 的 236B TLP Byte 全部为 NOP TLP,DLP Byte 可以为任意有效的 DLP。
  • 应用场景不同。Idle Flit 用于 PCIe 训练完毕进入 L0 之前,LTSSM 处于 Configuration.Idle 或 Recovery.Idle 时,Tx 持续发送 Idle Flit,Rx 连续接收到两笔有效的 Idle Flit 是 Rx LTSSM 进入 L0 的条件(之一)。NOP Flit 出现于 PCIe 链路训练完毕之后,当没有 TLP 要发送时,Tx 发送 NOP Flit。NOP Flit 中的 TLP Bytes 全部填充以 NOP TLP,DLP Bytes 仍照常发送 DLP,仍具备流控等相关功能。
  • 其他不同,比如 Flit Sequence Number,Idle Flit 的 SN 为 0,NOP Flit 的 SN 不一定为 0。

2022.11. 21- NOP TLP 和 NOP Flit 有何区别?

  同样都是 NOP 操作,但两者的单位不同。NOP TLP 是 TLP Level 的 NOP,其粒度为 1DW,该 TLP 内无需任何操作;NOP Flit 是 Flit Level 的 NOP,其粒度为 1 Flit,该 Flit 内无需任何操作。存在 NOP TLP 的 Flit 不一定为 NOP Flit ,但 NOP Flit 的 TLP Bytes 一定为 NOP TLP。但凡 TLP Bytes 内存在 1DW 数据非 NOP TLP,该 Flit 便称不上是 NOP Flit。


2022.11.22 - NOP Flit 和 NOP DLLP 有何关系?

  仅对 Flit Mode 而言,NOP Flit 和 NOP DLLP 没有太大关系。NOP Flit 中要求 TLP Bytes 全部为 NOP TLP,DLP Bytes 不要求是 NOP DLLP。当没有 DLLP 要发送时候,在 Flit 的 DLP Bytes 插入 NOP DLLP。NOP DLLP 不一定出现在 NOP Flit 中,Payload Flit 中的 DLP Bytes 也可以为 NOP DLLP。


2022.11.23 - PCIe Gen6 中 DLLP Type 有哪几种?

  Non-Flit Mode 下,DLLP Type 跟 PCIe 5.0 时的 DLLP Type 完全相同,有 Ack/Nak、Flow Control、PM 及 Vendor Defined、NOP 等这几大类 DLLP。

  Flit Mode 下,不支持 Ack/Nak,废弃了 MRInit、MRInitFC1、MRInitFC2 及 MRUpdateFC 等 MR-IOV 相关的 DLLP,新加了链路管理类的 LM DLLP(目前只服务于 L0p) 及 NOP2 DLLP。


2022.11.24 - Flit Mode 下的 DLLP 有何变化?

  • DLLP 格式上,Non-Flit Mode 的 DLLP 由 1B Type + 3B Info + 2B CRC 组成,Flit Mode 时 DLLP 由 1B Type + 3B Info 组成,没有独立的 CRC。
  • 支持的 DLLP Type 上,Flit Mode 下不支持 Ack/Nak,废弃了 MR-IOV 相关的 DLLP,新加了链路管理类的 LM DLLP 及 NOP2 DLLP。
  • 发送模式上,DLLP 不能独立发送,而是随 Flit 发送且发送 DLLP 之前不需要 SDP 等 Token。

2022.11.25 - Link Management DLLP 是做什么的?

  Link Management (LM) DLLP 首次出现于 PCIe 6.0 中,是一种用于链路管理的 DLLP。LM DLLP 包格式如下图所示,其中关键位域释义如下:

  • DLLP Type,值为 28h,用以指示当前 DLLP 为 LM DLLP。
  • Link Mgmt Type,用以指示链路管理的类型,目前 LM DLLP 仅用于 L0p 相关链路状态管理,Type=00h。
  • L0p.Cmd,用以指示当前 L0p DLLP 是 Request 还是 Response、是何种 Response (Ack/Nak)。
  • L0p.Priority,用以指示当前 L0p 请求的优先级,支持常规优先级及高优先级两种模式。
  • Link Width,当 L0p.Cmd 为 L0p Request 时,该位域表示 L0p Request 请求的链路宽度。
  • Response Payload,当 L0p.Cmd 为 L0p Request Ack/Nak 时,该位域表示对某链路宽度 L0p Request 的响应。

在这里插入图片描述


2022.11.26 - PCIe 6.0 规定的 DLLP Payload 有哪几种?

  DLLP Payload Type 不同于 DLLP Type。DLLP Payload Type 分为常规 DLLP Payload、Optimized_Update_FC 及 Flit_Marker。常规 DLLP Payload 即 FC/PM/LM 等这些 DLLP,Optimized_Update_FC 及 Flit_Marker 属于非常规的 DLLP。DLLP Payload Type 及 DLLP Payload 最高位共同决定当前的 DLLP Payload 类型。


2022.11.27 - Flit_Marker 是什么?有什么用?

  Flit Marker 出现于 PCIe 6.0,Flit Mode 下用以指示当前 Flit 中最后一笔 TLP 的有效性

  Flit Marker Size 为 4B,是 DLLP Payload 的一种,位于 Flit DLP Byte 的 DLP[2:5] 位置。DLP[0:1] 中的 DLLP Payload Type 指示当前 DLLP Payload Type。DLLP Payload Type 值为 1b 时,表示当前 DLLP Payload Type 为 Flit_Marker 或 Optimized_Update_FC (两者共用),两者通过 Payload bit[31] 进行区分,bit[31]=1 时为 Flit_Marker。

  Flit Marker 格式如下图所示,包含 Flit_Marker Indicator、Flit_Status 及 PTM Message contained 位域。Flit Status 能够指示 ①No special information、②Last TLP Nullified、③Last TLP Posioned 这三个状态,接收端需要根据该状态对接收到的 TLP 进行处理。Flit Marker 中的 PTM Message Contained bit 指示当前 Flit 中是否包含有效的 PTM Message 的最后一个 Symbol。

  注意:Flit_Marker 跟 TLP 状态有关,需要跟 TLP 一起保存在 Retry Buffer 中。

在这里插入图片描述


2022.11.28 - Optimized_Update_FC 是做什么的?跟常规 UpdateFC 有何区别?

  Optimized_Update_FC 是流控包的一种,仅用于 Flit Mode。

  Optimized_Update_FC 格式如下如所示,其中包含 Shared NPR HdrFC、Shared PR HdrFC 及 Shared PR DataFC,没有 HdrScale 及 DataScale。Completion HdrFC 及 DataFC 在 Merged FC 机制中合入了 PR。

  Optimized_Update_FC 无需保存进 Retry Buffer。

在这里插入图片描述


2022.11.29 - PCIe Flit Mode 时,Selective Nak 是什么?

  Selective Nak 是和 Standard Nak 相对的一个概念,初现于 PCIe 6.0。PCIe Flit Mode Ack/Nak 机制中,并非每一笔 Flit 都需要响应以 Ack/Nak。当收到 Nak 之后,根据 Nak 类型来选择需要重传的 Flit。若为 Standard Nak,则 Nak Flit Sequence Number 之前未经 Ack 确认的 Flit 均需要重传;若为 Selective Nak,则仅需要重传 Nak 所对应的 Flit。Selective Nak 实现的前提是接收端具备 Rx Retry Buffer。


2022.11.30 - PCIe 6.0 Retry 机制中,Implicit Flit Sequence Number 是做什么的?

  Implicit Flit Sequence Number,或者说 IMPLICIT_RX_FLIT_SEQ_NUM,是 PCIe Flit Mode 流控机制中接收端用来计数/编号接收到的 Flit 的。对于接收到的 Flit,并非所有 Flit 都携带了 Explicit Flit Sequence Number,也并非所有携带 Explicit Flit Sequence Number 的 Flit 都需要计数。Rx 端按照一定规则(参考文档 IMPLICIT_RX_FLIT_SEQ_NUM Rules)赋予接收到的 Flit 一个编号(即 IMPLICIT_RX_FLIT_SEQ_NUM),保证流控机制的正常运转。


Title: "The Challenge" [Opening shot of a group of friends gathered around a table, looking bored.] Person 1: "I'm so bored, we never do anything exciting anymore." Person 2: "Yeah, it's like we've run out of things to do." Person 3: "What if we do a challenge?" [Everyone looks at each other, intrigued.] Person 4: "What kind of challenge?" Person 3: "I don't know, something fun and different. Something we've never done before." Person 1: "Like what?" Person 3: "How about a cooking challenge? We each have to make a dish and then we judge who made the best one." Person 2: "Nah, we've done that before. We need something more challenging." Person 4: "What about a scavenger hunt?" Person 3: "Ooh, that could be fun! We could split up into teams and see who can find everything on the list first." Person 1: "But what would we be looking for?" Person 4: "How about we make a list of random things, like a red shoe, a piece of string, a paper clip, and a seashell." Person 2: "And we have to take a video or picture with each item to prove we found it." Person 3: "That's a great idea! Let's do it." [Cut to the teams searching for the items, with fast-paced music playing in the background. They run through the streets, go into stores, and even ask strangers for help.] [Cut to the teams back at the table, with all the items laid out in front of them.] Person 1: "Wow, that was so much fun!" Person 2: "I can't believe we found everything on the list." Person 3: "But now we have to decide who won." Person 4: "Let's each take turns presenting our videos and pictures to the group and we'll vote on the best one." [Cut to each team presenting their videos and pictures, with funny commentary and reactions from the group.] [Closing shot of the group laughing and high-fiving each other.] Person 1: "That was definitely one of our best challenges yet." Person 2: "Yeah, we should do this more often." Person 3: "I'm already thinking of ideas for our next challenge!"
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MangoPapa

请作者喝瓶可乐吧

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

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

打赏作者

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

抵扣说明:

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

余额充值