PCI系统结构(第四版) 第6章 之二

上一篇 / 下一篇  2007-12-26 14:47:15 / 个人分类:读书笔记

防止目标独占总线

   概述

   总线主设备贪取总线的问题可以由下列方法解决:

1. 每个主设备LT的介入;

2. 规定在任意数据段,主设备保持IRDY#无效不超过8PCI时钟。

但是,对于一个访问时间很慢的目标,当它与当前主设备传送数据项时,仍有可能独占总线。目标直到准备完成数据项的传送时,才有效准备信号TRDY#

 

目标必须迅速传送数据

 

概述

   PCI规范2.1版中讲述的慢目标问题,如果它占有总线时间太长,就要求慢目标终止未完成的传送(在全部试图传送的数据被传送支前)。当目标不必占有总线时,规范介绍了两种情况:

   情况1目标在FRAME#有效后16个时钟内,不能传送第一个数据项。

   情况2尽管目标在FRAME#有效后16个时钟内,能够传送第一个数据项,但它不能在相应数据段开始后8个时钟内,传送一个后继数据项。

   第一个数据段外的任意数据段都称为后继数据段。

       第一个数据段

   概述:如果目标在16PCI时钟内(从FRAME#有效起)不能完成第一个数据传送,那么目标必须立即向主设备发出重试。即在第一个数据段,目标:

    有效DEVSEL#声明交易;

    未有效TRDY#,表明它不想传送第一个数据项;

    有效STOP#,表明它想终止这个在第一个数据项没有数据传送的交易,因此交易中没有数据传送。

主设备对重试的反应:收到重试迫使主设备终止没有数据传送的交易,因此放弃总线让其他主设备使用。在两个PCI时钟之后(推荐),主设备能够重新有效其请求,当收到GNT#后,重新起动交易。交易必须被严格地重试。

因为16个时钟规则仅影响2.0版本以后的设备,主设备不能依赖目标在16个时钟内反应第一个数据段。2.1版规范之前设计的目标设备,能够用超过16个时钟来反应。

有时目标不能在16个时钟周期内传送第一个数据:如果某个目标的性质是这样的,如果它有时不能在FRAME#有效后16PCI时钟内完成第一个数据段,那么目标必须立即向主设备发出重试。但是,它不必“存储”交易并保持离线。当主设备重复请求时,目标将能够完成交易,仅当这种可能性高时就允许目标这样做。按照暂时的条件(如暂时的逻辑忙条件),目标不能迅速传送第一个数据项是少见的,并且当交易在下一次重复时,它准备在FRAME#有效后16个时钟内传送数据。

目标频繁地不能在16个时钟周期内传送第一个数据:如果目标频繁地不能在FRAME#有效后16个时钟内传送第一个数据项,它不仅必须向主设备发出重试,而且必须“存储”交易保持其离线。既:

    如果它是读交易,在地址段存储地址和命令,以及在第一个数据段字节使能后发出重试,然后它从慢目标(如ISA目标)开始读请求的数据。

    如果它是写交易,在地址段存储地址和命令,以及在第一个数据段字节使能和写数据后发出重试,然后目标起动写操作到慢目标。

这称为延迟读或延迟写。

第一个数据段规则的两个例外,仅有两个:

    在系统初始化时间(定义为RST#225次方)时钟),目标不必遵守16个时钟规则。在初始化时间后,所有目标在第一个数据完成中必须遵守16个时钟规则。

    允许正在侦测的HOST/PCI桥超过16个时钟限制,但不再超过32个时钟。假设PCI主设备正在访问主存储器,当HOST/PCI桥将存储器地址发送回到处理器,且在CACHE中被侦测,它能够在第一个数据段开始插入等待状态。只要在修改行有一次侦测,具有修改行的处理器将该行传送到桥,如果桥知道这个过程能够在主设备交易开始后32PCI时钟内完成,然后当侦测和可能的存储器更新发生时,它将PCI总线保持在等待状态就是合法的。

 

后续数据段规则

概述:如果目标用了超过8PCI时钟完成第一个之外的数据段(称为后继延迟时间溢出),并且不是最后数据段(FRAME#仍有效),那么目标必须迫使主设备终止交易。有两种情况分别描述如下:

在数据段,不能在8个时钟周期内传送数据:目标在进入数据段后,8个时钟内不能传送当前数据段中的数据项。此时,目标在进入数据段时已无效TRDY#(表示它不准备传送数据)。目标能够用下述两种方法中的一种来处理这个情况:

方法1在进入数据段后尽可能快地有效STOP#(不晚于数据段的第八个时钟)。DEVSEL#保持有效。这个信号组合指示主设备与当前数据段无数据传送的目标断开连接,称为无数据传送的连接断开。

方法2目标通过保持TRDY#无效,有效STOP#并无效DEVSEL#,向主设备发出目标失败信号。目标失败表明一个致命错误或者目标永远不能完成请求。

在这个数据段能传送,但在下一个却不能符合规则:目标在当前数据段能够在进入数据段8个时钟内传送数据项,但是,它知道这不是最后数据段(因为主设备仍有效FRAME#),并且它预先知道在进入下一个数据段8个时钟内不能传送下一个数据项。因此,在当前数据段,当它准备传送数据项时,它应该同时有效STOP#TRDY#DEVSEL#保持有效,这个组合指示主设备与当前数据段传送的目标断开连接,称为数据传送的连接断开。

主设备对连接断开的反应:为了反应目标连接断开,主设备必须终止交易,并可以选择以后在未传送的双字处重新开始(如果主设备预提取,它可以选择不重新开始交易)。经过两个PCI时钟后,收到连接断开的主设备能够重新有效其请求,并且当它收到GNT#时,在下一个数据项重新开始交易。

目标的后继延迟与主设备的延迟定时器:后继延迟时间溢出完全独立于设备的LT。目标无法看到主设备LT(反之亦然),因此它无法指出它是否时间溢出,这意味着慢访问目标总是(在LT到期前或到期后)与主设备断开连接,因此将整个突发交易分段为一系列单数据段交易。设备可能执行连接断开的两个例子如下:

    总是非常慢的目标(所有的ISA总线都是此类的)。

    有时表现出很慢访问的目标(可能因为缓冲区满情况或需要机械移动),并因此长时间占有总线。

 

在初始化时间的目标延迟

 

初始化时间与运行时间

初始化时间是执行POST(加电自检)代码,并查找与配置PCI设备的一段时间。在初始化时间完成后,运行时间开始。2.1版规范对这两个时间段作出很模糊的定义,而2.2版规范则清楚的多。在初始化时间里,不要求PCI设备遵守16个时钟内完成第一个数据段的规则。

初始化时间的定义与操作(2.2版前)

下列文字直接引自2.1版规范:

“在初始化时间里,所有设备遵守启动延迟规则,有两个例外。当RST#无效时,初始化时间开始,当POST代码初始化系统后初始化时间结束。POST代码完成后的时间被认为是运行时间。下面两个例外对起动延迟没有上限,并仅用于初始化时间:

    POST代码访问设备的配置寄存器。

    POST代码将扩展ROM内容拷贝到存储器。

在初始化时间后,被访问的目标必须遵守16个时钟起动延迟的要求。”

初始化时间的定义与操作(2.2版)

2.2版本规范定义,初始化时间在RST#无效时开始并在225次方)个PCI时钟后结束,此参数在规范中记为Trhfn(从复位高电平到第一次访问的时间)。在总线的频率为33MHZ时,它等于1.0066s;当总线频率为66MHZ时,它等于0.5033s。运行时间在初始化时间后面,如果在初始化时间内访问目标,允许目标做下列事情:

■不做请求(除非它是引导设备)。为了让处理器访问引导ROM,引导者必须作为目标反应,在典型的PC设计中,这通常是PCI-ISA桥。对于处理作到引导ROM通道上的设备应该在Trhff到期后立即到达交易的目标。

■声明这个访问,并保持在等待状态,直到它在初始化时间完成时做请求。

■声明这个访问,并用重试终止。

 

延迟的交易

 

问题

规定:从FRAME#有效起16个时钟内不能传递第一个数据项的目标,必须向主设备发出重试。即从主设备的观点看,交易被放弃了,主设备必须反复重试交易,直到目标在16个时钟内能够传送第一项数据。理论上,如果目标总是很慢,交易永远不会发生。显然这是不能接受的。

解决方案

6-4给出了一个例子。假设处理器起动交易,驻留在PCI总线1上的目标读数据或写数据到该目标,图中编号的步骤就是延迟交易的基本描述。

存储的信息

目标必须锁存下列信息,然后向主设备发出重试:

    地址;

    命令;

    字节使能;

    地址和数据奇偶校验;

    REQ64#(若是64位传输);

    对于采用延迟交易终止完成的写交易,目标必须保存来自字节使能有效的字节行的数据,同时可以有选择地保存来自字节使能无效的字节行的数据。

在延迟交易中主设备和目标的操作

在收到重试后,强制主设备结束没有数据传送的交易,并要求主设备使用同样的地址段和第一个数据段信息重试这个交易。如果是读请求,目标取得被请求的数据并置于缓冲区中,以便主设备在重试交易时读取。如果是写请求,目标试图传送写数据到目标设备。

 

   当目标看到主设备重试交易时,它就会同上次缩存的内容比较地址段与第一个数据段信息,使第二次请求与原来的请求相符合。如果相符,就采取以下行动:

    如果是读请求,在第一次数据传送所要求的16个时钟限制内,将请求的读数据传送到主设备。

    如果是写请求,目标有效TRDY#,表明最终目标已经接受写数据。如果不相符,目标将它译为新请求,并再次向主设备发出重试。总之,如果主设备每次重试交易时不能严格复制交易,它的请求永远不会完成。目标不会对不相符的重试提供服务。

能够使用延迟交易的命令

在原始总线上完成前,必须在目的总线上完成的全部交易可以作为延迟交易,这包括:

    中断确认;

    I/O读;

    I/O写;

    存储器读;

    存储器行读;

    存储器多行读;

    配置读;

    配置写;

即除存储器写命令外的一切。存储器写和存储器写与使无效命令在原始总线上立即完成,因为它们在桥上被报告。

请求未完成与重定目标

如果不同的主设备访问目标,而且只能处理已经锁存的请求,那么目标必须向没有锁存交易信息的主设备发出重试。

处理请求是监视专用周期

如果目标监视专用周期,它必须能够在处理过去锁存的读或写请求的同时,处理专用周期。

延迟请求的丢弃

已经“存储”延迟请求并向主设备发出重试的设备,可以在目的总线的请求起动之前,随时丢弃该请求,这是因为主设备会再次重试交易,从而使该设备有机会“再次存储”交易。

来自同一主设备的多个延迟请求

主设备可以陷入一个重试交易的不断重复之中,直到它成功地完成(在进行下一个交易前)或者主设备可以发出其他请求,每个都收到重试,主设备必须继续重试所有这些请求直到每个都完成。

在目标上的请求排序

16个时钟内频繁地不能完成第一个数据段的目标支持延迟交易。至少,它必须能够锁存一个交易请求,并把它作为延迟交易请求。如果主设备在完成当前锁存的交易请求前是某个后继交易的目标,那么它向主设备发出重试。并不存储这个交易,然后主设备重试这个丢失的交易,直到目标接受并完成交易。

目标能够有选择的接受并对多个交易请求排序,通常桥同时支持延迟交易排序和存储器写报告。

延迟完成的丢弃

一旦在目的总线上完成了延迟请求,它可以在下列两种情况下被丢弃:从预提取存储器读,一个预提取存储器目标可以非常好地处理这样的读操作——从同一个位置多次读,没有改变该位置的内容。如果交易是在存储区内读,而且桥知道是预提取存储器,或者命令是存储器行读或存储器多行读(两者都意味着原始主设备“知道”存储器区是预提取的),那么桥可以丢弃数据。这是允许的,因为当主设备重复交易,并从预提取存储器目标重新取得数据时,桥能够重新存储该交易。

在重复交易时主设备延迟:如果主设备在210次方)个PCI时钟(33MHZ时为30us)内没有重试交易,那么桥必须丢弃数据(如果是读交易)和交易的完成状态。但是,建议桥等到215PCI时钟(33MHZ时约为983us)已经取得数据和状态后才丢弃交易。当主设备按照规范的早期版本设计(2.2之前),并且不能严格重复第一次请求的交易时,这样的系统可以使用较短时间。在这种情况下,桥可以早些丢弃无用的延迟完成,并允许其他交易进行。但是,桥通常会等待更长的时间,防止交易的重试被另一个桥延误,或者按照规范的早期版本设计的桥不支持延迟交易。当这个定时器(称为丢弃定时器)到期时,应该丢弃数据(在读交易)和完成状态。

在读操作时报告数据的丢弃:当延迟完成与读数据一同丢弃时,设备可以采取下列两个行动中的一个:

    当数据从提取区读到时,规范建议忽略错误(因为存储器位置上的原始数据仍然正确)。

    当数据从非预留提取存储区读到时(如存储器映射I/O),建议向设备驱动程序报告错误。如果主设备是桥,最好在桥状态寄存器上设置位表明发生的事情并且应产生中断请求,以使驱动程序来检测其状态,或者使其芯片组的SERR#

处理多个数据段

当主设备成功完成第一个数据段时(即没有收到重试),它可以进行更多的数据段。

    如果是突发存储器读交易,目标(假定为桥)可以先取得附加数据到读缓冲区,并且能传送数据给主设备。桥仍能从目的总线上的目标读数据,然后让稳定的数据流通过桥,直到传送完成,目标断开连接,或者在相应的总线上先占有主设备的目标。

    如果是突发存储器的写交易,因为目标(桥)具有暂时满的报告存储器写缓冲区,从而较早地发生了重试,既然这样,桥可以部分地或全部地清空报告存储器写缓冲区,然后立即在缓冲区开始接受多个双字。

目标可以在第一个数据段后的任何一个发出连接断开,这种情况下,不要求主设备重新开始交易。主设备和目标设备都认为原始请求完成了。

主设备失败或目标失败的处理

在重试交易时,如果导致了主设备失败或收到目标设备失败,而不是重试,那么也认为延迟交易完成了,目标在发出目标失败前,确保主设备是发出原始请求的,或者让交易以主设备失败结束。这意味着因为没有目标响应,在目的总线上,交易以主设备失败结束,或者因为目标损坏,或不支持字节使能组合,而以目标失败结束(如它不拥有双字中的全部寻址的8位端口)。在这两种情况下,不要求主设备重复交易。

   什么是预提取存储器

   如果存储器表现出下列特点就称为预提取的:

    对读操作没有副影响(读不会改变存储器内容);

    无论字节使能的设置,存储器总是返回读的全部字节,这让目标表现出更好的性能,因为它没有在每个数据段插入一个时钟的等待,以便在提供数据前采样字节使能;

    桥能够在报告寄存器写缓冲区执行字节合并,以便在这个区无错误的写。

一般地,常规存储器是预提取的,而存储器映射I/O(或其他性能差的存储区)不是。配置软件能够通过检查存储器目标的基地址寄存器(BAR)的预提取位,来确定存储器目标是否为预提取的。

延迟的读操作预提取

如果目标知道预提取数据不会改变存储器单元的内容(即存储器是预提取的,预提取不会改变存储器的内容,而在存储器映射I/O端口却改变),那么延迟的读操作能够导致读到比主设备起动数据段所指示的更多的数据。在下列情况下,目标能取得比原始请求更多的数据:

    主设备使用存储器行读或存储器多行读命令,表示它知道目标区是预提取存储器。

    主设备使用存储器读命令,但接受延迟请求的桥识别出地址是在可预提取区;

在其他情况下,目标(桥)只能执行原始主设备指明的单数据段。


FPGA/CPLD器件价格查询

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar