RCB_FC 方法 - 1.3 简体中文

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

Document ID
PG213
Release Date
2022-11-16
Version
1.3 简体中文
RCB_FC 方法可用于按 RCB 粒度对信用值的块进行分配和解分配。信用值基于 RCB 来进行清除。就像使用 PACKET_FC 时一样,从 CPLH_PENDING 和 CPLD_PENDING(复位时加载,含零位)这两个寄存器开始。
  1. 按 RCB 计算数据信用值:
    • CplD_PER_RCB = RCB / 16 字节
  2. 当用户应用需发送非转发请求时,判定可能需要的 CplH 信用值的潜在数值。使用以下公式来按 RCB 粒度分配 CplD 信用值:
    • NP_CplH = ceiling[((Start_Address mod RCB) + Request_Size) / RCB]
    • NP_CplD = NP_CplH × CplD_PER_RCB
  3. 检查以下项:
    • CPLH_PENDING + NP_CplH < Total_CplH
    • CPLD_PENDING + NP_CplD < Total_CplD
  4. 如果这两个不等式均成立,则发射非转发请求,将 CPLH_PENDING 增大 NP_CplH,并将 CPLD_PENDING 增大 NP_CplD。
  5. 每个传入完成包开始时,或者如果该完成包始于或跨某个 RCB 但并未止于此 RCB,则 CPLH_PENDING 减小 1,且 CPLD_PENDING 减小 CplD_PER_RCB。任意完成包均可跨多个 RCB。跨 RCB 数量可按如下方式计算:
    • RCB_CROSSED = ceiling[((Lower_Address mod RCB) + Length) / RCB]

“Lower_Address”和“Length”字段均可从完成报头进行解析。或者,也可以在每个传入完成包起始位置加载含 Lower_Address 的寄存器 CUR_ADDR,按相应的 DW 或 QW 递增,然后一旦 CUR_ADDR 发生翻滚,即可对 RCB 进行计数。

此方法的资源浪费少于 PACKET_FC,但仍提供 RCB 粒度。如果用户应用发射 I/O 请求,那么用户应用可采用如下策略,即为每个 I/O 读取仅分配 1 个 CplD 信用值,为每个 I/O 写入分配 0 个 CplD 信用值。用户应用必须按原始非转发请求的类型(存储器写入、I/O 读取、I/O 写入)来为传入完成包匹配每个标签。