[PCIE5.0] 2.2.6 Transaction Descriptor

142 阅读5分钟

这段文字详细描述了Byte Enables(字节使能)在内存、I/O 和配置请求中的使用规则,特别是在TLP头部中的字节使能字段的作用和具体行为。字节使能用于控制哪些字节的数据在读写操作中被实际处理,确保只有需要的字节被操作。以下是本章的主要内容:

1. 字节使能的作用

字节使能(Byte Enables)用于告诉接收方在内存请求中,哪些字节应该被读取或写入。这些字节使能位于TLP头部的字节7的位置。具体来说,字节使能是一个4位或8位的字段,每个位代表一个字节。例如,对于一个4字节的数据请求,4位字节使能(BE)告诉接收方哪些字节是有效的,哪些应该忽略。

2. 内存读请求中的特殊规则

在内存读请求中,如果TH(TLP头部的特定标志位)被设置,则字节使能字段被重新定义为ST[7:0]字段(这在其他章节详细解释)。这意味着,在某些情况下,字节使能并不直接表示哪些字节被使能,而是由系统根据特定规则来推断字节使能。

• 当TH位被设置时,内存读请求的字节使能有特定的默认值: 
	○ 如果请求的长度是1个DW(双字,4字节),则第一个DW字节使能为 1111b(所有字节使能),最后一个DW字节使能为 0000b(没有字节使能)。
	○ 如果请求的长度大于1 DW,则第一个和最后一个DW字节使能都默认为 1111b(所有字节都被使能)。

3. 字节使能字段的具体作用

每个字节使能字段包含4个位,每个位控制相应字节的读/写操作:

• 字节使能值为1:表示该字节会被读取或写入。
• 字节使能值为0:表示该字节不会被读取或写入,如果是非预取空间(Non-Prefetchable Space),还表示该字节不能在接收方处读取

4. 字节使能的非连续性

在某些情况下,可以使用非连续的字节使能:

	• 1 DW请求(长度为4字节的请求)允许字节使能位为非连续。例如:1010b、0101b、1101b等。
	• 对于1 QW请求(2个DW的请求,即8字节),也允许非连续字节使能。
然而,对于非QW对齐的2 DW请求(即长度为8字节,但不是整齐对齐的请求),字节使能必须是连续的。例如:
	• 第一个DW的字节使能:1100b,最后一个DW的字节使能:0011b。

5. 字节使能字段与数据字节的对应关系

TLP头部中的字节使能字段直接控制请求中数据字节的位置:

	• 第一个DW的字节使能(First DW BE):控制第一个DW(4字节)中每个字节的使能状态。
	• 最后一个DW的字节使能(Last DW BE):控制最后一个DW的每个字节的使能状态。
例如:
	• 字节使能 First DW BE[0] 控制第一个字节(Byte 0),First DW BE[1] 控制第二个字节(Byte 1)……依此类推。

6. 特殊的“零长度”请求

• 零长度写请求(Zero-Length Write):有时,写请求的长度为1个DW,但没有任何字节被使能(字节使能为 0000b)。这种情况不会对接收方产生实际数据写入作用,但可能用于触发某些特定的副作用(比如特定协议的操作)。
• 零长度读请求(Zero-Length Read):长度为1个DW但没有字节被使能的读请求也可能被用作刷新请求(flush)。这通常用于确保之前发出的写操作已完成,尤其是在同一设备之间的操作。零长度读请求不会产生实际的读操作,只是触发了内部的同步机制。

7. 字节使能违规

• 字节使能规则违规:如果一个TLP违反了字节使能的规则(例如,字节使能设置不正确,导致不应被读取或写入的字节被操作),接收方可以选择检查并报告这种违规行为。违规的TLP会被认为是“格式错误的TLP”,并可能导致错误报告。

8. 完整的字节使能规则总结

1 DW请求:允许非连续字节使能(如 1010b)。
• 2 DW请求:如果是QW对齐请求,允许非连续字节使能;否则,字节使能必须是连续的。
• 长度大于2 DW的请求:字节使能必须是连续的,不能分散在不同的位置。
• TH位被设置时:字节使能字段会被特殊处理,推断出相应的字节使能。

总结:

这段文字描述了如何在内存请求、I/O请求和配置请求中使用字节使能来控制数据读写的字节。字节使能通过TLP头部的字节7位置表示,确保只有需要的字节会被实际读取或写入,避免不必要的数据操作。特殊情况下,如零长度请求,字节使能可以用于实现一些同步或副作用操作。