核的请求器侧可保留由用户应用发起的所有暂挂非转发传输事务(存储器读取、I/O 读取和写入、配置读取和写入以及原子操作)的状态,因此目标所返回的完成包可与对应请求相匹配。每个未完成的传输事务的状态都保存在接口的请求器侧的“Split Completion Table”(拆分完成包表)中,其容量为不超过 256 个非转发传输事务。返回的完成包将使用 8 位 标签与暂挂请求相匹配。有 2 个选项可用于这些标签的管理:
- “Internal Tag Management”(内部标签管理)
- 如果在
Vivado®
IDE 中未设置Enable Client Tag(启用客户标签)选项(该核的默认设置),则启用“Internal Tag Management”。在此模式下,核中的逻辑负责为从请求器侧发起的每个非转发请求分配标签。该核会保留可用标签列表,当用户逻辑发起非转发传输事务时,该核会向每个请求分配 1 个标签,并通过输出
pcie_rq_tag0[7:0]
和pcie_rq_tag1[7:0]
将分配的标签值传达给用户逻辑。当核断言pcie_rq_tag_vld0
和pcie_rq_tag_vld1
均有效时,该总线上的值即有效。pcie_rq_tag_vld0
和pcie_rq_tag_vld1
的使用与是否启用跨接选项无关。集成块可使用pcie_rq_tag_vld0
或pcie_rq_tag_vld1
端口来展示有效标签。用户逻辑必须复制此标签以便使核在请求的响应中所交付的任意完成包都与请求相匹配。在此模式下,核中的逻辑会检查“Split Completion Table”的完整条件,如果当前未完成的非转发请求总数已达到上限,则会对来自用户逻辑的非转发请求进行反压(使用
s_axis_rq_tready
)。 - “External Tag Management”(外部标签管理)
- 在 Vivado® IDE 中设置Enable Client Tag选项时,即启用“External Tag Management”。在此模式下,用户逻辑负责为从请求器侧发起的每个非转发请求分配标签。用户逻辑所选择的标签值与当时未完成的所有其它非转发传输事务的标签之间不得存在任何冲突,并且必须将此所选标签值传达给请求描述符中的核。核仍在其“拆分完成包表”中保留未完成的请求,并将传入完成包与请求相匹配,但不会对标签的唯一性进行任何检查,也不会检查“拆分完成包表”的完整条件。
使用“Internal Tag Management”(内部标签管理)时,核会断言 pcie_rq_tag_vld
有效并为每个非转发请求保持 1 个周期,然后它会将其分配的标签置于 pcie_rq_tag
上。启用跨接选项时,在同一周期内,核会在此接口上提供最多 2 个已分配的标签。pcie_rq_tag_vld
信号和 pcie_rq_tag
信号的状态必须按如下方式进行解读:
- 在任一周期内断言
pcie_rq_tag_vld0
有效即表示该核已将已分配的标签置于pcie_rq_tag0[7:0]
上。 - 在同一周期内将
pcie_rq_tag_vld0
和pcie_rq_tag_vld1
同步断言有效,表明该核已放置 2 个已分配的标签,其中第 1 个置于pcie_rq_tag0[7:0]
上,第 2 个则置于pcie_rq_tag1[7:0]
上。pcie_rq_tag0[7:0]
上的标签对应于用户逻辑先前发送的请求,而pcie_rq_tag1[7:0]
上的标签则对应于后续请求。 - 只要
pcie_rq_tag_vld0
不断言有效,pcie_rq_tag_vld1
就从不断言有效。即,在任一周期内如果只有 1 个标签要传达,则始终在pcie_rq_tag0[7:0]
上传达此标签。 - 不使用跨接时,在任一周期内只能传达 1 个标签,并且
pcie_rq_tag_vld1
从不断言有效。
在 s_axis_rq_tdata
总线上传输请求后,可能要经过数个周期的延迟之后,核才会断言 pcie_rq_tag_vld
有效以便为请求提供已分配的标签。与此同时,用户逻辑可以继续发送新请求。在 pcie_rq_tag
总线上,请求的标签按 FIFO 顺序来传递,这样用户逻辑即可轻松将标签值与其传输的请求相关联。