从0开始学PCIE 6.3 - Transaction Layer_7 2.2.9 完成报文Completion规则2.2.9 Completion Rules 完成报文规则所有读请求、非 Posted 写请求、UIO 请求、DMWR 请求以及原子操作AtomicOp请求都必须返回完成报文。 完成报文包含完成报文头部部分类型的完成报文头部之后会携带若干个DW的数据。完成报文头部各个字段的规则在后续各小节中定义。2.2.9.1 Completion Rules for Non‑Flit Mode 非分片模式下的完成报文规则完成报文采用ID路由头部长度为3 DW。注意路由ID字段直接与对应请求报文中提供的请求者ID一一对应。因此对于完成报文这些字段统一统称为请求者ID不再使用ID路由通用场景下拆分出来的各个独立子字段。除全部TLP公共头部字段以及ID路由字段之外完成报文还包含下列附加字段见图2‑79Completer ID[15:0]完成者ID16比特标识完成报文的发送端完成者详细说明见下文。Completion Status[2:0]完成状态3比特标识该完成报文的状态见表2‑37决定 Completion Status[2:0] 字段取值的规则参见 2.3.1 节。BCM‑Byte Count Modified字节计数修改位PCI‑Express完成者禁止置位该比特该比特仅允许由PCI‑X完成者置位。Byte Count[11:0]字节计数12比特该请求剩余待处理字节数字节计数值为二进制编码0000 0000 0001b代表1字节1111 1111 1111b代表4095字节0000 0000 0000b代表4096字节。存储器读完成报文Byte Count[11:0]按照2.3.1.1节的规则赋值。原子操作完成报文Byte Count值必须等于对应原子操作操作数的字节大小。其余所有类型完成报文Byte Count必须固定等于4。Tag[9:0]标签10比特与请求者ID字段组合在一起构成事务ID。在非Flit模式下Tag字段位宽为10比特。Lower Address[6:0]低地址7比特完成报文起始字节对应的低位字节地址对于存储器读完成报文该字段的值为本完成报文所返回数据中第一个有效使能字节的字节地址规则见2.3.1.1节。原子操作完成报文Lower Address字段为保留位。其余所有类型完成报文该字段必须全部填0。接收端可以选择性地检测该规则是否被违反详细见2.3.2节第二条要点。图2‑79非Flit模式完成报文头部格式表2‑37 Completion Status Field Values 完成状态字段取值Cpl.Status[2:0]字段二进制值完成状态000Successful Completion (SC) 成功完成001Unsupported Request (UR) 不支持的请求010Request Retry Status (RRS) 请求重试状态100Completer Abort (CA) 完成者异常中止其余全部编码Reserved 保留Completer ID[15:0]是一个16比特的值在整个PCIe层级拓扑内每一个PCI‑Express功能Function拥有唯一的完成者ID见图2‑80、图2‑81。图2‑80【非ARI模式 Completer ID】16bit划分为8bit总线号Bus Number、5bit设备号Device Number、3bit功能号Function Number图2‑81【ARI模式 Completer ID】16bit划分为8bit总线号Bus Number、8bit功能号Function NumberARI模式没有设备号字段。设备功能必须捕获由本功能所完成的全部Type0配置写请求中携带的总线号、设备号并将捕获到的编号填写到本设备/功能发出完成报文的Completer ID内的总线号、设备号字段。如果某功能需要针对还未完成的设备配置写请求提前返回完成报文则总线号字段与设备号字段必须全部填0。注意总线号与设备号可以在运行时被修改因此每收到一条配置写请求都必须重新捕获该编号。对于支持ARI的设备功能仅要求捕获总线号ARI设备允许以按设备或者按功能为单位保存捕获的总线号参见2.2.6.2节。 ARI模式的Completer ID不包含设备号字段参见2.2.4.2节。例外根复合体内部各设备的总线号分配可以采用由实现自定义的方式。某些场景下多功能设备MFD可以生成UR状态的完成报文该完成报文并不关联设备内部某一个具体的功能这种情况下Function Number字段为保留位。示例一台MFD收到读请求访问资源不属于设备内任何一个功能设备返回UR状态完成报文Completer ID中的Function Number字段填全0。完成报文头部Requester ID、Tag、流量类别TC必须与对应请求报文头部中的取值完全一致。完成报文头部的属性Attribute字段默认必须与对应请求报文头部取值完全一致仅下面两种场景明确允许例外使用IDO属性时参见2.2.6.4节翻译完成报文中使用RO属性时参见10.2.3节TH比特在完成报文中属于保留位。AT[1:0]必须设置为00b接收设备不要求、也不鼓励校验该字段。如果完成报文发送设备尚未经过软件初始化配置至少没有收到一次配置写请求此时Completer ID字段没有实际含义请求者必须忽略该Completer ID返回值。如果完成报文携带数据载荷报文必须如实标明本次完成报文实际返回的数据量载荷数据量必须等于报文声明的数据量。如果实际携带的数据多于或者少于Length字段声明值则属于TLP组装错误生成的TLP为畸形TLPMalformed TLP。注释这是TLP通用规则的一个特例TLP数据载荷长度必须匹配Length字段的值。2.2.9.2 Completion Rules for Flit Mode 分片模式下的完成报文规则在Flit模式下非UIO类型完成报文的规则与非Flit模式保持一致本小节仅定义差异化规则。 在Flit模式下非UIO完成报文必须使用图2‑82给出的完成报文基础头部格式。UIO写完成报文、UIO读完成报文如果完成状态不是成功完成也就是报文不带数据必须使用图2‑83给出的头部基础格式。携带数据的UIO读完成报文必须使用图2‑84给出的UIO完成报文头部基础格式。Flit模式下Tag字段位宽为14比特。 保留类型完成报文如表2‑5所列属于ID路由TLP遵循2.2.4.2节定义。图2‑82Non‑UIO Flit模式完成报文基础头部 图2‑83UIOWrCpl与UIORdCpl完成报文基础头部格式无数据 图2‑84UIORdCplD带数据UIO读完成完成报文基础头部格式OHC‑A5扩展头部使用条件见图2‑11以下所有情况报文必须携带OHC‑A5非成功状态的完成报文非UIO完成报文且Lower Address[1:0]不等于00b关联的非Posted请求携带请求段Requester Segment该段编号和完成者捕获到的段编号不匹配此时完成报文需要携带目的段Destination Segment。报文不携带OHC‑A5时代表隐式约定完成状态默认为成功完成完成者段与目的段不需要显式携带段规则见2.2.1.2节并且对于非UIO完成报文LowerAddress[1:0]00b。当报文携带OHC‑A5时完成状态字段以及非UIO完成报文的LowerAddress[1:0]字段必须填写合法有效值。对于UIO完成报文LowerAddress[1:0]属于保留位。Completer Segment字段必须填入本功能捕获得到的段编号见2.2.6.2节如果“段捕获标记Segment Captured”为清除状态则Completer Segment字段填00h。如果关联原始请求没有携带请求段目的段字段填00hDSV标志位必须清零 如果关联原始请求携带请求段目的段字段必须等于请求段的值DSV标志位必须置1。参考“RP段例外”条目规定Root Port哪些场景不需要携带段信息。非Flit模式完成报文中存在的BCM字段Flit模式不再支持。全部UIO完成报文通用规则对于所有UIO完成报文必须分别遵守2.3.1.2节读完成边界、2.3.1.3节写完成边界定义的规则。Length[9:0]表示本完成报文所对应DW的总数量字段取值参考表2‑4。无论完成状态是什么完成者都必须返回UIO请求全部DW对应的完成报文。在计算UIO完成报文的Length字段时不得将字节使能Byte Enables纳入考量。特例零长度UIO写请求请求报文中Length00_0000_0001bFirst Byte Enable0000b逻辑上视为1个DW已经完成写入。Tag字段的值必须与对应的UIO请求报文Tag完全一致。对于同一个事务IDUIO写完成报文允许合并coalesced或者拆分split前提条件所有DW的完成计数统计必须准确见2.3.1.3节。对于同一个事务IDUIO读完成报文允许拆分前提条件所有DW的完成计数统计必须准确见2.3.1.2节。无数据UIO完成报文见图2‑83全部Lower Address比特都为保留位。携带数据的UIO完成报文见图2‑84Lower Address[11:2]必须填写合法有效值Lower Address[1:0]为保留位。CDL[1:0]字段分配给CXL协议使用非CXL场景此字段作为保留位处理。UIO请求者必须支持乱序接收UIO完成报文。同一个事务ID对应的UIO存储器请求只有当全部完成报文中Length字段累加得到的DW总数等于原始请求期望的总DW数时该事务才算完成。仅UIO存储器写才允许同一个事务ID存在多条未完成的 outstanding 请求。如果请求者要保证某事务ID下已经下发的UIO存储器写全部处理完毕请求者必须暂停下发该事务ID的新请求直到收到全部对应完成报文。当事务全部完成时同一个事务ID关联的所有请求对外表现为同一个完成状态。但是UIO请求拆分出来的单条完成报文可以携带互不相同的状态值。UIO完成报文状态合并Coalesced规则当多条UIO完成报文发生合并包括在请求者端合并合并后的最终完成状态按照下面优先级判定只要任意一条子完成报文状态是UR合并结果为UR没有UR状态只要任意一条是CA合并结果为CA没有UR、CA只要任意一条是RRS合并结果为RRS全部子报文均为SC成功合并结果为SC任何不在表2‑37定义范围内的完成状态码统一当作UR处理参见2.3.2节。UIO读请求如果完成状态不是成功完成TLP报文类型必须使用UIORdCpl。UIORdCpl报文的Length字段不受最大载荷大小Max Payload Size、最大读请求大小Max Read Request Size约束。Attr[2:0]在普通非UIO存储器请求中分别对应IDO、RO、NS在UIO完成报文中全部为保留位。EP比特对于UIOWrCpl与UIORdCpl报文属于保留位。关键要点小结便于验证/IC验证阅读Non‑Flit Completion头部固定3DWTag10bitFlit模式Tag扩到14bitFlit模式不再有BCM位。Completer ID分两种编码普通模式Bus/Dev/FnARI模式Bus/Fn无Device Number。Flit模式Completion状态、LowerAddress、Segment信息不在基础头部放在OHC‑A5扩展头部无OHC‑A5代表隐式SC成功。UIO Completion允许拆分/合并报文但DW计数必须准确多条子报文合并状态按优先级UR CA RRS SC。UIO完成报文允许乱序到达请求者只有全部DW计数收齐事务才算完成。如果你需要我可以输出纯Markdown文本直接复制粘贴到文档编辑器也可以继续翻译后续小节。