HLS学习笔记

最终转换的是HDL,也就是说HDL干不了的HLS肯定干不了,HDL能干的HLS也不一定能成。HLS与HDL相比,使用C/C++来设计电路,并可以自动添加流水、循环(部分)展开等操作。

  • C仿真是验证的C文件的语法正确性?C综合的输出文件是HDL文件吗?然后后续步骤就是常规HDL设计流程了?
    -C仿真是算法层面的验证, C test bench验证的是C设计的正确性而非和C设计文件一起转换成HDL和相应的tb文件之后再进行验证(这一过程也存在),这样使得验证速度提升,时序等正确性由HLS工具来保证。
  • directive为何如此命名,看起来是一个很重要的东西,但没有get到其重点在哪?(对常规HLS生成的HDL进行人为干涉)通过directive可以修改哪些内容,directive的设计是想人为弥补自动生成的不足,主要是修改接口,但即使有directive还是无法匹敌HDL,欠缺在哪呢?如何修改?会有单独的文件形式保存吗?(directive.tcl文件,保存的内容和vivado在命令行窗口输入的脚本命令很像)
  • C的Coding style如何影响最终性能,为何会说HLS性能不如HDL,是具体在哪里有不足?
    乘法器消耗的资源比加法器多,因此需在C语言算法层面就尽可能减少乘法的使用。
    递归算法不支持,原因在于无法综合成固定的电路出来,同理动态存储空间分配也不行。
    需要loop merge, 默认是没有并行的,仍按照高级语言顺序执行,但在两个loop的循环边界不同或其中至少一个是变量的时候,不适用loop merge。循环边界可以是变量,该变量在实际综合的时候也得能计算出来一个固定值吧?
  • 如何支持不同数据类型?位宽?sizeof返回的是长度最靠近的数据类型长度,那对于任意长度的数据类型设定有何意义?额外再有一个typeid()来确认数据类型。
    数据类型转换对应硬件电路是啥?
  • 常用的include的库有哪些?
  • 与C语言的书写还有一点不同在于,需要将main函数的返回值正确返0,错误返1?
  • interface protocol的设计,在什么时候考虑给输入输出添加val信号?
  • Dataflow和pipeline有何区别?默认的pingpong RAM对应的硬件是什么?
  • Unroll和Flatten有何区别?
  • 重点在于针对for循环的优化,想把其尽可能完美地流水话,消掉bubble;或者硬件换时间
  • HLS是通过建模计算不同操作的latency,来选取不同的硬件电路映射吗?得到的report并不是综合后电路结果
  • 使用assert能综合出电路来?
  • HLS会给后续电路布局布线留出一定时序余量,即在set_clock_uncertainty中指定的值,该值的存在也意味着,HLS和HDL的优化距离必然存在。
  • 对不同的时钟频率可以生成不同的硬件结构,主要是考虑到在组合逻辑需要的时间固定的情况下,如5ns,若选取2ns为周期,则需要三拍,会出现额外的1ns浪费,因此HLS通过操作链接将其他占用1ns的操作链接到前序操作之后。
  • 循环拆分,在每一个循环体中只对一个变量进行处理,不同变量之间可以彼此独立地进行优化,采取不同的优化措施。
  • 循环起始间隔的取值为什么要交给设计人员来指定?和循环迭代延迟的区别指的是interval和latency?
  • 32位的乘法需要使用比8位更深的流水线,来达到相同频率。
  • hls_zcu102_0_基础流程与放弃
  • 默认以函数为基本单位进行优化,为使其能和父函数一起进行优化,需要Inline
  • FPGA并行编程
  • UG902: The package xilinx_hls_lib_.tgz does not include the C arbitrary
    precision types defined in ap_cint.h. These types cannot be used with standard C compilers, only with
    the Vivado HLS cpcc compiler.
    但是有人指出“Apparently if you use a C++ based design and use the “ap_int.h” header file, we could do it. Also there is no copyright issue as mentioned in the documentation.” From Can I compile the C code I write in Vivado HLS using a gcc compiler?
  • 写tb的时候一定需要预先给出参考输出值吗(借助matlab算)?
  • 不能两个函数操控同一个数组吗?
  • 为什么HLS没有浮点accumulator(不是CPU的用来存储中间结果的累加器?)而是浮点binary adder?二者区别很大吗?不能将加法器的一个输出接到输入上等效于accumulator?还是说此处的binary adder不是浮点类型的 可以这样,但是后一级adder会依赖于前一级的输出 ,不利于流水?
  • 高级语言不适合位操作?
  • 手动展开和unroll自动展开为什么会存在FF和LUT资源的区别?此处的FF指的是FIFO还是Flip Flop?
  • cordic算法需要提前预算查找表,存储一些特定的函数值,但这些值本身也不是精准的,是人工手算的,否则会出现先用机器算了特定函数值,然后再基于此用CORDIC去求其他函数值,而本来可以直接用机器像算特定函数值一样去算。
    查找表选取的值使得其最大只能在-90~90之间进行旋转。

进入到第一个困惑点,难道HLS就是写完c/c++,然后添加directive?我所看到的都是一些“八股式”的固定化的东西,应该如何去继续接下来的学习?这项技术目前看起来又不吸引我了。

你可能感兴趣的:(笔记)