写在前面
本文是本系列专题的第十四篇,参考高亚军老师的视频教程以及课程的ppt,主要介绍了Vivado HLS 函数层面的优化。
代码风格
编码风格对函数的主要影响在于函数参数和接口。如果函数的参数是明确的,Vivado HLS可以通过使用HLS库中的精度的类型进行定义数据类型。没有必要为每个变量创建任意的精度类型。
下面的示例是默认状态和使用ap_int的两种情况的对比。从结果中可知,使用ap_int更节约资源。
内联(inline)
函数内联删除了函数层次结构。函数可以使用INLINE指令进行内联。内联函数可以改进区域,允许函数中的组件与调用函数中的逻辑更好地共享或优化。HLS可能会自动内联小的函数,以提高结果质量(QoR)。你可以通过向任何自动内联的函数添加带有off选项的内联指令来防止这种情况。
从下面这个例子中可以看出,如果只是把inline简单关闭的话,延迟会增大,资源使用也会变多。
分配(allocation)
他为资源分配指定实例限制。它定义并限制用于实现特定功能或操作的RTL实例的数量。简单来说就是同样的一份电路,在RTL级中被调用的次数进行规划。
使用allocation,在默认情况,limit = 1,limit = 2 的对比。可得出,在limit = 2 时延时最小,同时用到的资源也是最多的。
任务级流水线:DATAFLOW
之前DATAFLOW只是应用于函数内部,这里将DATAFLOW应用于函数之间。
DATAFLOW的优化方法可以将一系列的串行任务进行优化,这里的任务可以是函数,可以是循环,或者两种都有。使用这一系列顺序任务,DATAFLOW优化创建了一个并行流程架构。上图所示的通道确保任务不需要等待前一个任务完成所有操作后才能开始。所以DATAFLOW允许任务之间有交叠,也就是并行化处理,这种方法提高了数据的吞吐量,减少了延迟。
下面这个例子。在不使用dataflow的处理指令,执行周期是8,而进行优化过后,执行周期变成了5。
使用示例:
小结
- 任意精度类型可以帮助缩小面积。
- 函数内联可以提高QoR。
- 分配能帮助实现一个延迟和面积直接的权衡。
- 数据流优化是提高设计吞吐量的一种强大方法。