C2H 串流模式 - 4.0 简体中文

QDMA Subsystem for PCI Express v4.0 产品指南 (PG302)

Document ID
PG302
Release Date
2022-05-20
Version
4.0 简体中文

C2H 描述符可来自描述符提取引擎或 C2H 旁路输入接口。来自描述符提取引擎的描述符始终处于高速缓存模式。预取引擎会保留描述符的顺序,以便与来自用户的 C2H 数据包配对。来自 C2H 旁路输入接口的描述符针对简单模式和高速缓存模式使用同一个接口(请注意,简单旁路和高速缓存旁路使用同一接口)。对于简单模式,用户应用会保留描述符的顺序,以便与 C2H 数据包配对。对于高速缓存模式,预取引擎会保留描述符的顺序,以便与来自用户的 C2H 数据包配对。

预取上下文有一个旁路位。如果它是 1'b1,用户应用会发送描述符的信用值。如果它是 1'b0,预取引擎会处理描述符的信用值。

描述符上下文有一个旁路位。如果它是 1'b1,描述符提取引擎会传出 C2H 旁路输出接口上的描述符。用户应用可对其进行转换,稍后将其环回到 C2H 旁路输入接口上的 QDMA Subsystem for PCIe。如果旁路上下文位是 1'b0,描述符提取引擎会将描述符直接发送到预取引擎。

有一个 1K 描述符输入缓冲器可用于存储来自旁路输入端口的描述符。深度为 1K 的缓冲器与所有 Q 共享。

每个队列支持三种模式。

  • 高速缓存内部模式
  • 高速缓存旁路模式
  • 简单旁路模式

通过在“软件描述符上下文”和“C2H 预取上下文”中对旁路位进行置位,即可在简单旁路模式和高速缓存旁路模式之间进行选择,如下表所示。

注释: 对于 C2H 串流应用,如果已在器件上高速缓存了描述符,则无需从主机提取描述符,应采用简单旁路模式。采用简单旁路模式时,请勿提供信用值来提取描述符,而需改为在描述符旁路接口上传入描述符。
注释: AXI4-Stream C2H 简单旁路模式高速缓存旁路模式都在端口(c2h_byp_in_st_csh_* 端口)中使用相同的旁路。
表 1. C2H 串流模式
  c2h_byp_in 端口 desc_ctxt.desc_byp pfch_ctxt.bypass
简单旁路模式 c2h_byp_in_st_csh_* 1 1
高速缓存旁路模式 c2h_byp_in_st_csh_* 1 0
高速缓存内部模式 不适用 0 0

简单旁路模式

对于简单旁路模式,描述符提取引擎在 C2H 旁路输出接口上传出描述符。用户应用会转换描述符,并将其环回到简单模式 C2H 旁路输入接口上的 QDMA。用户应用会发送描述符的信用值,并保留描述符的顺序。

为了使简单旁路传输有效进行,需要一个预取标签(可从 QDMA IP 提取)。

在通过 C2H ST 引擎发送简单旁路队列的任何流量之前,用户应用必须请求预取标签。无效队列或非旁路队列不应使用此方法请求任何标签,因为这样会冻结未使用过的标签,从而影响性能。

在开始传输任何流量之前,必须预先保留预取标签。每个目标主机需要一个预取标签。在大多数应用中,每个主机都需要一个预取标签。采用简单旁路模式时,标签不会绑定到任何描述符环。对于共享相同预取标签的队列,数据和描述符需按相同顺序传入。对于“Simple Bypass”(简单旁路),数据和描述符均由用户控制,因此需保证顺序保持不变。

例如,在描述符输入时,如果数据串流所含数据包顺序为 Q0、Q1 和 Q2,则无法发送 Q1、Q2、Q0 等。顺序需保持相同。

用户应用使用简单旁路队列的 qid 写入 MDMA_C2H_PFCH_BYP_QID (0x1408) 寄存器,然后从 MDMA_C2H_PFCH_BYP_TAG (0x140C) 寄存器读取以检索对应的预取标签。只要当前 qid 有效,就必须使用所有 bypass_in 描述符驱动此标签。如果当前 qid 无效,则必须使用有效 qid 请求新的预取标签。

对于所有传输,必须将预取标签分配给输入端口 c2h_byp_in_st_csh_pfch_tag[6:0]。预取标签指向用于在预取引擎中存储活动队列的 CAM。此外,用于预取标签的 qid 必须用作所有简单旁路包的 qid。将该 qid 分配给 s_axis_c2h_ctrl_qid

提取预取标签的步骤如下所示:

  1. 软件指示信息:
    1. 初始化队列 (qid)。
    2. 使用有效的 qid 写入 MDMA_C2H_PFCH_BYP_QID 0x1408。
    3. 读取 MDMA_C2H_PFCH_BYP_TAG 0x140C 以获取预取标签。
    4. 预取标签和用于提取标签的 qid 应用于所有简单旁路包。此信息必须传达给用户端。
  2. 用户端:
    1. 将用于提取标签的 qid 分配给 s_axis_c2h_ctrl_qid
    2. 将包传输的实际 qid 分配给 s_axis_c2h_cmpt_ctrl_qid
    3. c2h_byp_in_st_csh_pfch_tag 分配预取标签值。
    4. 将包传输的实际 qid 分配给 c2h_byp_in_st_csh_qid
    注释: 只要原始 qid 有效,c2h_byp_in_st_csh_pfch_tag[6:0] 端口就可以具有相同的 prefetch_tag。

下面显示的简单旁路流程不包括“prefetch_tag”的提取。

图 1. C2H 简单旁路模式流程
注释: 有效载荷与完成包之间不需要特定顺序。

如果已有描述符,则无需更新指针或提供信用值。而是在描述符旁路接口中传入描述符,然后发送数据和完成 (CMPT) 包。

高速缓存旁路模式

对于高速缓存旁路模式,描述符提取引擎会在 C2H 旁路输出接口上传出描述符。用户应用会转换描述符,并将其环回到高速缓存模式 C2H 旁路输入接口上的 QDMA。预取引擎会发送描述符的信用值,并保留描述符的顺序。

对于高速缓存内部模式,描述符提取引擎会将描述符发送至预取引擎。预取引擎会传出描述符的信用值并保留描述符的顺序。在这种情况下,描述符不会在 C2H 旁路输出上发出,也不会在 C2H 旁路输入接口上返回。采用高速缓存内部模式时,预取标签由 IP 在内部维护。

采用高速缓存旁路模式或高速缓存内部模式时,可以开启预取模式,这样会预取描述符,从而显著降低传输时延。启用预取模式后,用户应用无法在 QDMA 描述符信用值输入端口中将信用值作为输入发送。所有队列的信用值都将由预取引擎进行维护。

采用高速缓存旁路模式时,预取标签由 IP 在内部维护。信号 c2h_byp_out_pfch_tag[6:0] 应作为输入 c2h_byp_in_st_csh_pfch_tag[6:0] 进行环回。预取标签指向用于在预取引擎中存储活动队列的 CAM。

图 2. C2H 高速缓存旁路模式流程
注释: 有效载荷与完成包之间不需要特定顺序。