RCB_FC 方法可用于按 RCB 粒度对信用值的块进行分配和解分配。信用值基于 RCB 来进行清除。就像使用 PACKET_FC 时一样,从 CPLH_PENDING 和 CPLD_PENDING(复位时加载,含零位)这两个寄存器开始。
- 按 RCB 计算数据信用值:
- CplD_PER_RCB = RCB / 16 字节
- 当用户应用需发送非转发请求时,判定可能需要的 CplH 信用值的潜在数值。使用以下公式来按 RCB 粒度分配 CplD 信用值:
- NP_CplH = ceiling[((Start_Address mod RCB) + Request_Size) / RCB]
- NP_CplD = NP_CplH × CplD_PER_RCB
- 检查以下项:
- CPLH_PENDING + NP_CplH < Total_CplH
- CPLD_PENDING + NP_CplD < Total_CplD
- 如果这两个不等式均成立,则发射非转发请求,将 CPLH_PENDING 增大 NP_CplH,并将 CPLD_PENDING 增大 NP_CplD。
- 每个传入完成包开始时,或者如果该完成包始于或跨某个 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 写入)来为传入完成包匹配每个标签。