Chapter 3 总线操作 Bus Operation
3.1 总线命令 Bus Commands
Master用于指示请求事务的类型,地址阶段编码在C/BE[3:0]# 信号线上。
| C/BE[3::0]# | Command Type |
|---|---|
| 0000 | Interrupt Acknowledge |
| 0001 | Special Cycle |
| 0010 | I/O Read |
| 0011 | I/O Write |
| 0100 | Reserved |
| 0101 | Reserved |
| 0110 | Memory Read |
| 0111 | Memory Write |
| 1000 | Reserved |
| 1001 | Reserved |
| 1010 | Configuration Read |
| 1011 | Configuration Write |
| 1100 | Memory Read Multiple |
| 1101 | Dual Address Cycle |
| 1110 | Memory Read Line |
| 1111 | Memory Write and Invalidate |
- 中断确认:读命令,隐式寻址中断控制器,地址不会明显出现在地址阶段,返回的中断向量大小由BE决定。
- 特殊周期:在PCI上提供了一个简单的广播机制(不跨越P2P桥,需使用Type1命令跨桥)。包含地址数据阶段,Master-Abort正常结束事务。Agent按需处理消息,不会断言DEVSEL#。可用于代替物理信号实现Agent之间的边带通信。
- I/O Read/Write:I/O地址空间读写,地址寻址。
- Memory Read/Write:Memory内存地址空间读写,地址寻址。
- Configuration Read/Write:配置空间读写,ID寻址。IDSEL断言 & AD[1:0]为00b。AD[7:2]寻址64个DWORD寄存器,AD[10:8]寻址8个Func,AD[31:11]独热码选择设备。
- Memory Read Multiple:用于批量顺序数据传输,顺序读取一个或多个额外的cacheline来获得一些性能优势(如果当前存储有对软件透明的缓冲区?)。
- Dual Address Cycle (DAC):双地址周期,用于在地址不在低 4 GB 地址空间时将 64 位地址传输到支持 64 位寻址的设备。
- Memory Read Line:一次读取一个完整的cacheline。同MW一样,在任何同步事件发生前将预取缓冲区prefetch buffer变得无效。
- Memory Write and Invalidate:至少传输一个完整的cacheline。如果超过行边界,则也要将下一行全写。需要在配置寄存器中指示cacheline大小。
命令的使用规则:
- 除了Host Bus Bridge,多有PCI设备都需要响应配置读写命令。
- 如果Target实现了基本的内存命令,那么就要支持所有的内存命令(MWI、MRM、MRL),否则需要将之转换为基本内存命令。
- Prefetchable 可预取内存有如下特征:i. 读操作没有副作用,不会破坏数据或状态信息;ii. 读操作时返回所有字节而忽略字节使能信号;iii. 允许桥将写操作合并Merge到该区域。
- 读命令寻址非cacheline首个字节时,也要读到cacheline结尾处。
- 根据读数据多少和设备支持的功能选择内存读命令:
| Commands | Conditions |
|---|---|
| Memory Read | When reading data in an address range that has side effects (not prefetchable) or reading a single DWORD |
| Memory Read Line | Reading more than a DWORD up to the next cacheline boundary in a prefetchable address space |
| Memory Read Multiple | Reading a block which crosses a cacheline boundary (stay one cacheline ahead of the master if possible) of data in a prefetchable address range |
Question,MRL和MRM的具体区别?
3.2 PCI协议基础 Fundmental
PCI基本传输机制:Burst,由一个地址阶段和一个或多个数据阶段组成(address phase + data phase)。Mem和I/O地址空间都支持Burst访问。
基本传输控制
所有PCI数据传输基本都由三个信号控制:FRAME#、IRDY#、TRDY#。
FRAME#、IRDY#都无效时中线处于Idle状态;FRAME#有效后的第一个时钟周期是地址阶段;FRAME#无效、IRDY#有效指示最后一个数据阶段。
IRDY#、TRDY#均有效时进行数据传输,任何一个无效指示等待周期。
当Master设置IRDY#后,直到当前数据阶段完成,否则不能改变FRAME#、IRDY#的状态。
当Target设置TRDY#后,直到当前数据阶段完成,否则不能改变DEVSEL#、TRDY#或STOP#的状态。
当IRDY#与TRDY#或STOP#其一同时有效时,指示完成一个数据阶段,TRDY#决定是否有数据传输。
寻址机制
三种物理空间:Memory、I/O、Configuration Address Space。
除Host Bus Bridge外,所有PCI Target都要求实现基址寄存器Base Address register BAR,用于请求地址空间,提供对内部寄存器或功能的访问。
强烈建议设备通过BAR请求地址空间时,将内部寄存器映射到Memory地址空间,而非I/O地址空间!
设备对地址进行解码,并通过设置DEVSEL#声明访问。
1. I/O地址空间解码
32位AD用于字节寻址,其中AD[1:0]用于指示最低有效字节。如下AD[1:0]与字节使能C/BE[3:0]的对应关系。
| AD[1::0] | Starting Byte | Valid BE#[3:0] Combinations |
|---|---|---|
| 00 | Byte 0 | xxx0 or 1111 |
| 01 | Byte 1 | xx01 or 1111 |
| 10 | Byte 2 | x011 or 1111 |
| 11 | Byte 3 | 0111 or 1111 |
2. Memory地址空间解码
32位AD中的AD[31:2]用于DWORD寻址,AD[1:0]用于指示数据传输的顺序。
| AD1 | AD0 | Burst Order |
|---|---|---|
| 0 | 0 | Linear Incrementing |
| 0 | 1 | Reserved (disconnect after first data phase) |
| 1 | 0 | Cacheline Wrap mode |
| 1 | 1 | Reserved (disconnect after first data phase) |
所有Target都需要检查AD[1:0],支持则进行传输,不支持则需要断开Disconnect:
i. 初始数据阶段使用 Disconnect With Data;ii. 第二个数据阶段使用 Disconnect Without Data。无论哪种方式断开事务,都只有一个数据阶段传输数据!
Linear Incrementing:每个数据阶段完成后的地址增加量,32位寻址增加DWORD,64位寻址增加QWORD。MRI只能使用此模式!
Cacheline Wrap:在cahceline中的任意地址偏移开始,以DWORD为单位,在cacheline中进行wrap;如果完成一个完整的cacheline后burst继续,那么从下一个cacheline中相同的偏移位置开始wrap;如果没有定义Cacheline Size寄存器,要Disconnect断开事务!
3. Configration地址空间解码
所有Device必须实现配置地址空间(Host Bus Bridge可选实现),Device给每个Function分配256字节空间。
两种类型的配置命令,AD[1:0]=00b标识Type 0 cmd,用于寻址当前总线上的设备;AD[1:0]=01b标识Type 1 cmd,用于跨PCI桥寻址设备。

