块级控制协议 - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

Vitis 内核或 Vivado IP 的执行模式是由块级控制协议和 HLS 设计内子函数的结构来定义的。对于控制驱动的 TLP,ap_ctrl_chain 协议和 ap_ctrl_hs 协议支持顺序执行和流水打拍执行。对于数据驱动的 TLP,ap_ctrl_none 是必需的控制协议。

ap_ctrl_chain 控制协议是 Vitis 内核流程的默认协议,如 适用于 Vitis 内核流程的接口 中所述。ap_ctrl_hs 块级控制协议是 Vivado IP 流程的默认协议,如 Vivado IP 流程接口 中所述。但要将 HLS 设计链接起来以便为流水打拍执行提供更好的支持,应使用 ap_ctrl_chain

您可在函数返回时使用 INTERFACE 编译指示或指令指定块级控制协议。如果 C/C++ 语言代码不返回值,您仍可在函数返回时指定控制协议。如果 C/C++ 语言代码使用函数返回,那么 Vitis HLS 会为返回值创建 ap_return 输出端口。
提示: 如果函数返回指定为 AXI4‑Lite 接口 (s_axilite),那么控制协议中的所有端口都会捆绑到 s_axilite 接口。使用应用或软件驱动程序来配置和控制块的启动和停止操作时,这是软件可控内核或 IP 的常用实践。这是 XRT 和 Vitis 内核流程的要求。

ap_ctrl_chain

下图显示了由 ap_ctrl_chain 控制协议为顺序执行所创建的块级握手信号的行为。在下图中,HLS 设计的第 1 项传输事务完成后,第 2 项传输事务立即启动,因为 ap_continue 为高电平状态,且 ap_done 为高电平状态。但设计在第 2 项传输事务结束后将停止,直至 ap_continue 断言为高电平有效为止。

图 1. ap_ctrl_chain 接口的行为
时序图会在复位后显示以下行为:
  1. 此块会等待 ap_start 达到高电平,然后再开始操作。
  2. ap_idle 输出会立即变为低电平,以指示设计不再处于空闲状态。
  3. ap_start 信号必须保持处于高电平状态,直至 ap_ready 达到高电平状态。当 ap_ready 达到高电平状态后:
    • 如果 ap_start 保持高电平,设计将启动下一项传输事务。
    • 如果 ap_start 变为低电平,设计将完成当前传输事务,然后停止操作。
  4. 可读取输入端口上的数据。
  5. 可将数据写入输出端口。
    注释: 输入和输出端口还可指定独立于控制协议的端口级 I/O 协议。欲知详情,请参阅 Vivado IP 流程的端口级协议
  6. 当块完成操作后,ap_done 输出会变为高电平状态。
    注释: 如果存在 ap_return 端口,那么当 ap_done 处于高电平状态时,此端口上的数据将变为有效。因此,ap_done 信号还用于指示 ap_return 输出上的数据有效。
  7. ap_ctrl_chain 控制协议会提供处于高电平有效状态的 ap_continue 信号,表示使用输出数据的下游块已准备好处理新的数据输入。这样即可允许下游块提供反压,以阻止数据流动。
    • 如果 ap_continue 信号为高电平状态,且 ap_done 为高电平状态,那么设计将继续操作。
    • 如果下游块无法使用新数据输入,那么 ap_continue 信号处于低电平状态。如果 ap_continue 信号为低电平状态,而 ap_done 为高电平状态,那么设计会停止操作,ap_done 信号会保持高电平状态,并等待 ap_continue 变为高电平状态。
  8. 当设计准备好接受新输入后,ap_ready 信号会脉冲至高电平状态并保持 1 个时钟周期。下游块的 ap_ready 端口可直接驱动 ap_continue 端口。以下是有关 ap_ready 信号的其他信息:
    • ap_ready 信号处于不活动状态,直至设计开始操作为止。
    • 在非流水打拍设计中,ap_ready 信号与 ap_done 同时断言有效。
    • 在流水打拍设计中,当 ap_start 采样结果为高电平后,ap_ready 信号可能在任意周期变为高电平状态。这取决于设计的流水打拍方式。
    • 如果在 ap_ready 转至高电平后 ap_start 保持处于高电平状态,那么下一项传输事务将立即启动。
    • 如果 ap_ready 转至高电平后 ap_start 立即转至低电平,那么设计会持续执行操作,直至 ap_done 变为高电平状态后停止操作,除非在此期间 ap_start 再次转至高电平,而这样则会启动新的传输事务。
  9. ap_idle 信号可用于指示设计何时处于空闲且不执行操作状态。以下是有关 ap_idle 信号的其他信息:
    • 如果 ap_start 信号为低电平状态,而 ap_ready 为高电平状态,那么设计将停止操作,而 ap_idle 信号将在达成 ap_done 后,再经过 1 个周期后变为高电平状态。
    • 如果 ap_start 信号为高电平状态,且 ap_ready 为高电平状态,那么设计将继续操作,且 ap_idle 信号保持处于低电平状态。

ap_ctrl_hs

ap_ctrl_hs 控制协议与 ap_ctrl_chain 具有相同信号,但它将 ap_continue 信号设为 1 以保持高电平。此控制协议支持顺序执行模式和流水打拍执行模式,但不提供来自下游设计模块的反压以控制数据流动。

ap_ctrl_none

ap_ctrl_none 同样与 ap_ctrl_chain 具有相同信号,但握手信号端口(ap_startap_idleap_readyap_done)设为高电平并且会被优化掉。

ap_ctrl_none 区域或者一个或多个 hls::tasks 可通过以下任一方法来加以例化:

  • 上至顶层都仅含 ap_ctrl_none 区域,即,上层不含任何顺序 FSM 或非 ap_ctrl_none 数据流,哪怕有编码错误也是如此);
  • 或者在数据流区域内满足下列条件:
    • 其输入串流是由先前调用的一个或多个非 ap_ctrl_none 进程或区域生成的
    • 其输出串流供后续调用的一个或多个非 ap_ctrl_none 进程或区域使用

前者支持消除 ap_start/ap_ready/ap_done/ap_continue 握手,上至顶层都是如此。后者支持为高于先前进程或区域的数据流区域生成 ap_start/ap_ready 握手,并支持后续进程或区域生成 ap_done/ap_continue 握手。

重要: 如果您在设计中使用 ap_ctrl_none 控制协议,则必须满足 接口综合的联合仿真要求 中所述的至少一个 C/RTL 协同仿真条件,以便验证 RTL 设计。如果这些条件都未能满足,C/RTL 协同仿真将中止并提示下列消息:
@E [SIM-345] Cosim only supports the following 'ap_ctrl_none' designs: (1) 
combinational designs; (2) pipelined design with task interval of 1; (3) designs with 
array streaming or hls_stream ports.
@E [SIM-4] *** C/RTL co-simulation finished: FAIL ***