草榴社区

PCIe 6.0 带宽的有效使用设计

草榴社区 TMM Richard Solomon

PCI Express (PCIe) 6.0 规范引入了新的 64GT/s 链路速度,使以前可用的 PCIe 带宽翻倍。使用这种新链路速度的设计人员需要意识到一些重大变化。这些变化会影响 SoC 设计,而不仅仅是明显需要将片上带宽加倍。本文重点介绍了 PCIe 6.0 除了 64GT/s 链路速度之外的重大变化。

64GT/s 的 PCIe 6.0 电器性 - 根本性的机制改变

为了实现 64GT/s 的链路速度,PCIe 6.0 采用脉冲幅度调制 4 级 (PAM4) 信号,在与 32GT/s PCIe 相同的单元间隔 (UI) 中提供 4 个级别(2 位)。图 1 显示了这三眼眼图与此前的单眼眼图的对比。

PCIe 6.0 PAM-4 信号结果

图 1:与 NRZ 信号相比,PCIe 6.0 PAM-4 信号是三眼眼图

 

不出所料,这些有所减小的眼图高度电压电平和眼图宽度,增加了新链路对错误的易感性。为缓解这种情况,6.0 规范在以 64GT/s 运行时实施了许多新功能。当将新的 4 级电压眼图映射到数字值时,格雷编码用于最小化每个 UI 内的错误,并且发送器应用预编码来最小化迸发错误。虽然这些功能很重要,但它们对 PCIe 6.0 控制器的数字逻辑几乎没有影响。在数字级别还应用了“前向纠错 (FEC)”功能,以改善误码率 (BER),这对 PCIe 协议和控制器设计都具有重大影响。

新一代协议

为了尽量减少 FEC 额外数据的开销,PCIe 6.0 引入了一种在 64GT/s 时所需的全新“FLIT 模式”运算,这从根本上改变了 PCIe 数据传输,即从基于符号的系统转变为更大的传输量(称为 FLIT)。这种变化需要在 PCIe 控制器内部进行大量的新设计。因此,PCIe 6.0 还引入了在 FLIT 模式下运算时使用的全新标头格式。新标头简化了解码,更好地分离 PCIe 属性,实现了与 PCIe 5.0 中的 10 位标签支持相比的 14 位标签支持等增强功能。当以 64GT/s 的速率运算时,FLIT 模式运算使用未编码数据(称为“1b1b 编码”),而 128/130 编码用于 8GT/s 至 32GT/s 的链路速度,而经典 8b10b 编码用于 2.5GT/s 和 5GT/s 的链路速度。

这些协议变化预期的结果(虽显遗憾),即与具有相同配置的 32GT/s PCIe 控制器相比,64GT/s PCIe 6.0 控制器消耗的硅面积显著增加。支持 1b1b 编码增加了第三物理层路径(位于 8b10b 和 128b130b 顶部),以及增加了数据链路层中的逻辑,以处理 FLIT 结构和相关变更。FLIT 模式中使用的新优化标头,还需要在事务层中具有新逻辑,进一步增加了逻辑门数,超过了 32GT/s 解决方案。

正如过去几代 PCIe 所常见的那样,向 64GT/s 的迁移会导致典型 PIPE 数据路径宽度增加,以保持与上一代相同的最大时钟频率。典型的 PIPE 宽度现在增加了一倍,达到每通道 64 位,以使时钟的最大频率保持在 1GHz,但硅面积也会相应增加。因此,4 通道设计现在为 256 位,8 通道设计为 512 位 - 这两种尺寸对于当前的 32GT/s 实现而言都是普遍可接受的。然而,现在需要 1024 位数据路径的 16 通道设计,这为某些用户带来了新的问题。

大多数当前的 CPU 设计使用 64 字节(512 位)的缓存线路,因此,由于每个时钟周期需要处理两条(或更多条)缓存线路,因此使用更宽的数据路径极其没有吸引力。此类设计人员最有可能寻求能够保持 512 位数据路径宽度的解决方案,即使因此需要多个应用接口。即便不使用这种 CPU 进行数据移动的设计,也可能需要多个内部代理才能使其 64GT/s PCIe 链路饱和,因此他们也可能会觉得多端口接口具有吸引力。当然,用于多端口接口和相关复杂排序逻辑的额外缓冲器,会导致此类 64GT/s PCIe 控制器的门数进一步增加。

