First/Last DW Byte Enables规则
Byte Enables包含在Memory、I/O 和Configuration Requests中。本节定义了相应的规则。Byte Enables出现在Request header中时,位于header的字节 7(见图1)。对于设置了 TH 位的Memory Read Requests,Byte Enables字段被重新用于承载 ST[7:0] 字段,Byte Enables的值隐含如下定义。当它可以完成这些Requests时,TH 位必须只在Memory Read Requests中设置,就好像请求数据的所有字节都已启用一样。
- 对于设置了 TH 位的Memory Read Requests,Byte Enables隐含以下值。
- 如果该请求的Length字段指示 1 个 DW长度,则 First DW Byte Enables 的值暗示为 1111b,Last DW
Byte Enables 的值暗示为 0000b。 - 如果该请求的长度字段指示大于 1 个 DW长度,则第一个 DW 字节启用和最后一个 DW Byte Enables的值暗示为 1111b。
- 如果该请求的Length字段指示 1 个 DW长度,则 First DW Byte Enables 的值暗示为 1111b,Last DW
设置 TH 位和目标Non-Prefetchable Memory Space的Memory Read Requests应在可以保证完成此类读取不会产生不良副作用的情况下发出。
- First DW BE[3:0] 字段包含请求引用的第一个(或唯一)DW 的Byte Enables。如果请求的Length字段大于 1 DW,则该字段不得等于 0000b。
- Last DW BE[3:0] 字段包含请求的最后一个 DW 的Byte Enables。
- 如果请求的Length字段 1 个 DW,则该字段等于 0000b。
- 如果请求的Length字段大于 1 DW,则该字段不等于 0000b。
- 对于Byte Enables字段的每一位:
- 0b 表示不得写入相应的数据字节,或者如果不可预取,则不得在Completer上读取。
- 1b 表示必须在Completer上写入或读取相应的数据字节。
- 对于长度为 1 DW 的所有Requests,在第一个 DW BE 字段中允许非连续Byte Enables(enabled字节由non-enabled字节分隔)。
- 非连续Byte Enables示例:1010b、0101b、1001b、1011b、1101b
- 在长度为2 DW的Quad Word (QW) 对齐Memory Requests的两个Byte Enables字段中都允许非连续Byte
Enables - 长度为 2 DW (1 QW) 的所有非 QW 对齐的Memory Requests和长度为 3 DW 或更多的Memory
Requests必须仅enable与请求的第一个和最后一个 DW 之间的数据连续字节。- 连续Byte Enables示例:
First DW BE:1100b,Last DW BE:0011b
First DW BE:1000b,Last DW BE:0111b
- 连续Byte Enables示例:
- 表1显示了 Byte Enables 字段bit、它们在Request header中的位置以及引用数据的相应字节之间的对应关系。
Byte Enables | Header Location | 影响的数据字节 |
---|---|---|
First DW BE[0] | Bit 0 of Byte 7 | Byte 0 |
First DW BE[1] | Bit 1 of Byte 7 | Byte 1 |
First DW BE[2] | Bit 2 of Byte 7 | Byte 2 |
First DW BE[3] | Bit 3 of Byte 7 | Byte 3 |
Last DW BE[4] | Bit 4 of Byte 7 | Byte N-4, 假设引用的数据长度为 N 个字节 |
Last DW BE[5] | Bit 5 of Byte 7 | Byte N-3 |
Last DW BE[6] | Bit 6 of Byte 7 | Byte N-2 |
Last DW BE[7] | Bit 7 of Byte 7 | Byte N-1 |
-
允许一个长度为 1 DW 且没有bytes enabled的Write Request,除非另有规定,否则在Completer上没有影响。
没有byte enabled的 1 DW Memory Write Request或“零长度写入”可被某些协议下的设备使用,以实现预期的副作用,如LN 协议。
没有enable byte的 1 DW Memory Read Request,或“零长度读取”,可以被设备用作flush Request的一种类型。 对于Requester,flush允许设备确保之前发出的 Posted Writes 已在其 PCIe目的地完成。 为了在所有情况下都有效,零长度读取的地址必须与正在flush的Posted Writes针对相同的设备。推荐的方法是使用与正在flush的 Posted Writes 之一相同的地址。 -
如果 1 DW 的Read Request指定没有enable byte的读取(第一个DW BE[3:0]=0000b),则相应的Completion 必须指定1个 DW 的长度,并包含1个DW的data payload,但未指定Completion packet中data payload的内容,它可以是任何值。
-
对于违反本文中指定的Byte Enables规则的 TLP,Receiver/Completer行为未定义。
-
Receiver可以选择检查是否违反了本节中指定的Byte Enables规则。这些检查都是独立可选,如果执行此类检查的Receiver确定 TLP 违反了一个或多个Byte Enables规则,则该 TLP 是Malformed TLP。
- 如果检查了Byte Enables规则,会报告与Receiving Port相关的违规错误。
-
flush语义具有广泛的应用,所有Completers都必须实现与此语义相关的功能。 由于Requester可能在不理解Completers特征的情况下使用flush语义,Completers必须确保零长度读取没有副作用。 这实际上只是规则的一个特定情况,即在不可预取空间中,不得在 Completer 处读取non-enabled bytes。 注意的是,flush仅适用与零长度读取相同的Traffic Class中的Traffic。