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
。
ap_return
输出端口。s_axilite
),那么控制协议中的所有端口都会捆绑到 s_axilite
接口。使用应用或软件驱动程序来配置和控制块的启动和停止操作时,这是软件可控内核或 IP 的常用实践。这是 XRT 和 Vitis 内核流程的要求。ap_ctrl_chain
下图显示了由 ap_ctrl_chain
控制协议为顺序执行所创建的块级握手信号的行为。在下图中,HLS 设计的第 1 项传输事务完成后,第 2 项传输事务立即启动,因为 ap_continue
为高电平状态,且 ap_done
为高电平状态。但设计在第 2 项传输事务结束后将停止,直至 ap_continue
断言为高电平有效为止。
- 此块会等待
ap_start
达到高电平,然后再开始操作。 -
ap_idle
输出会立即变为低电平,以指示设计不再处于空闲状态。 -
ap_start
信号必须保持处于高电平状态,直至ap_ready
达到高电平状态。当ap_ready
达到高电平状态后:- 如果
ap_start
保持高电平,设计将启动下一项传输事务。 - 如果
ap_start
变为低电平,设计将完成当前传输事务,然后停止操作。
- 如果
- 可读取输入端口上的数据。
- 可将数据写入输出端口。注释: 输入和输出端口还可指定独立于控制协议的端口级 I/O 协议。欲知详情,请参阅 Vivado IP 流程的端口级协议。
- 当块完成操作后,
ap_done
输出会变为高电平状态。注释: 如果存在ap_return
端口,那么当ap_done
处于高电平状态时,此端口上的数据将变为有效。因此,ap_done
信号还用于指示ap_return
输出上的数据有效。 -
ap_ctrl_chain
控制协议会提供处于高电平有效状态的ap_continue
信号,表示使用输出数据的下游块已准备好处理新的数据输入。这样即可允许下游块提供反压,以阻止数据流动。- 如果
ap_continue
信号为高电平状态,且ap_done
为高电平状态,那么设计将继续操作。 - 如果下游块无法使用新数据输入,那么
ap_continue
信号处于低电平状态。如果ap_continue
信号为低电平状态,而ap_done
为高电平状态,那么设计会停止操作,ap_done
信号会保持高电平状态,并等待ap_continue
变为高电平状态。
- 如果
- 当设计准备好接受新输入后,
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
再次转至高电平,而这样则会启动新的传输事务。
-
-
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_start
、ap_idle
、ap_ready
和 ap_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 ***