每个时钟周期多个数据包

大于 128 位的数据路径宽度,可能会导致 SoC 需要在每个时钟周期处理多个 PCIe 数据包。最小的 PCIe 事务层数据包 (TLP) 可以被视为 3 个 DWORD(12 字节)加上 4 字节 LCRC,总共 16 个字节(128 位)。在 8GT/s 时,使用 PCIe PHY 的 500MHz 16 位 PIPE 接口最为常见,这意味着 8 通道或以下(16 位/通道 * 8 通道 = 128 位)的链路宽度会在每个时钟最多传输一个完整的数据包。但是,16 通道实现(16 位/通道 * 16 通道 = 256 位)在每个时钟可能会遇到两个完整的数据包。表 1 显示,随着链路速度的提高,问题会更糟,每个时钟的完整数据包的数量也会相应增加,从而随着每次新链路速度的提高而影响越来越多的设计。

数据路径宽度随链路速度而增加

表 1:数据路径宽度随链路速度而增加,导致更多配置超过 128 位阈值

多个应用接口 – 提高小数据包链路利用率

除了上文讨论的因素外,当传输大小小于接口宽度时,利用多个应用程序接口可显着提高整体性能。这是因为几乎总是将应用程序接口设计为每个时钟周期传输不超过一个数据包,这意味着小数据包会导致大量未使用的宽度。因此,对于较小的数据包,多个较窄的接口比单个较宽的接口更高效。

图 2 显示了 草榴社区 PCI Express 6.0 控制器 IP 上 64GT/s Flit 模式下在发送连续的 Posted TLP 流方面的传输链路利用率。对于更大的数据路径宽度,显然需要更大的数据包来通过单个应用程序接口保持完全的链路利用率,1024 位接口需要 128 字节的有效负载。

数据路径宽度随链路速度而增加

图 2:在 64GT/s FLIT 模式下,利用单个应用程序接口进行传输的各种有效荷载大小和数据路径宽度的链路利用率

 

相反,当 草榴社区 控制器配置为两个应用接口并运行相同的流量模式时,就会有明显的改进,现在 64 字节的有效负载即使在 1024 位数据路径中也能产生完全的链路利用率,如图 3 所示。

各种有效载荷大小和数据路径宽度的传输链路利用率

图 3:在 64GT/s FLIT 模式下,通过两个应用接口配置进行传输的各种有效载荷大小和数据路径宽度的链路利用率

松弛排序 – 64GT/s 利用率的关键因素

PCIe 排序规则需要 Posted 事务,例如内存写入保持有序,除非数据包标头中设置了松弛排序 (RO) 或 ID 排序 (IDO) 属性。使用 RO 集的 Posted 事务被允许传递任何先前 Posted 事务,而使用 IDO 集的事务仅被允许使用不同的请求者 ID 传递先前事务,这意味着它们来自 PCIe 链路上的不同逻辑代理。

以下场景将展示该属性对于达到完整的 PCIe 64GT/s 性能的重要性。即使 SoC 设计人员在实施时可能没有遇到这些问题,也应该考虑他们的 PCIe 链路合作伙伴可能会遇到这些问题 — 通过适当设置 RO 和/或 IDO 属性,他们的 SoC 可以提高该链路合作伙伴的性能!表 2-5 中所示的示例均利用 4 个 PCIe 内存的序列写入 256 字节中的每一个,表示将 1KB 有效载荷递送到地址 1000,然后是 4 个字节的 PCIe 内存写入,表示将“成功完成”指示递送到地址 7500。表中的每一行代表一个时间段,而三列(从左到右)表示事务到达 PCIe 引脚、应用程序接口和 SoC 内存。在所有 4 次内存写入之前,“成功完成”指示到达内存的任何场景都反映出失败,因为软件在收到指示后立即可进行数据处理,因此在交付正确的数据之前处理!

示例 1:只要一个应用程序接口的带宽至少等于 PCIe 带宽,该接口就显然可以正常工作。

单一全速率应用程序接口结果

表 2:单一全速率应用程序接口可正确传输数据

 