6位AD[7:2]选择64个寄存器中的一个(256字节配置空间中的一个DWORD);3位AD[10:8]选择8个Func中的一个;5位AD[15:11]选择32个设备中的一个;8位AD[23:16]选择256个总线中的一个。
Type 0事务没有设备响应时以Master-Abort结束。Type 1事务仅由PCI桥处理,首先解码总线号,然后选择不加修改的转发或转换为Type 0事务。PCI桥通过对设备号解码进而选择对应设备,置位其IDSEL。
4. 软件生成配置事务 Software Generation
系统必须提供的机制,允许软件生成配置事务,通常在Host Bridge主桥中实现。
设备驱动器通过OS提供的API访问设备的配置空间,而非通过硬件基址直接访问。
PC-AT兼容系统通过两个DWORD I/O空间生成配置访问:CONFIG_ADDRESS (CF8h)、CONFIG_DATA (CFCh)。
只有指向给定地址的DWORD访问才是CONFIG_*,其他各种访问都以普通I/O事务进行处理!

当主桥处理指向CONFIG_DATA地址的DWORD访问时,首先检查CONFIG_ADDRESS的 Enable 位和 Bus Number 字段,然后进行事务转换。
事务转换有两种类型,根据Bus Number确定Type 0/1:对于Type 0转换,主桥解码Device Number字段,通过AD[31:11]以独热码的形式连接总线上设备的IDSEL信号线,其余字段直接复制;对于Type 1转换,AD[1:0]置为01b,其余字段直接复制。

