vivado hls的ap_ctrl_none的使用
一、说明1.ap_ctrl_none最精简的模式不产生任何握手信号模块依靠数据有效信号持续工作2.ap_ctrl_none也就是free-run模式永动机模式3.ap_ctrl_none的应用高度依赖于#pragma HLS dataflow指令目的是在数据流区域中通过消除块级握手信号的开销让数据像流水一样无阻塞地通过各个处理阶段从而最大限度地提高吞吐量4.使用ap_ctrl_none后生成的硬件模块不需要ap_start信号来启动。只要输入端口有有效数据且复位信号无效模块就会开始工作5.ap_ctrl_none强制数据流区域内的所有进程必须通过FIFO进行通信。这意味着像hls::stream和标记为#pragma HLS STREAM的数组是必需的不能使用普通的RAM或内存接口如#pragma HLS INTERFACE bram6.ap_ctrl_none要求数据流区域内的所有子任务进程执行的总次数必须完全相同。因为握手信号的缺失使得下游模块无法精确“背压”上游从而可能破坏C仿真的顺序模型而“执行次数相同”这一强约束确保了行为的一致性7.如果一个数据流区域使用了ap_ctrl_none其所有父级模块直至顶层都必须同时使用DATAFLOW指令和ap_ctrl_none协议。这是因为ap_ctrl_none区域没有ap_done信号父级FSM无法得知它何时完成导致系统卡死二、ap_ctrl_none使用的禁区1.禁止在循环内部使用绝不能在for循环内部的数据流区域使用ap_ctrl_none。HLS工具需要ap_done信号来判断循环迭代何时结束而ap_ctrl_none不产生该信号会破坏循环的正常执行逻辑。2.顶层设计推荐使用ap_ctrl_hs或ap_ctrl_chain除非满足特殊条件如设计为纯组合逻辑或启动间隔II1否则不建议在顶层模块使用ap_ctrl_none。三、要求1.使用阻塞的hls::stream在ap_ctrl_none数据流区域内部必须使用阻塞式的hls::stream::read()和hls::stream::write()操作。非阻塞操作缺少必要的握手无法保证C/RTL协同仿真的成功。2.AXI4-Stream是绝配输入输出端口采用AXI4-Stream接口即#pragma HLS INTERFACE axis是与ap_ctrl_none配合的极佳选择。AXI4-Stream本身就是为连续数据流设计它的tvalid和tready握手信号与ap_ctrl_none的数据驱动模型天然契合。四、ap_ctrl_none的本质1.在Vivado HLS的数据流DATAFLOW中使用 ap_ctrl_none是一种为追求极致性能而剥离顶层控制接口的高级用法。它本质上是对工具的承诺——设计中的数据流进程将执行完全相同的次数以此来换取硬件实现上更低的资源开销和更高的吞吐效率。2.对于视频、网络包处理、数字信号处理DSP等数据连续输入的应用使用 ap_ctrl_none 可以避免 ap_start/ap_done 等握手信号的开销让模块一旦上电即持续运行最大化吞吐量3.纯组合逻辑或完全流水化设计如果设计是纯组合逻辑或能在每个时钟周期都处理一个数据即启动间隔 II1使用 ap_ctrl_none 可以消除块级握手信号使模块运行更加高效