示例 2:双接口通常会出现故障,因为无法保证 SoC 中两个通往内存的独立路径之间的到达顺序。

显示双半速率应用程序接口失败

表 3:显示双半速率应用程序接口失败,原因是“成功完成”指示早于所有数据到达

 

示例 3:将强排序流量强制到单个接口可避免出现无序到达,但由于无法使用全部内部带宽,因此很快落后于 PCIe 链路。

显示双半速率应用程序接口失败

表 4:由于无法全速传输数据,所示的双半速应用程序接口失败

 

示例 4:当链路伙伴把数据有效载荷数据包标记为 RO 且把成功完成数据包标记为强排序时,两个半速率接口可以成功传输。请注意,当 RO 有效载荷数据无序到达时,非 RO 写入 7500 不被允许传递有效载荷写入,因此在发送所有先前写入之前,不会将其发送到应用接口。

显示双半速率应用程序接口成功

表 5:显示双半速应用程序接口通过对有效载荷数据使用松弛排序成功

 

SoC 设计人员对发送的数据类型给予一定的关注,可以在其出站数据流中设置 RO 属性,并显著提高 PCIe 链路性能。IDO 排序属性在许多情况下都具有类似的优势,大多数 PCIe 实现都可以将其应用于其传输的每个数据包!

具有 IDO 集的数据包仅被允许传输具有不同请求者 ID 的先前事务,这意味着数据包来自 PCIe 链路上的不同逻辑代理。大多数端点实现(单功能和多功能)都对与往返于其他 PCIe 端点的流量相关的数据排序漠不关心,因为它们通常只与 RC 通信。同样,大多数 RC 通常不会在多个端点之间混合相同的流量流,因此在这两种情况下,都没有与其他设备的请求者 ID 相关的排序问题。与此类似,大多数多功能端点对功能之间的数据排序漠不关心,因此也不必担心自己的请求者 ID 之间的排序。因此,大多数实施已经可以为他们发起的所有事务设置 IDO。

小数据包效率低下

虽然大多数设备几乎或完全无法控制其流量模式,但重要的是要意识到小数据包可以实现很少带宽。草榴社区 CoreConsultant 使用最大有效负载大小和往返时间 (RTT) 等参数来配置 PCIe 6.0 控制器中的缓冲区大小、突出 PCIe 标签数量和其他关键参数。图 3-4 显示了从 草榴社区 的 64GT/s x4 控制器的仿真中获得的数据,该控制器配置为 512 字节最大有效载荷大小和 1000nS RTT 扫描,覆盖一系列有效载荷大小和 RTT 值。如果在同一范围内重复相同的扫描,但任意一个参数降低,则当扫描通过优化范围后,性能会降低。

图 3:小尺寸 Posted 数据包效率低下

小尺寸 Non-Posted 数据包效率低下,在一系列往返时间范围内扫描

图 4:小尺寸 Non-Posted 数据包效率低下,在一系列往返时间范围内扫描

优化 64GT/s 设计的总结

实施 64GT/s PCIe 接口的 SoC 设计人员应确保其支持松弛排序属性,这是在整个 64GT/s 生态系统中实现高性能的关键部分。尽可能在传输的数据中设置松弛排序属性:有效载荷而非相关控制上的 RO,以及所有数据包上的 IDO,除非应用程序有异常要求。适当时,考虑利用松弛排序属性对接收路径中的数据进行可能的重新排序。

对多个应用程序接口的支持越来越普遍,SoC 设计人员应考虑,在应用程序接口带宽低于线路速率和/或典型流量模式小于应用程序接口宽度时,为多个应用接口进行设计。

为 x4 和更宽链路实施 64GT/s PCIe 的设计人员需要注意每个时钟周期的多个数据包,并应根据其典型流量大小考虑多个应用接口。

所有 64GT/s 实施者都应为 1GHz(或更快)的设计实现做好准备,并且应确保通过硅前性能模拟检查其假设。

草榴社区 提供完整的 PCIe 6.0 解决方案(包括控制器、PHY 和 VIP)。这些解决方案支持松弛排序属性、PAM-4 信号、FLIT 模式、L0p 电源、高达 1024 位的架构以及多个应用程序接口选项,有助于更轻松地过渡到 64GT/s PCIe 设计。