对于两种转换,字节使能都是直接幅值到总线上。
5. 软件生成特殊周期
6. 设备配置空间的选择 Selection
初始化时使用IDSEL选择设备,片选信号,每个设备有自己独立的IDSEL输入。
设备响应配置事务的两种类型:
i. 单功能设备,检查是config cmd、IDSEL拉高、AD[1:0]=00b,Function Number字段可以:不解码响应所有;解码且只响应Func 0。
ii. 多功能设备,检查是config cmd、IDSEL拉高、AD[1:0]=00b、AD[10:8]匹配一个实现了的Func。必须实现Func 0,其他可选,且顺序、序号任意。
AD[7:2]寻址DWORD,BE确定具体字节(支持任意组合形式的字节访问,byte/word/dword/non-contiguous)。
如果配置事务包含多个数据阶段,设备允许通过Disconnect断开事务(不用Target-Abort,因为并非错误状态)。
配置事务包含多个数据阶段时,只能使用线性序突发,地址以DWORD增加。
7. 系统生成IDSEL
连接到AD信号线的高21位AD[31:11]。Device 1连接AD[17],依次进行Device 15连接AD[31],其余Device 17-31的访问以Master-Abort结束。
字节通道和字节使能 Byte Lane and Byte Enable
对于DWORD或小于DWORD的访问,总线不支持自动调整总线大小(automatic bus sizing)。
如果Master将63位数据传输给32位设备,则协议要求自动调整总线大小。
字节使能决定哪些字节携带有意义的数据,可以在数据阶段之间任意改变,在整个数据阶段有效,与IRDY#无关。
读可预取区域数据,将忽略字节使能信号,返回所有通道的字节。
总线驱动和周转 Driving and Turnaround
所有由多个代理驱动的信号都需要一个周转周期!当一个代理停止驱动信号而另一个代理开始驱动信号时,需要周转周期来避免竞争。
RDY#、TRDY#、DEVSEL#、STOP# 和 ACK64# 使用Address Phase作为周转周期。
FRAME#、REQ64#、C/BE[3::0]#、C/BE[7::4]#、AD[31::00] 和 AD[63::32] 使用事务之间的 Idle 状态(FRAME# 和 IRDY# 均无效)作为周转周期。
在每个地址和数据阶段,所有 AD 线都必须驱动为稳定值,即使是字节使能无效的字节。为了奇偶校验的计算,以及快速进行无亚稳态锁存。
奇偶校验考虑所有AD信号线。无效字节建议保持不变以节省功耗。
事务排序和发布 Ordering and Posting
事务排序规则主要完成以下三件事:
i. 满足消费者消费者模型的“写入结果”排序要求;
ii. 允许Post提高性能;
iii. 在满足第一个要求而刷新Posting buffer时,必须防止死锁发生。
根据中间代理(桥)处理事务的方式,可以将事务分为两大类:
i. Posted,到达最终目的地之前在发起设备上完成。本质上,中间代理代表实际目标接受数据,并负责确保访问在最终目的地完成。允许MW、MWI Posted。
ii. Non-posted,在原始设备完成之前到达最终目的地。主设备在事务完成最终目的地之前无法继续进行任何其他工作(如果存在依赖关系)。内存读、I/O读写、配置读写都是Non-posted。
两类设备,它们对事务排序和发布有不同的要求,简单设备、PCI桥:
i. 简单设备是指在充当总线主控时不需要将其写入数据发布到总线接口逻辑的任何设备。通常,不连接到本地 CPU 的设备被实现为简单设备。简单设备的 PCI 接口中的目标和主状态机是完全独立的。
简单设备不能post出站事务,强烈建议post站内事务
ii. 桥接设备是任何实现出站内存写事务 内部发布 internal posting 的设备。桥接器允许post 两个方向的内存写事务。以下排序规则可确保数据的正确传输,并保证当桥接器尝试清空其发布缓冲区时总线不会死锁。
-- 同一方向的PMW按顺序处理,先进先出,后面不能超过前面;
-- 对向的写事务没有顺序要求;
-- 读刷新(两个方向的posting buffer都要刷新,可用于device driver确认写入完成);
-- “作为Target完成内存写事务”不以“作为Master的非锁定事务的完成”为前提条件。
INTx作为边带信号,与其他任何事务没有顺序关系。MSI有者与内存写事务相同的顺序规则。
Combining, Merging, and Collapsing
接收(写入)数据的桥接器可能会尝试将事务(具有一个或多个数据阶段)转换为更大的事务,以优化 PCI 上的数据传输。
- Combining,连续内存写入事务(单数据阶段或突发且独立于active字节使能)组合成单个 PCI 总线事务(使用linear burst ordering)。
-- 数据组合不是必需的,但建议在发布写入数据时进行组合。
-- 隐含顺序不变的情况下才允许使用。将几个顺序出现的single/multiple数据周期的Burst组合,满足线性序突发的地址自增特性!例如:DW1、DW2、DW4,组合成4个数据周期的Burst,其中DW3的字节使能置为无效。 - Byte Merging,将一系列单独的内存写入(byte 或 word)合并为单个DWORD。
-- “32位传输DWORD字节合并”或“63位传输QWORD字节合并”不是必需的,但在发布写入数据时建议这样做。
-- 只要每个byte只写一次,就可以合并,例如:1、3、2、4合并一个DWORD;但是1、1、3、4、不可以合并,只能后三个合并,并使用字节使能。
-- 永远无法对I/O空间或内存映射 I/O 地址(不可预取)进行合并! - Collapsing,对同一位置(字节、字或 DWORD 地址)的一系列内存写入被collapsed into单个总线事务。
I/O事务、配置事务不允许Merging。
任何类型的事务(配置、内存或 I/O)的数据绝不允许Collapsing(除非下文另有说明)。
设备必须可以容忍内存写入的Combining,否则其设计不正确。
如果设备无法容忍内存写入字节Merging,则必须将自身标记为不可预取。
可预取设备必须容忍 Write Combing 和 Byte Merging 的任意组合。
当设备驱动程序指示Collapsing不会产生任何副作用时,桥接器可以选择性地允许数据在特定地址范围内Collapsing。
将连续的 DWORD 内存写入组合成 PCI 突发具有显著的性能优势。
单个 DWORD 内的字节合并可以提高性能,但不如合并那么显著。
未对齐多字节数据传输的Merging和Combing同时使用,可以减少实物数量,提升性能。
3.3 总线事务 Bus Transaction
读事务 Read Transaction

