接前一篇文章:《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(15)
1.3 PCI总线的存储器读写总线事务
1.3.5 Delayed传送方式
如前文所述,当处理器使用Non-Posted总线周期对PCI设备进行操作、或者PCI设备使用Non-Posted总线事务对存储器进行读操作时,如果数据没有到达目的地,那么在这个读操作路径上的所有PCI总线都不能被释放,这将严重影响PCI总线的使用效率。
为此,PCI桥需要对Non-Posted总线事务进行优化处理,并使用Delayed总线事务处理这些Non-Posted总线事务。PCI总线规定只有Non-Posted总线事务可以使用Delayed总线事务。PCI总线的Delay总线事务由Delayed读写请求和Delay读写完成总线事务组成。当Delay读写请求到达目的地后,将被转换为Delay读写完成总线事务。基于Delay总线请求的数据交换如图1-4所示:
假设处理器通过存储器读、I/O读写或者配置读写访问PCI设备22时,首先经过HOST主桥进行存储器域与PCI总线域的地址转换,并由HOST主桥发起PCI总线事务;然后,通过PCI桥1、PCI桥2,最终到达PCI设备22。其详细步骤如下:
(1)HOST主桥完成存储器域到PCI总线域的转换,然后启动PCI读总线事务;
(2)PCI桥1接收此读总线事务,并首先使用Retry周期,使HOST主桥择时重新发起相同的总线周期。此时PCI桥1的上游PCI总线将被释放(值得注意的是,PCI桥并不会每一次都使用Retry周期,使上游设备择时进行重试操作。在PCI总线中,有一个“16 Clock”原则,即FRAME#信号有效后,必须在16个时钟周期内置为无效。如果PCI桥发现来自上游设备的读总线事务不能在16个时钟周期内结束时,则使用Retry周期终止该总线事务);
(3)PCI桥1使用Delayed总线请求继续访问PCI设备22;
(4)PCI桥2接收这个总线请求,并将这个Delayed总线请求继续传递。此时PCI桥2也将首先使用Retry周期,使PCI桥1择时重新发起相同的总线周期。此时PCI桥2的上游PCI总线被释放;
(5)这个数据请求最终到达PCI设备22,如果PCI设备22没有将数据准备好,也可以使用Retry周期,使PCI桥2择时重新发起相同的总线周期;如果数据已经准备好,则PCI设备22将接收这个数据请求,并将这个Delayed总线请求转换为Delayed总线完成事务。如果Delayed总线请求是读请求,则Delayed总线完成事务中含有数据,否则只有完成信息而不包含数据;
(6)Delayed总线完成事务将“数据或者完成信息”传递给PCI桥2,当PCI桥1重新发出Non-Posted总线请求时,PCI桥2将这个“数据或者完成信息”传递给PCI桥1;
(7)HOST主桥重新发出存储器读总线事务时,PCI桥1将“数据或者完成信息”传递给HOST主桥,最终完成整个PCI总线事务。
由以上分析可知,Delayed总线周期由Delayed总线请求和Delayed总线完成两部分组成。下面将Delayed读总线请求事务简称为DRR(Delayed Read Request),Delayed读完成总线事务简称为DRC(Delayed Read Completion);而将Delayed写总线请求事务简称为DWR(Delayed Write Request),Delayed写完成总线事务简称为DWC(Delayed Write Completion)。
PCI总线使用Delayed总线事务,在一定程度上可以提高PCI总线的利用率。因为在进行Non-Posted总线事务时,Non-Posted请求在通过PCI桥之后,可以暂时释放PCI总线。但是采用这种方式,HOST/PCI桥将会择时进行重试操作。在许多情况下,使用Delayed总线事务,并不能去的理想的效果,因为过多的重试周期也将大量消耗PCI总线的带宽。
为了进一步提高Non-Posted总线事务的执行效率,PCI-X总线将PCI总线使用的Delayed事务升级为Solit总线事务。采用Split总线事务,可以有效解决HOST/PCI桥的这些重试操作。Split总线事务的基本思想是,发送端首先将Non-Posted总线请求发送给接收端,然后再由接收端主动地将数据传递给发送端。
除了PCI-X总线可以使用Split总线事务进行数据传送之外,有些处理器(如x86和PowerPC处理器的FSB(Front Side Bus)总线)也支持这种Split总线事务,因此这些HOST主桥也可以发起这种Split总线事务。在PCIe总线中,Non-Posted数据传送都使用Split总线事务完成,而不再使用Delayed总线事务。
至此,第1章第3节“PCI总线的存储器读写总线事务”全部结束。