HLS优化总结

文章目录

  • 1 任意精度数据类型
  • 2 unroll&pipeline
    • 2.1 循环平坦化
    • 2.2 循环展开
    • 2.3 循环合并
  • 3 dataflow
  • 4 数组
    • 4.1 array partition
    • 4.2 array reshape
  • 5 inline
  • 6 interface

部分内容总结自https://blog.csdn.net/weixin_41967965/article/details/82080230
http://www.openhw.org/module/forum/forum.php?mod=viewthread&tid=595819&highlight=HLS学习笔记

1 任意精度数据类型

HLS优化总结_第1张图片
用法:
ap_[u]fixed;
这里W代表整个数据的字长,I代表整数部分的字长,那么小数部分被的字长就是W-I
Q表示量化模式,针对低位部分,O表示溢出模式,针对高位部分
比如说ap_fixed<3, 2, AP_RND, AP_SAT>
AP_RND 指示该值应舍入到最接近ap_ [u]定点类型的可表示值。
AP_SAT 表示取到剩余位数能表示的最大的值

2 unroll&pipeline

  • 当一个函数或者循环被pipeline后,他嵌套的循环都会被unroll
  • 如果一个循环要被unroll,他必须有fixed的边界
  • pipeline的效果比unroll好
  • 一旦并行计算,DSP的数值会增加很多
    下面的内容取自http://www.openhw.org/module/forum/forum.php?mod=viewthread&tid=595819&highlight=HLS%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0

2.1 循环平坦化

HLS优化总结_第2张图片
HLS优化总结_第3张图片

2.2 循环展开

单纯的流水线优化和循环展开相比,在提升性能的基础上流水线优化更能节省乘法器资源。

2.3 循环合并

遇到多个独立的循环时,在一定情况下,Vivado hls可以自动地合并循环。
HLS优化总结_第4张图片
HLS优化总结_第5张图片
这是因为函数可并行执行:

3 dataflow

神器,时序直接就达标了

  • 使用dataflow之后,memory buffer会自动加到函数之间,使得即使之前的计算还未结束,之后的计算就可以开始
  • memory buffer默认用ping-pong buffer实现,会增加BRAM的量
  • memory buffer还可以用FIFO实现,好处是size可以直接控制。FIFO不消耗BRAM_18K

4 数组

本文摘自http://www.openhw.org/module/forum/forum.php?mod=viewthread&tid=595929&highlight=HLS%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0
通常情况下,数组一般被综合为存储器结构,比如RAM、ROM或者FIFO等,而设计内部的中间数组变量会根据设置被综合成block RAM,LUTRAM或者register。
针对固定的数组,也就是数组一旦初始化后就不再改变,程序只是调用这个数组,而不会再对这个数组进行写入,这个时候HLS就会将数组综合成ROM。
很多时候,数组元素的读取会成为瓶颈。

4.1 array partition

数组分割就是将一个多维数多元素的数组“分割”成多个相对独立的模块,当设置将数组分割成多个模块(BLOCK)时,HLS综合成RTL RAM,当将数组分割成单独的元素,则每个元素都以寄存器形式存储,这样当我们将数组分割成单个元素的时候,在同一个时钟周期,就能将A[N]全部读取出来,但是会占很多的LUT
HLS优化总结_第6张图片

4.2 array reshape

据说是array partition的逆运算

5 inline

when inline directive is applied to a function, the lower level hierarchy is automatically dissolved.

6 interface

Add INTERFACE directive to create AXI4LiteS adapters so IP-XACT adapter can be generated during the RTL Export step

你可能感兴趣的:(FPGA)