- FRAME#有效开始一个burs,一个transaction;
- 紧接着addr phase,AD地址,C/BE总线命令(bus command);
- 再接着data phase,可能有多个cycle,包括wait cycle和data transfer;
3.1 C/BE包含字节使能,保持其output buffer在整个data phase使能,避免长时间floating;BE有效无关IRDY;
3.2 读事务的第一个data phase需要一个周转周期(turnaround cycle),由target驱动TRDY执行;
3.3 当DEVSEL有效(target地址译码完成并驱动) 后,驱动AD给数据。之后再transaction结束之前保持AD output buffer使能,避免长时间floating;
3.4 master和targetr可以通过I/TRDY插入wait cycle;I/TRDY同时有效时完成一个transfer;
3.5 master在最后一个data时,FRAME#处于无效状态(前一cycle上升沿之后改变);FRAME#必须在IRDY#有效时才能deassert(见T7、T8);
写事务 Write Transaction

- addr phase后不需要turnaround cycle;
- master可以延迟AD,但不允许延迟C/BE(见T4、T5、T6);
事务终止 Transaction Termination
Master发起终止
- 正常完成
- 超时终止,要求GNT deassert才能超时终止,否则超时也不能终止!在MWI事务中,即使满足超时终止,也要等到transaction到达cacheline的边界才能终止!
- 无target应答时的 master-abort。三种响应类型的target(fast 1cycle,medium 2cycle,slow 3cycle),addr后超过3cycle,第4cycle还没有DEVSEL# assert,即认为无响应(可能是incapable access或bad address),之后要执行终止;如果第4周期有响应则进行transaction;
- 超时终止时,也要满足事务结束条件(IRDY#低并拉高FRAME#),IRDY可以延迟,但不能超过2/3个时钟;
- Host/P2P桥处理数据的方式:master写数据丢掉,master读数据返回全1;
FRAME#、IRDY# 的关系约束
- 事务结束条件(IRDY#低并拉高FRAME#)至少保持一个周期;
- 有一个assert表示总线 Busy,都deassert表示总线 Idle;
- FRAME# deassert后,只能等下一transaction才能再次assert;
- Question 除非 IRDY# 被置为有效,否则 FRAME# 不能被置为无效。(IRDY# 必须始终在 FRAME# 被置为无效的第一个时钟沿上置为有效。)如图T6是否可以IRDY deassert,T6-T7之间assert?
- Answer 确实可以,见下文“Disconnect-2”图示 T6-T7!

- IRDY# assert后,这俩信号只能等transfer结束才能改变;
- 最后一个transfer结束必须要及时deassert IRDY#。
Target发起终止
- 用STOP#信号发起终止;
- Retry,没有数据传输时发起;turnaround期间不能动STOP#(不能发起Retry);初始延迟不满足、被锁、内部资源冲突等;
- Disconnect,数据传输时或数据传输后发起;突发跨越了资源边界、资源冲突;在数据阶段,同时拉低TRDY#和STOP#,表示接受当前数据拒绝更多;TRDY#高时拉低STOP#,表示拒绝之后的数据;burst或者single data都可以disconnect;
- Target-Abort,异常终止,对于fatal error 或者 不可能完成的事务(访问保护区域),不希望master再次请求;任何时候发起,同时拉高DEVSEL#并拉低STOP#;
Target终止的信号规则
- 一个数据阶段能够完成,其一:IRDY# asserted,其二:TRDY#或STOP# asserted;
- FRAME# IRDY#均有效时,至少可以完成2个数据阶段!
- 数据传输只取决于xRDY#均有效,无论STOP#;
- STOP#一旦assert,保持直到FRAME# deassert(直到事务结束),并随后deassert;可以被延迟!
- 最后事务结束条件:FRAME# deassert、IRDY# assert、TRDY#或STOP# assert!
- 如果TRDY#、STOP#同时有效,则数据传输结束后TRDY#正常失效,STOP#有效至事务结束;
- TRDY#或STOP#一旦assert,就要完成当前数据阶段,不可改变DEVSEL#、TRDY#、STOP#;
- TRDY# 有效时才可以传输数据;
- 此时4种情况,TRDY# 有效正常传输;TRDY#、STOP# 均有效传完结束;TRDY# 无效、STOP# 有效无数据传输结束;STOP# 有效、DEVSEL# 无效以Target-Abort结束;
- STOP# 之后,Master应尽快发起事务结束条件(FRAME#无效、IRDY#有效);
- 结束条件最好在1-3时钟周期内发起;
- Master可以继续normal IRDY#行为;但当TRDY# deassert时,要立即assert IRDY#,即使没有准备好结束数据传输;
- MWI 事务,在这种情况下将不被允许再发起,此时需要改用 MW 命令继续完成cacheline的剩余部分!
- 最后一个数据阶段结束后要deassert TRDY#、STOP#、DEVSEL#,之后信号处于tri-state,结束一个事务,保证总线上的其他事务可用;
重试周期 Retry

- 在初始数据阶段发起Retry,没有TRDY#,没有数据传输。
- 整个事务包含两个data phase。
带数据断连 Disconnect With Data

- A:Target带着最后一个数据发起Disconnect;Master可以插入Delay;STOP# 保持有效直到(检测到)FRAME# 失效;
- B:最后一个数据阶段没有数据传输;
Master Completion Termination, Target blindly asserts STOP#

- 单数据阶段的事务;
- Target blindly asserts STOP#;
- 初始数据阶段即是最后数据阶段;
无数据断连1 Disconnect-1 Without Data Termination

- 同一时刻 STOP# 有效、TRDY# 无效;
- 其缓冲区已满 或 突发超出资源边界;
- 4个数据阶段,前两个有数据,后两个没有数据;
无数据断连2 Disconnect-2 Without Data Termination

- 区别Disconnect-1,⚠️T6-T7 IRDY# 和 FRAME# 的状态变化!解答前面的问题。
Target-Abort

- Target终止事务,且不希望Master重发事务。
- 发起Target-Abort之前,DEVSEL#必须已经有效了 一个或多个周期;
- DEVSEL# 失效、STOP# 有效的时候,必须要TRDY# 处于无效!
对Master的要求
能够处理所有形式的target termination;
在重新发起事务之前deassert REQ#,至少两个时钟,一个用于STOP#断言进入Idle状态,另一个Idle之后的时钟;
single/multiple source master activity都需要deassert REQ#(单功能设备有两个子功能,生产/消耗数据;多功能设备;可以上下游数据转发的P2P桥);
但数据阶段的target termination不需要deassert REQ#;
Retry终止的事务要求 master 无条件重新发起事务,直到完成为止!Disconnect不要求重发;
不需要立即,可以在deassert REQ#两时钟周期后请求总线重发;
可以继续发其他总线事务,但是完成顺序要在本事务之后;(否则可能造成temporary deadlocks?)
若有target属性,则其target功能响应要不受影响;
一个多功能设备举例:Func1请求A事务被Retry,则释放REQ#,若Func2有需要且GNT#有效,则Func2执行事务,结束释放REQ#,Func3也可进行事务,其他Func事务结束释放REQ# 两周期后,Func1重新请求总线并重复发起请求A事务。
事务的重复不能由任何其他事件或条件控制!
-- Func之间各自的repeat互不影响;
-- 后续其他事务的SERR#、PERR#、Retry、Disconnect、Target-Abort、Master-Abort都不能影响repeat;
-- 尽快重发,最好在33时钟周期内;
-- 除非系统RST#,驱动复位并重新初始化组件,或者Master被软件禁用等;
-- 重发事务成功完成一个数据阶段就可以结束这个事务(而不必继续后面的数据阶段)。
延迟事务 Delayed Transaction
无法在按要求完成初始数据阶段的Targets,将使用延迟事务。
两种设备:IO控制器、桥尤其是P2P桥。
基本操作
所有必须在目标总线上完成之后才能在发起总线上完成的总线命令都可以作为延迟事务完成,包括:IO读写、配置读写、内存读x3;
- Master Request
Master发起的请求被Target使用Retry终止,Target锁存当前的请求信息作为一个Delayed Request,Master将在后续重发请求。 - Target Complete
Target独立完成Delayed Request,产生并保存一个Delayed Completion,直到收到Master重发的请求。 - Master Complete
Master re-arbitrates总线、re-issues请求,Target 给出 Completion 状态(和数据),事务完成。
延迟事务需要的信息 Information
Target保存的信息包括:addr、cmd、byte enables、addr&data parity、REQ64#;
写事务:be有效对应的数据必须保存,无效数据可选保存;桥需要保存LOCK#;
读事务:注意data在IRDY# 有效时有效,BE整个数据阶段都有效;
Target执行事务信息的比较,相同事务发Retry终止,或者回Delayed Completion响应;
在读事务中,如果满足 读取所有数据 且 没有读副作用(可预取的???),可以不比较BE;
Master重发事务必须严格一致,包括BE无效的数据也要一致;
可能两个Master发相同的事务,Target不区分源自哪个,只当是同一个事务;
延迟事务的丢弃 Discard
Master一旦尝试放松请求,就必须继续重复该请求,直到完成,不能丢弃;
Target两种情况可以丢弃:
- 延迟请求是读可预取区域,或者是MRL、MRM事务;
- 任何延迟请求的Discard Timer超时(215 cycles,否则可能导致死锁);
Target丢掉不可预取区域的数据可能导致数据完整性被破坏(data may be destroyed);
超时丢弃可能会报告错误:
- 数据可预取的,建议不报告,系统完整性不受影响;
- 数据不可预取,系统完整性会受影响,建议向驱动程序报告错误;
内存写和延迟事务
Target完成延迟事务的同时需要处理内存写事务;其不可以等延迟事务在原始总线上完成之后再接受内存写数据,否则可能会发生死锁(?延迟时候不能接受写,则桥转发来的写被阻塞而死锁?);
Master A/B 共同访问Target,A先读被延迟事务,此时B写后虚拟读(dummy read)确保写入成功,B实际收到延迟响应的旧数据(对于可预取区域,即使BE、rd cmd不同,桥也可能混淆读事务);一般不会配置共享,A只读需要的数据而不预取数据?B虚读两次;
为避免数据不一致的情况,使用重试终止内存读取事务后,主设备不允许将内存读取事务延长到超出其原始预期限制;
处理多个延迟事务(详细描述参考 附录E)
一般是P2P桥,为了提升系统性能、满足初始延迟要求。
处理多个事务的基本要求:保证事务顺序!
几种总线事务:
- PMW,Posted Memory Write,只能是存储器写MW、存储器写失效MWI,且只能使用PMW!
- DRR,Delayed Read Request,延迟读请求,IO、CFG、MEM x3,可丢弃;
- DWR,Delayed Write Request,延迟写请求,IO、CFG,可丢弃;
- DRC,Delayed Read Completion,延迟读完成,包含data、status(normal、Master-Abbort、Target-Abort、parity error等);
- DWC,Delayed Write Completion,延迟写完成,只包含status;
同时进行的延迟事务的数量由实现定义(implement define);
Column表示桥接器先前接受的访问,Row表示在列所代表的访问之后接受的事务
| Row pass Col.? | PMW (Col 2) | DDR (Col 3) | DWR (Col 4) | DRC (Col 5) | DWC (Col 6) |
|---|---|---|---|---|---|
| PMW (Row 1) | No1 | Yes5 | Yes5 | Yes7 | Yes7 |
| DDR (Row 2) | No2 | Yes/No | Yes/No | Yes/No | Yes/No |
| DWR (Row 3) | No3 | Yes/No | Yes/No | Yes/No | Yes/No |
| DRC (Row 4) | No4 | Yes6 | Yes6 | Yes/No | Yes/No |
| DWC (Row 5) | Yes/No | Yes6 | Yes6 | Yes/No | Yes/No |
- No 表示不允许后续事务超越前面事务。见附录E生产者消费者模型,此序可防止PMW数据被其他访问传送;
- Yes 表示后续事务需要超越前面事务提前完成:
-- Row1 的4个YES表示 PMW 必须在先前同方向的DxR、DxC之前完成,否则可能会发生死锁。
-- 其余4个YES表示 DxC必须在先前同方向的DxR之前完成,防止两个桥互相访问发生死锁。 - YES/NO 没有排序要求或不会发生死锁。
延迟事务的顺序,在发起总线上完成的时候确定。
允许DxR-DxR、DxR-DxC、DxC-DxC之间的重排序,不允许与内存写事务之间进行重排序!
Master可以发起多个Request,但要保证事务重发的公平性。如果有顺序要求,只能等前一个完成再发起下一个。
3.4 Arbitration
为了最大限度地减少访问延迟,PCI 仲裁方法是基于访问的,而不是基于时隙的。
PCI 使用中央仲裁方案,每个Master都有一个唯一的请求 (REQ#) 和授权 (GNT#) 信号。
仲裁是“隐藏的”,发生在前一次访问期间,不会消耗 PCI 总线周期,除非总线处于Idle状态。
仲裁算法由系统设计人员选择实现,允许仲裁器灵活地确定请求的优先级和权重。
仲裁器需要实现公平算法以避免死锁,必须授予每个潜在Master访问总线的权限,而不受其他请求的影响。
仲裁信号协议
Agent通过声明其 REQ# 来请求总线(代理绝不能使用 REQ# 将自己“park”在总线上)。仲裁器声明Agent的 GNT# 表示允许请求。
仲裁器可以在任何时钟上取消 Agent 的 GNT#。Agent必须确保 GNT# 在启动事务的时钟上升沿有效。当 Master 的 GNT# 有效且总线处于 Idle 状态时,可以启动事务而无论 REQ#。如果 GNT# 失效,事务不得继续。
GNT# 可以根据以下规则被取消断言:
- GNT# 失效的同时 FRAME# 有效,则总线事务有效并继续。
- 如果总线处于 Idle 状态,则两个 GNT# 之间失效和有效的交替需要one clock delay,否则 AD 和 PAR 信号线上可能会发生争用。
- FRAME# 无效时,GNT# 可以随时被置为无效。

- T3-T4 GNT#-a 和 FRAME#、T6-T7 GNT#-b 和 FRAME#
- T5-T6 REQ#-b 和 FRAME#
- T3、T4、T5、T6 FRAME#
Agent只进行一个事务,则应该在 FRAME# 有效的同时将 REQ# 失效。
如果事务被Target终止,则 REQ# 应该保持无效至少两个周期!
如果REQ#、GNT#均有效,处于Idle状态超过16周期没有事务发生,仲裁器认为Master is "broken",忽略其 REQ# 并向系统报告。
如果总线处于Idle状态,Master在 GNT# 有效时没有置位 FRAME#,则可能会失去使用总线的机会。建议尽快置位 FRAME#。
快速连续事务 Fast Back-to-Back Transaction
避免TRDY#、DEVSEL#、STOP#、PERR# 信号线竞争!
- 类型I,访问相同agent,master负责避免竞争(基于master的机制);可以去掉事务之间的Idle;连续事务开始前一个事务是写事务;master要知道地址边界;对于master可选,但target必须可以解码,识别没有Idle的连续FRAME#;
- 类型II,访问不同agent,作为潜在访问对象的target负责避免竞争(基于target的机制);满足下述要求时target的 Status Reg 的 Fast Back-to-Back Capable位置1:
-- 必须能够追踪总线状态,能够跟随总线状态从上个事务的最后一个data transfer到下个事务的addr phase的直接转变,无论是否在这两个事务中被选做target(能够区分所有 PCI 事务的完成,并能够检测所有地址阶段);
-- 必须避免上述信号的竞争。非“最快置位DEVSEL#”的情况自然符合要求;执行零等待译码的需要延迟一个周期置位上述信号,除了非连续事务、相同target的连续事务; - Command Reg中的Fast Back-to-Back Capable位,可选,只在作为Master时有效;为1表示发起快速事务不需要考虑寻址哪个目标,只要前面是个发起的写事务(基于target的机制);为0表示发起快速事务必须寻址相同targe(基于master的机制);这个位由系统配置,在所有targets的这个位置位时将其置位(表示基于target机制可用);
- 快速事务期间GNT#要assert,否则要结束事务

仲裁停靠 Arbitration Parking
- 可选park(fixed,last used等),不park(arbitrator itself);
- GNT# assert 且在Idle状态,Agent必须在8 cycles内使能AD[31:0]、CBE、PAR(1 cycle later),建议2-3 cycles;
- Parked Agent不需要在1个时钟内使能全部buffer,为了安全Park!没有人选就Arbitrator自己的central resource device驱动总线;
- Parked Agent,可以在没有REQ#情况下发起一个事务(Idle state & GNT# asserted),发起多个事务则需要REQ#;
3.5 Latency
Target和Master在事务中插入wait的数量受到限制。每个Master都有一个可编程定时器,用于限制在总线繁忙时的最大总线使用时间。这两个限制和总线仲裁顺序一起,可以相对准确地预测任何 PCI 总线Master在最坏情况下的总线获取延迟。
Target Latency
目标延迟是Target在有效 TRDY# 之前等待的时钟数。
1. 初始延迟 Initial latency
初始延迟是从 FRAME# 有效到 TRDY# 有效(完成初始数据阶段)或到 STOP# 有效(Retry和Target-Abort情况下)的时钟数。
取决于命令类型,PMW延迟较小,因为事务只是寄存器到寄存器的传输。I/O写、配置写、读事务的延迟比较大。
系统处于初始化时间或者运行时间(initialization-time、run-time),初始化时间从 RST# 复位后的 225 个 PCI 时钟,之后是运行时间。
在run-time访问Target,则必须在 FRAME# 有效后的16个时钟内完成读/写事务的初始数据阶段(TRDY# 完成,或者 STOP# 终止)。
当访问命中缓存中的已修改行(Modified line)时,主桥 Host Bridge 额外增加16个时钟来完成初始数据阶段,但是任何初始数据阶段都不能超过32个时钟!
一般在设计之初就已经知道设备的延迟时间,如果超过限制时间,应设计为尽快 STOP# 重试。无法确定延迟的情况下,使用计数器限制延迟时间。三种情况:i. 总能在16时钟内传输数据;ii. 通常可以,特殊情况超时,针对特殊情况应在16时钟内Retry;iii. 经常超时,要求设备使用延迟事务,例如I/O控制器、PCI桥等设备。
2. 后续数据阶段延迟 Subsequence latency
后续延迟是在突发传输中,从一个数据阶段的 IRDY# 和 TRDY# 置位到下一个数据阶段的 TRDY# 或 STOP# 置位的时钟数。
一般是8个时钟,这要求 Target 在后续延迟要求内完成数据阶段,可选:传输数据(TRDY# 有效)、Disconnect without data(STOP#有效、TRDY# 无效)或Target-Abort(STOP# 有效,DEVSEL# 无效)。
提前知道后续延迟的设备,需要在数据阶段N之后使用 TRDY# 和 STOP# 信号线结束事务。如果不能提前知道延迟,则需要使用超时计数器控制延迟。
Master Data Latency
Master 有效 IRDY# 以表明它已准备好传输数据所需的时钟数。8个时钟,包括初始数据阶段和后续数据阶段。
初始数据阶段,不应该有延迟。写事务,在请求总线之前准备好数据。读事务,缓冲区有空间接收时才能发起事务。
内存写最大完成时间限制 Memory Write Maximum Completion Time Limit
Arbitration Latency
仲裁延迟是从 Master 断言其 REQ# 到总线进入 Idle 状态并断言 Master 的 GNT# 的时钟数。