First/Last DW Byte使能规则
Byte Enables包含在Memory、I/O 和Configuration Requests中。
字节使能,当出现在请求报头中时,位于报头的字节7。对于设置TH位的内存读请求,字节启用字段被重新用于承载ST[7:0]字段,并且字节启用的值隐含如下定义。当可以接受完成这些请求时,TH位必须只在内存读请求中设置,就好像请求数据的所有字节都已启用。
•对于设置TH位的内存读请求,以下值隐含在Byte enable中。
◦如果此请求的Length字段表示长度为1 DW,则First DW Byte enable的值暗示为1111b, Last DW Byte enable的值暗示为0000b。
◦如果此请求的Length字段表示长度大于1 DW,则First DW Byte enable和Last DW Byte enable的值暗示为1111b。
•First DW BE[3:0]字段包含Byte为请求引用的第一个(或唯一)DW启用。
◦如果Request的Length字段显示的长度大于1dw,该字段不能等于0000b。
•Last DW BE[3:0]字段包含Byte enable,表示请求的最后DW。
◦如果Request的Length字段表示长度为1dw,则该字段必须等于0000b。
◦如果Request的Length字段显示的长度大于1dw,该字段不能等于0000b。
•对于Byte enable字段的每一位:
◦值为0b表示对应的数据字节不能被写入,如果不可预取,则不能在Completer上读取。
◦值为1b,则必须在Completer上写入或读取相应字节的数据。
•对于所有长度为1dw的请求,允许在First DW BE字段中启用非连续字节(已启用的字节由未启用的字节分隔)。
◦非连续字节启用示例:1010b, 0101b, 1001b, 1011b, 1101b
•对于长度为2dw (1qw)的Quad Word (QW)对齐内存请求,在Byte Enable字段中允许非连续字节启用。
•所有长度为2dw (1qw)的非QW对齐内存请求和长度为3dw或以上的内存请求必须只启用与请求的第一个DW和最后一个DW之间的数据连续的字节。
◦连续字节启用示例:
First DW BE:1100b,Last DW BE:0011b
First DW BE:1000b,Last DW BE:0111b
表中相当于前4bit对应数据的前四个字节,后4bit对应数据的最后四个字节。
假设引用的数据长度为N字节(字节0到字节N-1)。注意,仅当数据长度大于一个DW时才使用last DW Byte enable。
•如果1 DW的Read Request指定不允许读取字节(First DW be [3:0] field = 0000b),则相应的Completion必须指定长度为1 DW,并且包含1 DW的数据负载。Completion报文中数据负载的内容未指定,可以是任何值。
•对于违反本节中指定的Byte enable规则的TLP,未定义Receiver/Completer行为。
•接收方可以选择检查是否违反Byte enable规则。如果执行这种检查的接收器确定TLP违反了一条或多条Byte enable规则,则该TLP是畸形TLP。这些检查是独立可选的。
◦如果Byte enable规则被检查,违规是与接收端口相关的报告错误
Last DATA BE与First DATA BE的使用规则
1、 传输的数据长度小于1个DW,则仅使用First DATA BE,Last Data BE为全0。First Data BE内允许有不连续的0、1位,PCIe总线允许发送一个DW的第1、3字节或者0,2字节。
2、 传输的数据长度在2DW内时,允许有不连续的0、1位。
3、 传输的数据长度大于等于3DW时,First Data BE和Last Data BE不允许有不连续的0、1位。
注意: “zero-length”的引入是为了实现“读刷新”操作,该操作的主要目的是为了保证之前的存储器写请求报文,到达最终的目的地,与“zero-length”对应的读完成包文中不含有任何数据负载 ,从而提高了PCIe链路的利用率。