2.2.4.路由和寻址规则
TLP路由具备三个主要机制:地址路由、ID路由和隐式(implicit)路由。其中,隐式路由仅有消息请求使用。
2.2.4.1 基于地址的路由规则
- 地址路由主要用于内存和I/O请求。
- 定义了两种地址格式,64位格式使用了4个DW的头部,32位格式使用了3个DW的头部。(分别如figure 2-7和2-8所示)。
- 对于内存读、内存写和AtomicOp 请求,地址类型域(AT)将按照如Table2-5中进行编码。对于其他请求,AT域是保留的。
- Table2-6给出了TLP头部的地址映射。
- 内存读、内存写和AtomicOp 请求均可以使用上述两种格式
1).对于低于4GB的地址空间,请求者必须使用32位格式。如果接受者收到了一个用于请求4GB以下(即,高32位地址全为0)的地址空间的64位格式地址,那么其行为是未定义的。 - I/O读请求和I/O写请求使用的是32位格式。
- 所有代理都必须对头部中的所有地址位进行解码,不允许使用地址别名。
2.2.4.2.基于ID的路由规则
-
配置请求、ID路由消息和“完成”将使用ID路由。
-
ID路由使用总线、设备和功能编号来指定TLP的目的地:
1)Table2-7给出了非ARI的I路由ID,总线、设备和功能编号(3位)同TLP头部的映射关系
2)Table2-8给出了ARI的I路由ID,总线、设备和功能编号(3位)同TLP头部的映射关系
-
定义了两种ID路由格式,一种使用了4个DW的头部,一种使用了3个DW的头部。分别如Figure2-9/2-10所示。
2.2.5.头/尾DW字节使能规则
内存、I/O和配置请求都包含字节使能。“字节使能”处于请求头部的第7个字节(见Figure2-11)。对于设置了TH位的内存读请求,字节使能域也用于携带ST[7:0]域。TH位仅能在内存读请求中设置,使得在数据都可用时完成这些读请求。
-
对于设置了TH位的内存读请求,如下的值用于进行字节使能。
1)如果请求的Length域所指定的长度为1DW,那么头DW的字节使能的值被设置为“1111b”,尾DW的字节使能的值被设置为“0000b”。
2)如果请求的Length域所指定的长度大于1DW,那么头/尾DW字节使能的值将被设置为“1111b”。 -
头DW BE[3:0]域中包含了由一个请求使用的第一个(或唯一一个)DW的字节使能。
1)如果请求中的Length与所指定的长度大于1DW,那么这个域不能设置为0000b。 -
尾DW BE[3:0]域中包含了一个请求的最后一个DW的字节使能。
1)如果一个请求的Length域所指定的长度为1DW,那么这个域仅能设置为0000b。
2)如果一个请求的Length域所指定的长度大于1DW,那么这个域不能设置为0000b。 -
对于字节使能域中的每个位:
1)如果被设置位0b,则对应的字节不能写,或者如果不能预取,则Completer不能读该字节。
2)如果被设置为1b,则对应的字节必须写或Completer必须读该字节。 -
对于所有长度为1DW的请求,头DW的BE域的值可以设置为非连续的使能。
1)非连续字节使能示例:1010b,0101b。 -
对于QW对齐的长度为2DW(1QW)的内存请求,允许使用非连续字节使能。
-
所有长度为2DW(1QW)的非QW对其内存请求和长度为3DW或更多的内存请求,只能使能请求中的头DW和尾DW中连续的数据。
1)连续字节使能示例:
头DW BE:1100b,尾DW BE:0011b
头DW BE:1000b,尾DW BE:0111b -
Table2-9展示了字节使能域中的位和所处请求头部中的位置、对应数据的字节的关系
-
1DW长度的写请求可以不使能字节,对Completer也没有影响。
-
如果一个1DW的读请求指定所读取的数据为未使能 (头DW BE[3:0]域=0000b),则对应的Completion必须将Length设置为1DW,其中包含1DW的数据负载。
1)Completion包中数据负载的内容是未定义的,可能为任意值。 -
如果TLP没有遵守字节使能规则,那么接受者/完成者的行为将是未定义的。
-
接受者可能会根据配置,检查是否有违反字节使能规则。如果接受者实现了这类检查,那么如果一个TLP违反了字节使能规则,那么这个TLP就是一个存在错误的TLP。
1)如果检查了字节使能的规则,那么当违反规则时,将报告与接收端口所对应的错误。
零长度读取
设备将使用没有字节使能的1DW内存读取请求(或“零长度读取”),作为一种清空请求。对于一个请求者,清空原语允许一个设备可以确保之前的Posted writes操作已经在PCIE目的地完成了。为了满足所有情况,零长度读取的地址必须和用于清空的Posted Writess指向同一个设备。建议使用Posted writes清空时使用的同一个地址。
清空原语具有广泛的应用,所有Completer都必须实现同这个原语相关的功能。因为Requester可能在不了解Completer特点的情况下使用清空原语,Completer必须保证零长度读取没有副作用。对于规则“在一个非预取空间,Completer不能读取未使能的字节”,这是一种具体的情况。需要注意的是,在进行零长度读取时,清空仅用于相同的Traffic Class流。
2.2.6. 事务描述符
待续