本文主要涉及与HLS常用pragma的一些知识
目录
二、数值精度
前言
本文主要涉及与HLS相关的一些知识
提示:以下是本篇文章正文内容。
一、HLS重点Pragma
HLS中Pragma主要涉及三个方面的应用,主要是硬件资源,数据流设计,接口设计。
1.硬件资源指定(RESOURCE)
指定向FPGA硬件资源映射时的资源类型
关键字:RESOURCE
文法:
#pragma HLS RESOURCE variable=<temp> core=<Xilinx core>
Examples:
int A[1024];
#pragma HLS RESOURCE variable=A core=RAM_T2P_BRAM
如上例所示,例如我们申明了一个数组,而我们需要用一个双口的BRAM来存储数组里的数据,我们可以使用pragma,<temp>处填上变量名,<core>处填上对应的硬件资源类型。
注:数组可以存储为片上的存储单元/Buffer/Scratchpad Memory
一般的硬件资源类型有两种:
(1)Flip-flop(FF)
- 单个时钟周期内可以并行访问多个地址;
- 单个时钟周期内可完成度,写操作;
- 容量有限,典型值大约在100Kbytes;
(2)Block RAM(BRAM)
- 高容量:典型值在Mbytes级别
- 访问性能受限:端口有限
2.数组划分(array_partition)
指定一个线上资源的存储,如何在线上资源中进行排布
关键字:array_partition
文法:
#pragma HLS array_partition variable=<name><type> factor=<int> dim=<int>
<name>:划分的数组名;
<factor>:划分的份数;
<type>:划分方式:其中包含:
- block:按照factor平均分割;
- cyclic:按取模的方式划分;
- complete:将数组打散为N个元素分别存储
<dim>:多维数组中指定划分的维度;
3.循环边界(loop_tripcount )
用于指定循环边界,在HLS综合过程中,循环迭代次数要求为定值,否则无法获得性能估计结果。此时我们可以利用loop_tripcount来指定循环迭代的最小值,最大值和平均值,用于比较准确的性能分析。
关键字:loop_tripcount
文法:
#pragma HLS loop_tripcount min=<int> max=<int> avg=<int>
4.循环展开(UNROLL)
用于循环并行优化,根据设定的factor,将循环体内的代码复制多份,指定不同的硬件资源来实现循环结构,复制多份代码并行处理同一任务,以硬件资源的消耗换取性能的提升
关键字:UNROLL
文法:
#pragma HLS UNROLL(factor=<int>)
5.循环流水化(PIPELINE/dataflow)
1.PIPELINE
将循环中的操作划分为多个流水级,从而使多个iteration并发执行
关键字:PIPELINE
文法:
#pragma HLS PIPELINE (II = <int>)
(默认II为1)
2.dataflow
任务级流水化,比PIPELINE颗粒更大,作用于不同的子函数
关键字:dataflow
文法:
#pragma HLS dataflow
6.函数内联(INLINE)
控制函数在调用时是否内联
关键字:INLINE
文法:
#pragma HLS INLINE(off)
二、数值精度
支持任意精度,任意位宽的有/无符号数据类型
头文件:"ap_int.h","ap_fixed.h"
精度处理文法: 在cpp文件中添加头文件后,可定义(width为位宽):
- Unsigned int : ap_uint<width>
- Signed int : ap_int<width>
- Unsigned fixed: ap_ufixed<width , width_int>
- Signed fixed: ap_fixed<width , width_int>
在优化硬件算法时,可合理分配数据位宽,注意硬件资源,效率与运算精度的平衡。