这段文字主要讲的是 Byte Enables(字节使能)字段在 PCI Express 中的规则,特别是在内存请求(Memory Requests)中如何使用。Byte Enables 是用于指示请求中的哪些字节是有效的,也就是哪些字节应该被读或写。以下是本部分的主要内容:
1. Byte Enables 位置和作用
• Byte Enables 字段在请求头的 第7字节(Byte 7) 中,具体位于字节的不同位置,用来标记哪些字节需要被写入或读取。
• Byte Enables 的每一位都代表一个字节的使能情况,1b 表示启用这个字节,0b 表示禁用这个字节。
2. Memory Read 请求与 TH 位
• TH 位(Transaction Header Bit):这是请求头中的一个标志位,如果该位被设置(TH = 1),表示可以将内存读取请求视为“所有字节都启用”来完成。
○ 这种情况下,对于 1 DW(双字)的内存读取请求,First DW Byte Enables 设置为 1111b(表示前四个字节都有效),而 Last DW Byte Enables 设置为 0000b(表示后面的字节无效)。
○ 对于超过 1 DW 长度的内存读取请求,First DW Byte Enables 和 Last DW Byte Enables 都会被设置为 1111b,表示所有字节都有效。
3. 字节使能的规则
• First DW Byte Enables 和 Last DW Byte Enables 字段用于标记请求中的第一个和最后一个 双字(DW) 中哪些字节被启用。DW 是 4 字节的单位,内存请求长度通常以 DW 为单位。
○ 如果请求长度为 1 DW(4 字节),则 Last DW Byte Enables 应该为 0000b,表示没有字节被启用。
○ 如果请求长度超过 1 DW,First DW Byte Enables 和 Last DW Byte Enables 不可以是 0000b,否则说明没有字节被启用。
4. 非连续字节使能
• 在一些情况下,字节使能可以是非连续的。例如,1010b 或 0101b 都是合法的非连续字节使能模式。非连续字节使能适用于:
○ 请求长度为 1 DW 时,First DW Byte Enables 可以是非连续的。
○ 对于2 DW 的请求(即 1 QW,4 字节),非连续字节使能也允许。
5. 连续字节使能
• 在其他情况下,字节使能必须是连续的。例如,1100b 或 1000b 这样的模式,表示请求的数据字节是连续的。
○ 2 DW 请求(即 1 QW)的 First DW Byte Enables 和 Last DW Byte Enables 必须是连续的。
6. 零长度写请求和读请求
• 零长度写请求:指请求 1 DW 长度的数据,但没有启用任何字节(Byte Enables 为 0000b)。这类请求通常用于某些协议中,目的是触发某些副作用,比如在 LN 协议下。
• 零长度读请求:也是请求 1 DW 数据,但没有启用任何字节。这类请求用于设备之间的“刷新”操作,确保先前发出的写操作已完成。例如,通过发送零长度读取请求来强制刷新内存写入。
7. 违反字节使能规则的情况
• 如果收到的请求违反了字节使能的规则,它就会被认为是 Malformed TLP(格式错误的 TLP)。这类请求会被标记为错误并报告给接收端端口。
• 接收方可以选择是否检查这些字节使能规则,如果检查发现违规,接收方会报告错误。
8. 总结
• Byte Enables 字段用于标记哪些字节在请求中需要操作(读或写)。
• 对于内存读取请求,TH 位决定是否所有字节都启用。
• 字节使能可以是连续的或非连续的,具体取决于请求的长度和数据对齐方式。
• 零长度读/写请求在某些协议中有特殊用途,如刷新操作或触发副作用。
• 如果请求违反字节使能规则,它会被认为是无效的,并可能报告错误。
这段文字的核心目的是解释在 PCIe 内存请求中,如何使用字节使能来指示哪些字节需要处理,以及相关的规则和特殊情况。