https://www.xilinx.com/html_docs/xilinx2018_2/sdaccel_doc/hls-pragmas-okr1504034364623.html
数据精度
支持任意精度,任意位宽的有/无符号数据类型
#include "ap_int.h"V
unsigned int : ap_uint<width>
signed int : ap_int<width>
unsigned fixed : ap_ufixed<width,width_int>
signed fixed : ap_fixed<width,width_int>
资源类型
#pragma HLS RESOURCE variable=<temp> core=<Xilinx core> //temp:变量名 Xilinx core :类型
#pragma HLS RESOURCE variable=temp core=AddSub_DSP //指定计算的资源类型
#pragma HLS RESOURCE variable=InitPara core=RAM_2P_BRAM //指定array InitPara的存储资源类型,包括RAM_2P_BRAM,RAM_2P_URAM,RAM_2P_LUTRAM,FIFO_LUTRAM等等
数组
#pragma HLS array_partition variable=<name> <type> factor=<int> dim=<int> //指定一个数组中的数据如何在存储资源中进行排布
name:划分的数组名
type :complete(打散分别存储) ,cyclic(按factor取模进行划分), block(按份数划分成几块) //划分方式
factor:划分的份数
dim=1,2,3...(dim=0) //划分的维度,0表示所有维度
循环边界
#pragma HLS loop_tripcount min=<int> max=<int> avg=<int> //HLS中循环迭代次数应为定值,否则Latency会等于?,设定循环迭代的最大值,最小值,平均值便于性能分析
循环展开
#pragma HLS UNROLL (factor=<int>) //将循环体内的代码复制多份,需要占用更多硬件,和array_partition配合使用,未指定factor,则将循环完全展开
循环流水化
#pragma HLS PIPELINE(II=<int>) //使循环的多个iteration并发执行,II为多个iteration的间隔,默认为1(即fully pipeline),在HLS中PIPELINE下面的循环会完全展开,因此可以去掉UNROLL
数据流
#pragma HLS dataflow //任务级流水化而不是顺序执行 默认用double-buffer来实现
STREAM
#pragma HLS stream variable=<variable> depth=<int> dim=<int> //以高性能FIFO代替高资源占用的double-buffered RAM,必须有一个producer和一个consumer
数据类型:hls::stream<stream_type> (+ &<参数> 当为函数参数)
函数内联
#pragma HLS INLINE(off) //控制函数在被调用的时候是否内联
内联函数inline:引入内联函数的目的是为了解决程序中函数调用的效率问题,这么说吧,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。这其实就是个空间代价换时间的i节省。所以内联函数一般都是1-5行的小函数。
接口
#pragma HLS INTERFACE m_axi depth=32 port=Out_ddr
#pragma HLS INTERFACE <类型> depth=<大小> port=<名称>
带宽
#pragma HLS data_pack variable=<变量名> //以struct形式将数据封装,增加数据的位宽
其他经验
不可以使用动态内存分配操作
不可以调用系统函数,如printf( )
标准库函数不是完整支持,例如math.h中的部分复杂函数
不要使用函数指针、虚函数等
不可以使用递归函数调用
循环体优化,如:复杂逻辑拆分、减少分支
应将目标功能切分为多个彼此独立的子模块,自底向上