HLS中pragma的归纳总结

Vivado/Vitis High-Level Synthesis (HLS) 是Xilinx公司推出的一款基于C++等高级语言的开发工具,它能够将高级语言转化为RTL语言,目的是针对大数据、AI、云等新兴领域,面向软件开发者,加快开发和验证速度。就三五年内而言,其在resource、latency、timing等方面必然是比不上直接进行RTL设计,但是它的优势在于极大的提高了开发、验证效率,大幅度降低了时间成本。
当然,现在的HLS工具还不能完美的直接将C++转化为RTL,需要coder在代码设计过程中具有一定的硬件思维,同时加入合理的optimization directives(HLS pragma),使结果更加符合预期。
下面介绍了一些directive,仅供参考,当然在手册ug902中还能找到更加详细的介绍,在github中的Vitis_Libraries中还能看到大量的应用实例。

  1. unroll,如下代码所示,unroll是将for循环内的代码展开成8份,也相当于使用8倍的资源去实现这个结构。factor指定的unroll份数必须是可以被循环次数整除的数。factor也可以省略,default时unroll份数就是循环次数。
for(int i=0;i<16;i++){
#pragma HLS unroll factor=8
  x[i] = y[i];
}
  1. 一个比较经典的方式来展示templete参数,unroll、dataflow使用的例子,如下所示。
templete<int N>
void design(int value[N]){
#pragma HLS dataflow
    for(int i = 0; i < N; i++){
#pragma HLS unroll
        testCore(value[i]);
    }
}
  1. pipeline的使用,如下所示,当指定ii时,工具会按照这个目标去综合,最小做到设定值,如果不设定,默认ii=1,当然,如果工具判断ii=1实现不了会按照最小的情况实现,当然,如果不期望pipeline,可以用off关闭。
for(int i=0;i<16;i++){
#pragma HLS pipeline ii=2
  x[i] = y[i];
}
  1. 其他常用的pragma:
//hls工具在分析代码时对某些函数块可能不是按照我们预期的做inline on/off处理,所以我们需要自己指定,
#pragma HLS inline off
//对于操作符dmul,操作符如下表所示,详见ug902
#pragma HLS ALLOCATION instances=dmul limit=16 operation
//当我们自定义一个函数func时,如下所示pragma,可以限定pragmatic所在的函数所使用的func资源为limit份
#pragma HLS ALLOCATION instances=func limit=1 function
//指定计算的资源类型
#pragma HLS RESOURCE variable=temp core=AddSub_DSP
//指定array InitPara的存储资源类型,包括RAM_2P_BRAM,RAM_2P_URAM,RAM_2P_LUTRAM,FIFO_LUTRAM等等
#pragma HLS RESOURCE variable=InitPara core=RAM_2P_BRAM
//指定循环的最大最小次数,用来分析latency,但只影响hls报告的生成。
#pragma HLS loop_tripcount min=10 max=10
//表明循环内变量buff_A每一次迭代计算互不依赖,谨慎使用
#pragma HLS dependence variable=buff_A inter false
//设计变量stream类型(fifo)的变量的深度
#pragma HLS stream variable = testStrm depth = 32
//drective写在外部循环的内部,禁止与内部循环合并(拉平)
#pragma HLS flatten off

HLS ALLOCATION

发布了10 篇原创文章 · 获赞 0 · 访问量 6260

猜你喜欢

转载自blog.csdn.net/u010379248/article/details/102532100
今日推荐