我们可以采用ALLOCATION使这两个副本并行运行,从而减少延迟性,配置与结果如下图所示。
2. Loop Pipeline with Rewind Option
当函数中有多个循环时候,我们做Rewind,会爆出警告,没有办法执行,所以我们可以看出Rewind不是所用的for循环都是适用的。
如何对for循环自动添加流水
config_compile
配置使循环可以根据迭代计数自动进行Pipeline处理。
- pipeline_loops选项设置迭代限制
- 迭代次数低于此限制的所有循环将自动Pipeline
- 默认为0:不执行自动Pipeline的循环
如果设计中有不想使用自动自动Pipeline的循环,则将带有off选项的PIPELINE指令应用于该循环。off选项可防止自动循环流水线。
Addressing Failure to Pipeline
当任务Pipeline时,层次结构中的所有循环都会自动展开
- 这是进行Pipeline处理的要求
- 如果循环具有变量边界,则无法展开该循环,这将防止任务被Pipeline,因为Vivado HLS无法知道循环何时完成
3. Variable Loop Bounds
当循环的边界为变量的时候,Vivado HLS将不能够确定的知道延迟为多少(报告为问号"?"),即设计性能未知。
对于这种情形我们有三种处理方式。
- 使用Tripcount指令
- 将循环边界的数据类型声明为
ap_int <w>
- 在C代码中使用assert macro
Tripcount指令
Tripcount指令对综合结果没有影响,仅对报告有影响,可以比较来自不同解决方案的报告。
数据类型声明为ap_int <w>
在C代码中使用assert macro
对三种做对比
我们可以发现第三种方法的效果是最好的
4. 总结