一、概述
PCI Express(PCIe)代表了从前代并行总线模型的重大转变。作为一种串行总线,它在设计上与早期的串行技术(如InfiniBand或Fibre Channel)更为相似,但在软件上保持了与PCI的完全向后兼容性。与许多高速串行传输一样,PCIe采用了双向通信,能够同时发送和接收信息。
PCIe使用的模型被称为双单工连接(dual-simplex connection),因为每个接口都有一个单工的发送路径和一个单工的接收路径。正如图2-1所示,由于流量允许同时在两个方向上传输,设备之间的通信路径实际上是全双工的,但规范中使用了"双单工"这个术语,因为它更准确地描述了实际存在的通信通道结构。
设备之间的通信路径被称为链路(Link),由一对或多对传输和接收通道组成。每一对传输和接收通道被称为通道(Lane),PCIe规范允许链路由1、2、4、8、12、16或32条通道组成。通道数量被称为链路宽度(Link Width),并表示为x1、x2、x4、x8、x16和x32。
在设计中选择使用多少通道涉及一个简单的权衡:更多的通道可以增加链路的带宽,但也会增加成本、空间需求以及功耗。因此,设计者需要根据实际需求平衡这些因素,以决定使用多少通道。
二、串行总线的优势
串行传输的速度需求与并行设计相比,串行模型每次只能传输一位数据,因此必须运行得更快才能实现相同的带宽。然而,这并不难实现,PCIe已经在2.5 GT/s和5.0 GT/s的速率下可靠运行,甚至达到了8 GT/s。这是因为串行模型克服了并行模型的一些性能限制问题。
克服并行总线的缺陷:并行总线存在几个问题限制其性能,图2-3中说明了其中的三个主要问题。首先,回顾一下并行总线使用的是公共时钟,输出数据在一个时钟沿发送,在下一个时钟沿接收。这个模型的一个问题是信号飞行时间(flight time),即从发送端到接收端的传输时间。飞行时间必须小于时钟周期,否则模型将无法工作。要实现更短的时钟周期,信号路径必须更短,负载也要减少,但最终这变得不切实际。另一个问题是时钟偏移(clock skew),即时钟到达发送端和接收端的时间差。尽管PCB设计师尽力缩小这个差距,它依然无法完全消除,并且会减少可用的时序预算。第三个问题是信号偏移(signal skew),即在同一时钟周期内,不同信号的到达时间差异。所有信号都必须到达并稳定后才能锁存数据,因此我们往往需要等待最慢的信号。
串行传输(如PCIe)通过几种方式解决了并行传输中的问题。
首先,飞行时间(flight time)不再是问题,因为用于锁存数据的时钟是嵌入在数据流中的,不需要外部参考时钟。在PCIe中,不需要一个公共时钟(common clock),因为它采用了源同步模型(source-synchronous model)。这意味着数据发送方提供用于锁存数据的时钟给接收方。与传统的并行总线不同,PCIe链路并不会传输一个独立的时钟信号,而是通过8b/10b编码将时钟嵌入数据流中。接收方通过从数据流中恢复出时钟,用于锁存接收到的数据。虽然这听起来可能比较复杂,但实际上该过程相对简单。
在接收端,锁相环电路(PLL, Phase-Locked Loop)使用输入的数据流作为参考时钟,并将其与PLL输出的指定频率的时钟进行相位比较。根据比较结果,PLL调整输出时钟的频率,直到两者完全匹配。当PLL达到这种状态时,称其为锁定(locked),这意味着恢复出的时钟频率与发送数据时使用的时钟频率完全匹配。PLL不断调整恢复的时钟,因此即便发送方由于温度或电压变化导致时钟频率的波动,PLL也能迅速进行补偿,保持时钟同步。然而,时钟恢复依赖于输入数据流中的信号过渡(即比特从1到0或从0到1的切换)来完成相位比较。如果数据流中长时间没有过渡,PLL可能会偏离正确的时钟频率。为了解决这个问题,8b/10b编码的一个设计目标是确保数据流中不会出现连续超过5个相同的比特(连续1或连续0)。这种设计保证了足够的信号过渡,从而维持PLL的正常运行并保持时钟锁定。因此,无论时钟周期多小,或信号到达接收端需要多长时间,都不会影响数据传输,因为时钟和数据是同步到达的。由于时钟从数据流中恢复,所以不存在时钟偏移(clock skew)的问题。
另外,在单通道(Lane)设计中,信号偏移(signal skew)也被消除,因为每次只传输一位数据。如果使用多通道设计,信号偏移问题可能会再次出现,但接收端能够自动纠正,并且可以修正大量的偏移。因此,虽然串行设计克服了并行模型中的许多问题,但也带来了自身的复杂性。不过,这些复杂性是可管理的,并且能够实现高速、可靠的通信。
带宽方面,PCIe结合了高速传输和宽链路,能够带来显著的带宽提升。如表2-1所示,这些带宽数字是基于比特率和总线特性得出的。和其他许多串行传输方式一样,前两代PCIe采用了一种称为8b/10b编码的机制,即将8位输入生成10位输出。尽管这种编码引入了一些开销,但它有很多优点。以第一代PCIe(Gen1或PCIe 1.x)为例,传输速率为2.5 GT/s,由于采用8b/10b编码,每条通道的实际带宽为0.25 GB/s。由于链路支持同时发送和接收数据,单通道的总带宽可以达到0.5 GB/s。
在第二代PCIe(Gen2或PCIe 2.x)中,通过将频率加倍,带宽也随之加倍。到了第三代PCIe(Gen3或PCIe 3.0),带宽再次翻倍,但这一次,规范制定者没有简单地将频率加倍,而是将频率提高到8 GT/s,并用128b/130b编码取代了8b/10b编码。这种新编码大大减少了开销,提高了传输效率。
总的来说,PCIe通过串行传输解决了并行传输中的许多问题,并结合高速度和宽链路,实现了更高的带宽性能。
三、PCIe带宽计算
PCIe带宽的计算基于链路宽度(通道数量)和每通道的传输速率。下面是计算带宽的基本步骤:
3.1 单通道的带宽计算
第一代PCIe(PCIe 1.x):传输速率为 2.5 GT/s(每秒25亿次传输)。由于采用了8b/10b编码机制,实际每传输10个比特只传送8个比特的有效数据。因此,实际的传输效率是80%,即每通道带宽为:
双向传输支持同时发送和接收,因此总带宽为:
第二代PCIe(PCIe 2.x):传输速率为 5 GT/s,仍然使用8b/10b编码。因此每通道的总带宽为:
双向传输的总带宽为:
第三代PCIe(PCIe 3.x):传输速率提升至 8 GT/s,采用更高效的128b/130b编码,实际编码效率为98.46%。因此每通道的带宽为:
双向传输的总带宽为:
第四代PCIe(PCIe 4.x):传输速率为 16 GT/s,同样采用128b/130b编码。每通道的总带宽为:
双向传输的总带宽为:
第五代PCIe(PCIe 5.x):传输速率提升到 32 GT/s,继续使用128b/130b编码。每通道的总带宽为:
双向传输的总带宽为:
3.2 多通道的带宽计算
PCIe支持多通道传输,常见的链路宽度包括 x1、x2、x4、x8、x16,我们可以通过简单的乘法来计算多通道带宽。
例如,PCIe 3.0在x16通道下的带宽位为:(双向总带宽为63.04 GB/s)
四、链路与通道
在PCIe中,两个设备之间的物理连接称为链路(Link),由一个或多个通道(Lane)组成。每个通道包含一对差分信号对:一个用于发送,另一个用于接收。一个通道足以支持设备之间的所有通信,不需要其他额外的信号。
然而,使用更多的通道可以提升链路的性能,性能取决于链路的速度和宽度。例如,使用多个通道可以在每个时钟周期内传输更多的数据位,从而提高带宽。根据PCIe规范,支持的通道数量是2的幂,最多可达到32条通道。此外,还支持x12链路,这可能是为了兼容早期串行设计如InfiniBand的x12链路宽度。