原文:Mindshare
译者:Michael ZZY
校对: LJGibbs
欢迎参与 《Mindshare PCI Express Technology 3.0 一书的中文翻译计划》
https://gitee.com/ljgibbs/chinese-translation-of-pci-express-technology
1.4.9 更高带宽的PCI(Higher-bandwidth PCI)
为了支持更高的带宽,PCI协议规范更新成了支持位宽更宽(64bit),时钟速率更快(66MHz)的版本,使其可以达到533MB/s的速率。图 1‑14展示了一个使用66MHz 64bit PCI总线的系统。
图 1‑14 基于66MHz PCI总线的平台
1.4.9.1 66MHz PCI总线的限制
66MHz总线的吞吐量相较于33MHz已经翻倍,但是其存在一定的问题,图 1‑14显示了它的一个主要缺点:66MHz总线与33MHz总线使用相同的反射波开关模型,使得留给在传输线上信号传输的时间减半,这将会大大的降低总线的负载能力。最终造成的结果是,一条总线上只能有一个插入板卡。增加更多的设备意味着需要增加更多的PCI Bridge来产生更多的总线,这将会增加成本以及对PCB板材的要求。同时,64bit PCI总线相较于32bit增加了引脚数,这也会增加系统成本且降低可靠性。将上述结合起来,就可以很容易看出来为什么这些因素限制了64bit或者66MHz版本的PCI总线的广泛使用。
1.4.9.2 并行PCI总线模型在66MHz以上时出现的信号时序问题
鉴于PCI总线上的实际负载以及信号渡越时间(signal flight times),PCI总线的时钟频率无法在66MHz上继续增加了。对于66MHz时钟来说,其时钟周期为15ns。分配给接收器的建立时间(Setup time)为3ns。因为PCI使用“非寄存输入(non-registered input)”信号模型,想要将其3ns的建立时间继续减小是不现实的。剩余的12ns的时序预算(timing budget)分配给了发送器的输出延迟以及信号传输时间。如果在66MHz的基础上进一步提高频率,那么总线上传输的信号将会因为无法及时到达接收端,无法在接收端被正确采样,从而导致传输失败。
在下一节将会介绍PCI-X总线,它将所有的输入信号都先用触发器来寄存一下,然后再去使用。这样做可以将信号的建立时间降低到1ns以下。在建立时间上的优化使得PCI-X总线可以跑到一个更高的频率,例如100MHz甚至133MHz。下一节中我们将会对PCI-X总线体系结构进行简明的介绍。
1.5 PCI-X简介
PCI-X对PCI的软件和硬件都能做到向后兼容,同时PCI-X还能提供更好的性能和更高的效率。它和PCI所使用的连接器也是相同的,因此PCI-X与PCI的设备可以插入相互的插槽。除此之外,它们二者还使用相同的配置模型,因此在PCI系统中能使用的设备、操作系统、以及应用,在PCI-X系统中仍然可以使用。
为了在不改变PCI信号传输模型的基础上达到更高的速率,PCI-X使用了几个技巧来改善总线时序。首先,他们实现了PLL(锁相环)时钟发生器,利用它在内部提供相移时钟。这使得输出信号在相位上前移,而输入再在相位上延后一点进行采样,从而改善总线上的时序。同时,PCI-X的输入信号都在Target设备的输入引脚被寄存(锁存),这样就使得建立时间更小。通过这些方法节省出来的时间可以有效增加信号在总线上传输的可用时间,并使得总线可以进一步提高时钟频率。
1.5.1 PCI-X系统示例(PCI-X System Example)
如图 1‑15所示,这是一个基于Intel 7500服务器芯片组的系统平台。
图 1‑15基于66MHz/33MHz PCI-X总线的平台
MCH(Memory Controller Hub)芯片提供了3个额外的高性能的Hub-Link 2.0端口,它们各与一个PCI-X 2 Bridge(P64H2)相连接。每个Bridge支持两条PCI-X总线,总线最高时钟频率可以达到133MHz。Hub Link 2.0可以支撑PCI-X更高带宽的数据流。需要注意的是,在PCI-X上我们依然存在与当初改进66MHz PCI时遇到的一样的负载方面的问题,这使得如果我们要支持更多的设备那么就需要使用Bridge来生成更多的总线,并且这将会是一个相对成本昂贵的解决方案。不过,现在的带宽确实提高了不少。
1.5.2 PCI-X事务(PCI-X Transactions)
如图 1‑16所示,这是一个PCI-X总线上Memory突发读取(burst memory read)事务。
图 1‑16 PCI-X Memory突发读取的总线时序周期示例
需要注意的是,PCI-X并不允许在第一个数据阶段(first data phase)后插入等待态。之所以这样做是因为PCI-X中会在事务的属性阶段(Attribute Phase),将需要传输的数据总量告诉Target设备。因此与PCI不同,Target是知道自己需要传输多少数据的。此外,多数PCI-X总线时序周期是连续的,因为使用的是突发模式,并且数据通常以128Bytes作为一个数据块(block)来进行传输。这些特性使得总线利用率提高,同时也提高了设备buffer管理的效率。
1.5.3 PCI-X特性(PCI-X Features)
1.5.3.1 拆分事务模型(Split-Transaction Model)
在传统的PCI读事务中,总线Master向总线上某个设备发起读取。如前面的内容所述,若Target设备未准备好,无法完成事务,那么它既可以选择在获取数据的同时让总线保持等待态,也可以发起Retry来推迟事务。
PCI-X则不同,它使用拆分事务的方法来处理这些情况,如图 1‑17所示。
图 1‑17 PCI-X 拆分事务处理协议
为了方便描述追踪每个设备正在做什么,我们现在将例子中发起读取操作的一方称为Requester(请求方),将完成读取请求提供数据的一方称为Completer(完成方)。如果Completer无法马上对请求做出相应的服务,它将把这个事务的相关信息存储起来(地址、事务类型、总数据量、Requester ID),并发出拆分响应信号。这就告诉Requester可以将这个事务先放置在队列中,并结束当前的总线时序周期,释放总线使之回到空闲状态。这样,在Completer等待所请求的数据这段时间里,总线上可以执行其他的事务。Requester在这段时间里也可以自由的做其他事情,比如发起另一个请求,甚至是向此前的那个Completer发起请求都可以。一旦Completer收集到了所请求的数据,它将会申请总线占用仲裁,当获取到总线的使用权后,它将发起一个拆分完成(Split Completion)来返回此前Requester所请求的数据。Requester将会响应并参与拆分完成这个事务的总线时序周期,在这个过程中接收来自Completer的数据。对于系统来说,拆分完成事务其实与写事务非常相似。这种拆分事务模型(Split Transaction Model)的可行性在于,在请求发起时就通过属性阶段(Attribute Phase)指出了总共需要传输多少数据,并且也告诉了Completer是谁发起了这个请求(通过提供Requester自己的Bus:Device:Function号码),这使得Completer在发起拆分完成事务时能够找到正确的目标。
对于上述的整个数据传输过程来说,需要通过两个总线事务来完成,但是读请求和拆分完成这两个事务之间的这段时间里,总线是可以执行其他任务的。Requester不需要重复的轮询设备来检查数据是否已经准备好。Completer只需要简单的申请总线占用仲裁,然后在能使用总线时将被请求的数据返回给Requester即可。就总线利用率而言,这样的操作流程使得事务模型更加高效。
到目前为止,对PCI-X所做的这些协议增强改进使得PCI-X的传输效率提高至约85%,而使用标准PCI协议则为50%-60%。
1.5.3.2 MSI消息式中断(Message Signaled Interrupts)
PCI-X设备需要支持MSI中断(Message Signaled Interrupts),在传统中断体系结构中经常见到多个设备需要共享中断,开发这种功能是为了减少或者消除这种需要。想要产生一个MSI中断请求,设备需要发起一个memory写事务,其操作地址为一段预先定义好的地址区域,在这个地址区域内的一个写入操作就会被视为是一个中断,这个信息将会被传送给一个或多个CPU,写入的数据则是发起中断的设备的中断向量,这个中断向量在系统中是唯一的,仅指向这一个设备。对于CPU来说,拥有了中断号之后就可以迅速的跳转到对应设备的中断服务程序,这样就避免了还需要花费额外的开销来查找是那个设备发起的中断。此外,这样的中断方式就不需要额外的中断引脚了。
1.5.3.3 事务属性(Transaction Attributes)
最后,我们来介绍一下PCI-X在每个事务开始时新加入的一个阶段,称之为属性阶段(如图 1‑16所示)。在段时间中,Requester会将所发起事务的一些信息传递给Completer,信息包括请求的总数据量大小、Requester是谁(Bus:Device:Function 号码),这些信息可以有效的让总线上的事务执行提升效率。除了这些以外,还新引入了2bit的信号来描述所发起的事务:“No Snoop(无窥探)”位与“Relaxed Ordering(宽松排序)”位。
l No Snoop(NS):一般来说,当一个事务要把数据移入或者移出Memory时,CPU内部的Cache需要检查被操作的Memory区域中是否存在已经被拷贝到Cache中的部分。若存在,那么Cache需要在事务访问Memory之前就把数据写回Memory,或是把Cache内的数据按失效处理。当然,这个窥探Memory内容有无出现在cache中的过程将会消耗一定的时间,并且会增加这个请求的延迟。在有些情况下,软件是知道某个请求的Memory位置永远不会出现在Cache中(这可能是因为这个位置被系统定义为不可缓存的),因此对于这些位置是不需要进行窥探的,应该跳过这一步骤。No Snoop位正是基于这种原因而被引入进来。
l Relaxed Ordering(RO):通常情况下,当事务通过Bridge的buffer时,事务间需要保持当初被放置到总线上时的顺序。这被称为强排序模型(Strongly ordered model),PCI与PCI-X一般都会遵循这种规则,除了一些个别情况。这是因为强排序模型可以解决有相互联系的事务之间的依赖问题,例如对同一个位置先进行写入再进行读取,按照强排序模型就可以使得读取操作读取到写入后的正确数据,而不是写入前的旧数据。然而实际上并不是所有的事务都存在依赖关系。如果有些事务不存在依赖关系,那么依然强制它们保持原来的顺序将会造成性能损失,这就是新添加这一属性比特位想解决的问题。如果Requester知道某个特定的事务是与此前其他事务不相关联的,那么就可以将这个事务的这一位置为有效,这样就能告诉Bridge可以在队列中向前调度该事务,提前执行,以此带来更好的性能。
1.5.4 更高带宽的PCI-X(Higher Bandwidth PCI-X)
1.5.4.1 PCI与PCI-X 1.0并行总线模型中由于公共时钟方法所带来的问题
当尝试将PCI这样的总线升级到更高的速率时,一个问题变得越来越明显,那就是并行总线设计存在一些固有的先天局限。图 1‑18可以有助于理解这个问题。这些设计通常使用公共时钟(common clock)或者是分布式时钟(distributed clock),其中,发送方在公共时钟的某一个时钟沿将数据输出,然后接收方在公共时钟的下一个时钟沿将数据锁存,也就是说用于传输的时间预算长度就是一个时钟周期。
图 1‑18并行设计的固有问题
需要注意的第一个问题是信号歪斜(signal skew)。当数据的多个bit在同一时刻被发出,他们所经历的延时会存在轻微的差别,这使得他们到达接收方的时刻也会存在轻微的差别。如果某些原因造成这种差别过大,那么就会出现图中所示的信号采样错误的问题。第二个问题是多个设备间的时钟歪斜问题。公共时钟到达各个设备的时间点并不是十分精确一致的,这也会大大的压缩了用于传输信号的时间预算长度。最后,第三个问题与一个信号从发送方传输到接收方所需要的时间有关,我们称这个时间为渡越时间(flight time)。时钟周期或是传输时间预算必须要大于信号渡越时间。为了确保满足这样的条件,PCB硬件板级设计需要让信号走线尽可能短,以此来让信号传输时延小于时钟周期。在许多电路板设计中,这种短信号走线的设计并不现实。
尽管存在这些自身局限,但是为了更进一步提升性能,还是有几项技术可以使用的。首先,可以对现有的协议进行简化而提高效率。第二,可以将总线模型更改为源同步时钟模型(source synchronous clocking model),在这种时钟模型中,总线信号和时钟(strobe选通脉冲)被驱动后将经历相同的传输延迟到达接收端(这里可以对比一下common clock与其的区别)。这种方法被PCI-X 2.0所采用。
1.5.4.2 PCI-X 2.0源同步模型(PCI-X 2.0 Source-Synchronous Model)
PCI-X2.0更进一步的提高了PCI-X的带宽。如此前升级时一样,PCI-X 2.0依然保持了对PCI的软件与硬件的向后兼容性。为了达到更高的速率,总线使用了源同步传输模型,来支持DDR(双倍数据速率)或是QDR(四倍数据速率)。
“源同步”这个术语的意思是,设备在传输数据的同时,还提供了额外一个与数据信号基本传输路径相同的信号。如图 1‑19所示,在PCI-X 2.0中,那个“额外”的信号被称为“strobe(脉冲选通)”,接收方使用它来锁存发来的数据。发送方可以分配data与strobe信号之间的时序关系,只要data与strobe信号的传输路径长度相近且其他会影响传输延迟的条件也相近,那么当信号到达接收方时,这种信号间的时序关系也将不会发生变化。这种特点可以用于支持更高速率的传输,这是因为在源同步时钟模型中,接收方采样所使用的strobe(类似于原来的时钟)也是数据的来源方发送的,这样就避免了公共时钟到达各设备的延时不同而造成的时钟歪斜问题,因为如上所述此时的data与strobe之间的时序关系是基本相对不变的,这样就将时钟歪斜的这段时间单独剔除了出去,不再占用原来的传输时间预算。除此之外,因为存在了strobe信号来随路指示接收方何时锁存采样数据,所以信号渡越时间不再是个问题,即使走线较长也依然能由伴随data的strobe信号来让接收方正确的采样数据,而不必纠结在下一个“时钟上升沿”必须要进行采样,现在strobe何时指示则在何时采样。
图 1‑19源同步时钟模型
需要再次强调的是,这种非常高速的信号时序使得共享总线模型无法被使用,它只能被设计为点对点的传输形式。因此,想要增加更多的设备就需要更多的Bridge来产生更多的总线。为了达到这样的使用方法,可以设计一种设备,它拥有3个PCI-X 2.0接口,其内部还有一个Bridge结构以此来让他们三者进行相互通信。不过,这样的设备将会具有很高的引脚数量,而且成本也会更高,这使得PCI-X 2.0被困在了高端市场而无法大面积普及。
由于协议制定者认识到了PCI-X 2.0的昂贵解决方案仅能吸引更多的高端开发者而不是一般开发者,因此PCI-X 2.0提供了更符合高端设计的技术标准,例如支持ECC的生成与校验。PCI-X的ECC比PCI中使用的奇偶校验要更为复杂,鲁棒性(robust)也要高得多,它可以动态的自动纠正单bit错误,以及对多bit错误进行可靠的检测。这种改进后的错误处理方法增加了成本,但是对于高端平台来说,它所能增加的可靠性才是更为看中的,因此即使增加了成本这也是一个合理的选择。
尽管PCI-X 2.0将带宽、效率以及可靠性都提升了,但是并行总线的终究还是走到了它的终点,需要一种新的模型来满足人们对于更高带宽且更低成本的不断的需求。最终被选中的新型总线模型使用的是串行接口,从物理层面来看它与PCI是完全不同的总线,但是它在软件层面保留了对PCI的向后兼容性。
这个新模型,就是我们所知道的PCI Express(PCIe)。
原文:Mindshare
译者:Michael ZZY
校对: LJGibbs
欢迎参与 《Mindshare PCI Express Technology 3.0 一书的中文翻译计划》
https://gitee.com/ljgibbs/chinese-translation-of-pci-express-technology
END