PCI总线是一种吞吐量高,访问延迟小的I/O总线。本节主要对预测并控制该总线在最坏情况下的访问延迟之机制加以描述,以使得读者在对一个独立的PCI环境的访问延迟进行预测时,具有较高的准确性和精确性。但是,如果系统中含有一个标准扩展总线(ISA、EISA或MC总线),那么访问延迟的预测会变得跟为困难,这是因为,此时最坏情况下的访问延迟收到扩展总线或适配器的限制可能要大于PCI总线的限制。
6.1、PCI总线上访问延迟的概念
PCI总线上设备的访问延迟由三部分时间组成,如下图所示。其中第一部分为仲裁延迟,是指主设备从发出REQ#信号到收到GNT#信号这一段等待时间,其长短取决于仲裁算法、请求设备的优先级和系统的利用率。对于优先级最高的设备,一般也是两个时钟周期;第二部分是总线获取延迟,也就是设备需要等待多长时间才能使用总线;最后一部分是目标延迟,是指目标设备为第一次数据传输发TRDY#信号所需的时间。
只要目标设备能搞发出或接收数据,则PCI主设备的突发传输长度不受限制,并且在没有其它设备请求使用总线的情况下,传输可以一直进行下去。为此,在PCI总线中采用两种方式以决定一个主设备在有其它请求的情况下占有总线的时间长短,从而使总线获取延迟成为可预测的。
1、主设备延迟计数器(LT)
每个主设备的LT在该设备未发FRAME#信号时是被清零且挂起的。当主设备发出FRAME#时,它的LT开始计数。如果该设备在计数器溢出之前就撤销了FRAME#信号,则它的LT就不起作用。但是,一旦计满,该设备必须在它的GNT#撤销时立即发动传输终止。实际上,LT的最大计数值(以时钟周期为单位)表示分配给该设备的最小保证时间片,超过这个时间,只要GNT#无效,就必须立即停止占用总线。
2、目标发动的终止
目标设备对TRDY#和STOP#两个信号要具备处理能力,使它耗费的数据期达到N时(N=1,2,3,……)就结束传输。这里N的具体确定条件时N+1个数据期的延迟增量大于8个时钟周期。例如,设一个PCI主设备从扩展总线读出要用15个时钟周期,利用上述规则令N=1,这样,到第二个数据期的访问延迟是15个时钟周期,因此目标设备必须在完成第一个数据期时终止传输。
对于第一个数据期的访问延迟没有限制,例如,假设在一个系统中没有从设备完成第一数据期需要TRDY#的延迟大于T+8(T为LT的计数最大值)个时钟周期,根据这一假定及上面叙述的机制可以得出,主设备完成传输的最长时间为T+8个时钟周期(假设它的GNT#在LT计满之前就撤销了)。若T=40,则最大的传输时间为48个时钟周期,这在33MHz下,相当于1.44us。
实际上,T代表了吞吐量和访问延迟之间的折衷。例如,如果主设备和从设备都能以0等待周期突发传输数据,并且第一个数据期的延迟是8个时钟,那么当T=40时可做到连发40-8=32个数据期;若把T降为20则突发传输次数降为12~14次,但这样可以把传输的时间限制在28个时钟之内,即0.84us。
6.2、访问延迟的确定
随着每一个特定系统中所用设备的不同,其具体实现中的访问延迟也会发生变化,这就要求PCI设备的制造商们应具备一些关于典型的访问延迟的确定措施,以使他们在决定芯片的缓冲能i时尽量减少失误,从而能做到既充分又不过量。
从图3.9可以看出,总线上的一个访问延迟可分为三种访问延迟成分。仲裁延迟对于最高优先级的设备一般为2个时钟,而低优先级设备的仲裁延迟取决于较高优先级设备的数量及使用程度,但比起前者要长一些。总线获取延迟的确定分两种情况,一种时取系统中第一数据期的最长延时;另一种时当所有的第一数据期延时都比较低时,取延时计数器(LT)的值。这里第一数据期延时是指从FRAME#信号有效到TRDY#信号发出之间的时间间隔。对于访问呢延迟的第三部分——目标延迟,一般取第一个数据的延迟。但是对CPU桥上的又经过缓冲的设备,其目标延迟可能会长一些。例如,当某设备通过有缓冲的CPU桥去访问主存时,该桥可能需要先冲洗缓冲器,才允许访问进行。这样一来,就使得目标延迟加大,其增加程度取决于冲洗面向何方和要冲洗缓冲区的大小。
下面给出几个例子说明几种在CPI上发生的不同事件序列的延迟计算方法,并且作如下的前提假设:
1)PCI总线的运行时钟为33MHz;
2)所有非扩展总线设备的第一数据延迟为16个时钟,即0.5us,以后的突发传输中,数据期间隔为8个时钟;
3)扩展总线上的字节访问需要1.5us,以使通过一个扩展总线进行32位访问时,第一个数据延时达到6us。
例1:一个主设备在请求使用总线时,正好PCI总线处于空闲状态,也就是说不会出现与其它设备发生竞争的现象。
计算方法:仲裁延迟一般取两个时钟。因为总线空闲,故总线获取延迟为0,目标延迟为16个时钟,总延迟为2+0+16=18个时钟,即0.54us。
例2:当一个主设备请求使用总线时,正好有另外一个设备刚刚开始在总线上传输数据。假定使用总线的设备要进行16个数据期的连发,且系统中的延时计数器LT为66个时钟,也就是2us。
计算方法:由于没有其它请求等待处理,因此仲裁延迟扔取2个时钟;总线获取延迟包括第一数据期的16个时钟、LT计满时所发的6个数据期耗费6x8=48个时钟及为照顾最后数据期的8个时钟,共计需72个时钟;目标延迟取16个时钟。在此例要特别注意仲裁延迟和总线延迟时重合的。总的访问延迟为2+72+16-2=88个时钟,即2.7us。
例3:一个主设备通过CPU桥请求总线传输,该桥有缓冲区需要冲洗,缓冲区的大小为4个字节,冲洗目的地为一个扩展总线。
计算方法:仲裁延迟仍然是2个时钟;总线获取延迟为0;目标延迟除了前述的16个时钟外,由于要进行缓冲区清洗,需要加长。具体情况是,CPU桥要请求总线以进行冲洗,需要2个时钟,整个冲洗过程需4x1.5us=6us(200个时钟);原来请求使用总线的主设备需发再试信号以再次请求总线,需2个时钟。因此总的访问延迟为2+4+200+16=222个时钟=6.73us。
6.3、访问延迟的处理原则
PCI总线能适合于吞吐量和访问延迟要求都比较高的设备。例如,当CPU发起一次屏幕刷新时,帧缓冲区的读写可能要好用很高比例的总线带宽,但是,只要典型的访问延迟不长,偶尔出现这种不常见的长的访问还是可以容忍的。在PCI总线中,诸如不限长度的突发传输(高带宽I/O块)和总线停靠(高带宽随机I/O,如帧缓冲区读写)等特性,都有利于设备吞吐率的提高。另一方面,一个10Mb/s的LAN设备只消耗很小的PCI带宽,为了保证类似设备使用的经济性,可利用PCI中像基于访问的仲裁和主设备延迟计时器等特性来限制最坏情况下的延迟,以尽量减少缓冲区要求,从而达到目的。例如一个深度缓冲的FDDI设备,本来在一次访问中可连发128个DWORD(双字),但在PCI总线中,可能被它的延时计时器限制而拆成了几次发送,从而可使缓冲的深度(大小)减小了许多。
在大多情况下,经常访问总线的设备都是对访问延迟较为敏感的设备。加之高吞吐率和低延迟往往又是互不相让的,所以PCI设备和系统的良好设计就显得尤为重要,力求做到使得跟访问呢有关的相互操作问题最少,以使其性能价格比趋于平衡而合理。
对于大多数PCI系统,典型的访问延迟约在2us以下,不算太长,但是最坏情况的访问呢延迟虽然少见却可能很长,并且有时无法估计。例如,通过一个桥对标准扩展总线适配器进行访问,其访问延时往往是由适配器决定而不是取决于PCI总线。为了补偿,主设备上必须提供30us的缓冲能力以保证其最坏情况下的访问限制,这样,即使有最坏情况的不确定性,但30us对实现熊设计来讲应当可以提供足够的富裕度。这样做虽然有些保守,但针对最坏情况下的不确定性,30us还是必要的。
对于一个主设备,如果可以忍受一个偶尔出现的访问延迟超限并不产生错误,那么为了减小最坏情况下的设计代价,可以按小于30us的值进行设计。例如,声音信号这样的数据流可以容忍一次偶然的取样丢失。
有些应用(如多媒体)可能对访问延迟环境的控制要求更加严格。同时要求从设备具有快速的、可预测的、受约束的访问延迟行为。对于此类设计,建议在目标接口的设计中遵循下列原则:
1)单层的目标设备(单层是指一个PCI目标提供对选定资源的直接访问)应把第一个数据期延迟限制在16个时钟以内。如果因暂时的原因(DRAM刷新等)会加长访问延迟使它超过16个时钟,就立即发再试。
2)多层目标设备(多层式指一个目标设备为了访问选定的资源还必须取得一个独立仲裁的资源)要能够使由于资源忙碌而冲突的访问再试。例如,一个对EISA从设备进行访问的设备,当发现EISA总线别另一主设备占有时,应当立即发再试信号。
3)对于多层目标设备(特别是总线与总线之间的桥)的写缓冲策略应多加小心,由于写缓冲使得对访问延迟的限制变得很困难。之所以这样,是因为很强的顺序要求迫使再一条总线上排队的写操作全部完成之后,才能允许进行其它的访问。这里特别强调的是,一个宿主CPU到PCI总线的桥要能把写数据转发到一个常驻PCI的帧缓冲器而同时阻止法网ISA/EISA/MC总线的写操作。
总之,为了方便作出良好的系统级取舍,设备供应商应当清楚地写明其设备在访问延迟方面的情况。