本章:
本章对PCI Express架构进行了全面的介绍,旨在作为“执行级别”的概述,在较高的层次上涵盖该架构的所有基础知识。它介绍了规范中给出的分层方法,并描述了每一层的职责。引入了各种数据包类型以及用于进行通信并促进可靠传输的协议。
下一章:
下一章将介绍PCI Express环境中的配置。
PCI Express简介
对比于PCI Express的前代协议标准,PCI Express对比于并行总线模型有了更加重大的转变。作为串行总线,它与早期的串行设计(如InfiniBand或光纤通道)有更多共同点,但在软件上,PCI完全向后兼容。
与许多高速串行传输一样,PCIe使用双向连接,并且能够同时发送和接收信息。由于每个接口都有一个单工发送路径和一个单工接收路径,因此使用的模型称为双工单工连接,如图2-1所示。由于同时允许双向双向通信,因此 从技术上讲,两个设备之间的通信路径是全双工的,但是该规范使用了术语双单工,因为它对现有的实际通信通道进行了更多描述。
图2-1 双单工链路
设备之间此路径的术语是链路(即Link),由一个或多个发送和接收对组成。一对这样的发送和接收对称为“通道”(即lane,后续都用lane来表示通道),并且该规范允许将Link组成1、2、4、8、12、16或32个lane。通道数称为“链接宽度”,并表示为x1,x2,x4,x8,x16和x32。在给定设计中要使用的lane数之间的权衡是很直接简单:更多的lane会增加链路的带宽,但会增加其成本,空间和功耗。
图2-2 一个通道(Lane)
软件向后兼容性
PCIe最重要的设计目标之一是能够与PCI软件进行向后兼容。需要符合两件事情就可以从已经安装的现有系统中迁移到外部系统:首先,是一项令人信服的改进,甚至可以促进更改;其次,将更改的成本,风险和努力最小化。在计算机系统中促进第二条件的一种常见方法是,在新模型中仍然保持对为旧模型编写的软件的兼容性和可行性。为实现PCIe,所有用于PCI的地址空间都将保留不变或简单扩展。内存,IO和配置空间仍然对软件可视,并且编程方式与以前完全相同。因此,多年前为PCI编写的软件(BIOS代码,设备驱动程序等)今天仍可与PCIe设备一起使用。配置空间已得到极大扩展去兼容许多新功能的新寄存器,与此同时,旧寄存器仍然存在,并且仍可以按常规方式访问。
串行传输
速度需求
当然,串行模型必须比并行设计快得多才能实现相同的带宽,因为它一次只能发送一位。但是,实践证明,这并不是困难的,在过去,PCIe已经在2.5 GT/s和5.0GT/s的速度下可靠地工作。达到这些速度甚至更高的速度(8GT/ s)的原因是串行模型克服了并行模型的缺点。
克服问题
作为回顾,有一些问题限制了并行总线的性能,图2-3所示展示了三个问题。为了开始传输数据,总线需要一个通用时钟,输出数据在一个时钟边沿移出,在下一个边沿移入接收器。该模型的一个问题是,从发射端到接收端发送信号所花费的时间,被称为飞行时间。飞行时间必须小于时钟周期,否则该模型将无法正常工作,因此要缩短时钟周期时就会引起困难。为了实现这一点,必须缩短走线并减少负载,但最终这变得不切实际。另一个因素是时钟在发送方和接收方的到达时间之差,称为时钟偏斜(clock skew)。电路板设计人员会努力降低此值,因为它会降低时序预算,但永远无法消除。第三个因素是信号偏斜(signal skew),这是给定时钟上所有所需信号到达时间的差异,很明显,直到所有位准备好并稳定后才能锁存数据,因此我们需要等待最慢的信号到达。
图2-3 并行总线限制
像PCIe这样的串行总线传输如何解决这些问题?首先,飞行时间变得没有问题,因为将数据锁存到接收器的时钟实际上内置在数据流中,并且不需要外部参考时钟。结果,无论时钟周期有多短或信号到达接收器所花费的时间都没有关系,因为时钟是同时到达的。出于同样的原因,也没有时钟偏移,这也是因为从数据流中恢复了锁存时钟。最后,由于仅发送一个数据位,因此可以消除通道内的信号偏斜。如果使用多通道(lane)设计,则会出现信号偏斜问题,但是接收器会自动纠正此问题,并且可以解决大量的偏斜问题。尽管串行设计克服了并行模型的许多问题,但是它们也有其自身的复杂性。当然,正如我们稍后将看到的,解决方案是可管理的,并允许高速,可靠的通信。
带宽
PCIe所支持的高速和宽链接的组合可以带来惊人的带宽数字,如表2-1所示。这些数字是衍生于比特率和总线特性。这样的特点是,与许多其他串行传输一样,前两代PCIe使用称为8b/10b的编码过程,该过程基于8位输入生成10位输出。尽管这样做会带来很多开销(overhead,开销的意思是带来冗余位),但这样做有几个充分的理由,我们将在后面介绍。
到目前为止,可以知道发送一个字节的数据需要发送10位。第一代(Gen1或PCIe规范版本1.x)比特率是2.5GT/s,并将其除以10意味着一个通道将能够发送0.25GB/s。由于链路允许同时发送和接收,因此总带宽可以是该数量的两倍,即每通道0.5GB/s。将第二代(Gen2或PCIe 2.x)的频率加倍会使带宽增加一倍。第三代(Gen3或PCIe3.0)再次将带宽提高了一倍,但是这次,规范撰写者不再选择将频率提高一倍的方法。原因我们稍后会讨论,他们选择仅将频率提高到8 GT/s,并删除8b/10b编码,而采用另一种称为128b/130b编码的编码机制(有关更多信息,请参见“物理层-逻辑(Gen3)”。表2-1总结了所有当前可能组合的可用带宽,并显示了Link在该配置下可以提供的峰值吞吐量。
Link Width | x1 | x2 | x4 | x8 | x12 | x16 | x32 |
Gen1 Bandwidth (GB /s) | 0.5 | 1 | 2 | 4 | 6 | 8 | 16 |
Gen2 Bandwidth (GB/s) | 1 | 2 | 4 | 8 | 12 | 16 | 32 |
Gen3 Bandwidth (GB/s) | 2 | 4 | 8 | 16 | 24 | 32 | 64 |
表2-1 各种链路宽度的PCIe聚合Gen1,Gen2和Gen3带宽
注:这里的带宽和网上的一些表格不一致,是因为本文的计算方式是把发送和接收都计算在内,所以总带宽是网上的两倍,下面的计算也有描述。
PCIe带宽计算
要计算上表中包含的带宽数量,请参阅以下概述的计算。
•Gen1 PCIe带宽=(2.5Gb/s x 2个方向)/每个符号10位= 0.5GB/s。
•Gen2 PCIe带宽=(5.0Gb/s x 2个方向)/每个符号10位= 1.0GB/s。
请注意,在上述计算中,我们将每个符号除以10位,而不是将每个字节除以8位,因为Gen1和Gen2协议均要求使用8b/10b对数据包字节进行编码
•Gen3 PCIe带宽=(8.0Gb/s x 2个方向/每字节8位= 2.0 GB/s。
请注意,在Gen3速度下,我们将每个字节除以8位,而不在每个符号中除以10位,因为在Gen3速度下,数据包未经过8b/10b编码,而是通过128b/130b编码。每128位有2位的额外开销,但它在计算中可以忽略。将这3个计算出的带宽数字乘以链路宽度,得出多通道链路上的总链路带宽。
差分信号
每个通道都使用差分信号,发送相同信号的正和负版本(D和D-),如图2-4所示。这当然使引脚数增加了一倍,但这样却可以通过两个明显的优势弥补了单端信号传递对高速信号至关重要的事情:提高了抗噪能力和降低了信号电压。
差分接收器获得两个信号,并从正信号中减去负电压,以找到它们之间的差并确定该位的值。差分设计中内置了抗扰性,因为成对的信号位于每个器件的相邻引脚上,并且它们的走线也必须彼此非常的靠近,以保持合适的传输线阻抗。因此,影响一个信号的任何事物也将以同样的方式影响另一个信号。接收器能甄别出它们之间的差异,而噪声并没有真正改变这种差异,因此结果是,大多数影响信号的噪声都不会影响接收器准确区分位的能力。
(简单来讲就是差分信号受到的干扰是一致的,当相减时,噪声也会被除去,那样就可以准确获得位的值)
图2-4差分信号
没有回复内容