完成错误的处理 - 1.3 简体中文

UltraScale+ 器件 Integrated Block for PCI Express 产品指南 (PG213)

Document ID
PG213
Release Date
2022-11-16
Version
1.3 简体中文

当从链路接收到完成 TLP 时,核会将其与拆分完成包表 (Split Completion Table) 中未完成的请求进行比对以判定对应的请求,并将其报头中的字段与期望的值进行比对以检测是否存在任何错误状况。随后,核会发出信号,以 4 位错误代码形式将错误状况包含在完成描述符中,一并发送给用户逻辑。核还会通过在描述符中设置“Request Completed”(请求完成)位(位 30)来指示请求的最后完成状态。错误状态以各种错误代码来表示,如下所述:

  • 0010:因出现状态为 UR、CA 或 CRS 的完成 TLP,请求已被终止。在此情况下,不存在与完成包关联的数据,并且完成描述符中已设置请求完成位。从核接收到此类完成后,用户逻辑即可丢弃对应请求。
  • 0011:因完成 TLP 字节计数不正确,此读取请求已被终止。当接收到的完成 TLP 的字节计数与期望的计数不匹配时,就会发生此状况。完成描述符中已设置请求完成位。从核接收到此类完成后,用户逻辑即可丢弃对应请求。
  • 0100:此代码对应状况如下:当前交付的完成包所含标签与未完成请求的标签相同,但其 Requester ID、TC 或 Attr 字段与未完成请求的参数不匹配。用户逻辑应丢弃位于描述符之后的所有数据。此外,如果在描述符中未设置请求完成位,那么用户逻辑应继续丢弃于此标签完成之后接收的数据,直至它接收到已设置请求完成位的完成描述符为止。接收到已设置请求完成位的完成描述符后,用户逻辑即可移除与该请求关联的所有状态。
  • 0101:起始地址中存在错误。完成 TLP 报头中的下位地址位与请求的下一个期望字节的起始位置不匹配。用户逻辑应丢弃位于描述符之后的所有数据。此外,如果在描述符中未设置请求完成位,那么用户逻辑应继续丢弃于此标签完成之后接收的数据,直至它接收到已设置请求完成位的完成描述符为止。接收到已设置请求完成位的完成描述符后,用户逻辑即可丢弃对应请求。
  • 0110:标签无效。此错误代码指示完成 TLP 中的标签与任意未完成请求的标签都不匹配。用户逻辑应丢弃位于描述符之后的所有数据。
  • 1000:请求已终止,完成包超时。当未完成的请求超时且未从链路接收到完成包时,会使用此错误代码。核会为每个未完成的请求保留完成定时器,并通过在请求器完成接口上向用户逻辑发射虚拟完成描述符来响应完成超时,因此,用户逻辑可以终止暂挂的请求或者重试该请求。由于此描述符不对应于从链路接收到的完成 TLP,因此,在此描述符中只有请求完成位(位 30)、标签字段(位 [71:64])和请求器功能字段(位 [55:48])有效。
  • 1000:因出现以生成请求的功能为目标的功能级别复位 (FLR),此请求已被终止。在此情况下,核会在请求器完成接口上向用户逻辑发射虚拟完成描述符,因此用户逻辑可终止暂挂请求。由于此描述符不对应于从链路接收到的完成 TLP,因此,在此描述符中只有请求完成位(位 30)、标签字段(位 [71:64])和请求器功能字段(位 [55:48])有效。

当标签由核进行内部管理时,核中的逻辑可确保在接收到对应请求的所有完成包或者当请求超时之后,才能复用分配到暂挂请求的标签。但当标签由用户逻辑管理时,用户逻辑必须确保先由核通过在完成描述符中设置请求完成位的方式来发送请求终止信号,然后才能复用分配给请求的标签。用户逻辑可在接收到含非 0 错误代码的完成时结束暂挂请求,但如果在完成描述符中未设置请求完成位,则不应释放关联标签以作他用。当请求接收到多个拆分完成包,并且其中任一信号包含错误时,会发生此状况。在此情况下,核可以继续接收暂挂请求的完成 TLP,即使检测到错误也是如此,并且如果过早重新分配该请求的标签,则会导致这些完成包与其它请求出现匹配错误。请注意,在某些情况下,核可能需要等待请求超时后才能允许复用标签,即使已接收到含错误的拆分完成包也是如此。

注释: 每个奇偶校验位都对应于 AXIS tdata 中的 1 个字节的奇偶校验。有多个 64 位奇偶校验位对应于 512 位 AXI tdata(另有多个 32 位奇偶校验位对应于 256 位 AXI tdata)。m_axis_cq_tuser 信号和 m_axis_rc_tuser 信号上接收到的奇偶校验位对于以下字节有效:
  • AXIS tdata 中的描述符字节。
  • AXIS tdata 中有效的有效载荷字节(由 AXIS tuser 中的 byte_en 字段来表示)。例如,如果 byte_en[63:0]=0x0000_0000_0000_FFFF,那么仅限下 16 位奇偶校验位有效。如果 byte_en[63:0] = 0xFFFF_FFFF_FFFF_FFFF,则启用全部 64 个奇偶校验位。