1.什么是byte enable
PCIe协议规定TLP中的data payload是1DW(特殊情况此处不介绍)对齐的,因此在使用addr的TLP中省略了addr[1:0],为了指示DW中的有效字节,PCIe TLP header使用First/Last DW Byte Enables表示data payload的首个/最后一个DW中的哪些byte是有效的。对应字节的byte enable为1则表示字节有效。Memory, I/O, and Configuration Requests的TLP header需要用到Byte Enable.如图2-32所示,First/Last DW Byte Enables位于TLP header的byte 7。如表2-10所示,First DW BE[0]位于TLP byte7的bit 0,表示data payload的byte 0。First DW BE[1]位于TLP byte7的bit 1,表示data payload的byte 1。Last DW BE[3]位于TLP byte7的bit 7,表示data payload的最后一个byte。2.Byte Enables rules
l如果request的length表示data长度大于1DW,则当前TLP header中的First DW BE[3:0] f字段不能等于0000bl如果request的length表示data长度等于1DW,则当前TLP header中的last DW BE[3:0] f字段必须等于0000bl如果request的length表示data长度大于1DW,则当前TLP header中的last DW BE[3:0] f字段不能等于0000bllength为1DW的请求中,允许出现非连续的First DW BE,例如1DW的请求中First DW BE[3:0]为1010b, 0101b, 1001b, 1011b, 1101b都是允许的。l在2DW对齐的memory请求中,如果请求的length为2DW,则last DW BE[3:0] 和First DW BE[3:0]均允许出现非连续。l 长度为2DW的非2DW对齐的memory Requests 和 长度大等于3DW的memory Requests ,其First DW BE[3:0] 和First DW BE[3:0] 设置必须要保证有效字节连续,例如First DW BE: 1100b, Last DW BE: 0011bFirst DW BE: 1000b, Last DW BE: 0111blzero-length Write:是length为1DW且所有字节都是无效的(即First DW BE[3:0] 和last DW BE[3:0] 均为的0000b)Write Request,除非特殊说明,否则此请求不应该对Completer造成任何影响(即不会在Completer产生写操作)。lzero-length Write常常用作flush请求。例如,为了确认之前发起的Post write已被目标设备完成,发送一个zero-length read且读地址和Post write的写地址保持一致,当收到zero-length read的completion时就能确保Post write已被目标设备完成。lzero-length Read:长度为1DW且所有字节都是无效的(即First DW BE[3:0] 和last DW BE[3:0] 均为的0000b)read Request,其对应的Completion必须指明长度为1DW,且包含长度为1DW的data payloadl如果接收到的TLP header中的First DW BE[3:0]和last DW BE[3:0]违背了本章节的规定,协议并没有规定Receiver/Completer的行为lReceiver可以选择检查Byte Enables rules,一旦进行检查且分析TLP违背了Byte Enables rules,则把TLP当做畸形TLP处理3.参考文档
PCI Express Base Specification Revision 6.2, section 2.2.5, p. 182. ================================
创芯大讲堂 芯片精品课程推荐