核的请求器完成接口可将从链路接收到的数据作为 AXI4-Stream 数据包发送到用户应用。每个数据包均以 1 个描述符开头,在描述符后可包含有效载荷数据。描述符长度始终为 12 字节,并在完成包的前 12 字节内发送。当完成数据被拆分为多个拆分完成包后,核会将每个拆分完成包作为含专有描述符的独立 AXI4-Stream 数据包进行发送。
下图演示了请求器完成描述符的格式。下表描述了请求器完成描述符的每个字段。
图 1. 请求器完成描述符格式
位索引 | 字段名称 | 描述 |
---|---|---|
11:0 | “Lower Address”(低位地址) |
该字段可提供请求引用的第 1 个字节的 12 个最低有效位。核从其“Split Completion Table”(拆分完成包表)返回该地址,在该表中存储有请求器侧的所有暂挂非转发请求的地址和其它参数。 当完成包交付错误时,应仅将该地址的位 [6:0] 视为有效。 该地址为字节级别地址。 对于 ATS 转换请求,该字段为保留字段,暗示其值应为 0。 |
15:12 | 错误代码 |
完成包错误代码。这 3 位代码表示核对接收到的完成包所执行的错误检查检测到存在错误状况。其编码为:
|
28:16 | “Byte Count”(字节计数) | 这 13 个位可包含范围在 0 - 4,096 个字节内的值。如果存储器读取请求已通过使用单一完成包完成,那么“Byte Count”值将以字节为单位来表示“Payload”(有效载荷)大小。针对 I/O 读取完成包和 I/O 写入完成包,该字段必须设置为 4。针对长度为 0 的存储器读取发送完成包时,字节计数必须设置为 1,并且在描述符之后必须附加含单 Dword 的虚拟有效载荷。 对于每个“Memory Read Completion”(存储器读取完成),“Byte Count”字段必须表明完成请求所需的剩余字节数,包括随完成包返回的字节数。 如果存储器读取请求已使用多个完成包完成,那么后续每个完成包的字节计数值均表示为前一个完成包减去随前一个完成包返回的字节数。 |
29 | “Locked Read Completion”(锁定读取完成) | 当“Locked Read”(锁定读取)请求的响应中包含“Completion”(完成包)时,该位设置为 1。针对所有其它完成包,该位均设置为 0。 |
30 | “Request Completed”(请求完成) | 核在请求的最后一个完成包的描述符中断言该位有效。断言该位有效表示请求正常终止(因为已接收到所有数据)或者异常终止(因为存在错误状况)。用户逻辑可使用该指示来清除其未完成的请求。 用户逻辑分配标签时,用户逻辑应在接收到来自核的完成描述符并且其中包含匹配的标签字段且“Request Completed”位已设置为 1 之后,才能将标签重新分配到请求。 |
42:32 | “Dword Count”(Dword 计数) | 这 11 个位表示当前包的有效载荷大小(以 Dword 数为单位)。其范围是 0 - 1000 个 Dword。针对 I/O 读取完成包,该字段设置为 1,针对 I/O 写入完成包,该字段设置为 0。针对长度为 0 的存储器读取传输完成包时,Dword 计数同样设置为 1。在所有其它情况下,Dword 计数都对应于当前包的有效载荷中 Dword 的实际数量。 |
45:43 | “Completion Status”(完成状态) |
这些位可反映接收到的完成 TLP 的“Completion Status”(完成状态)字段的设置。有效设置包括:
|
46 | “Poisoned Completion”(毒化完成) | 设置该位可指示完成 TLP 中已设置“Poison”(毒化)位。在此情况下,应将数据包中的数据视为已损坏。 |
63:48 | “Requester ID”(请求器 ID) | 与完成包关联的 PCI 请求器 ID。 |
71:64 | “Tag”(标签) | 与完成包关联的 PCIe 标签。 |
87:72 | “Completer ID”(完成器 ID) | 在完成 TLP 中接收到的完成器 ID。(这 16 个位在传统解读模式下分割为 8 位总线编号、5 位器件编号和 3 位功能编号。而在 ARI 模式下,这 16 个位则必须作为 8 位总线编号 + 8 位功能编号来处理。)。 |
91:89 | “Transaction Class (TC)”(传输事务类) | 与完成包关联的 PCIe 传输事务类 (TC)。 |
94:92 | 属性 | 与完成包关联的 PCIe 属性。位 92 为“No Snoop”(无嗅探)位,位 93 为“Relaxed Ordering”(宽松排序)位,位 94 则为保留位。 |