文档目录

3.2. C和C++库

Intel® High Level Synthesis (HLS) Compiler提供了许多头文件,以提供某些C和C++函数的FPGA实现。
Intel® HLS Compiler Pro版头文件总结
HLS头文件 描述
HLS/hls.h 组件识别和组件参数接口需要该文件。
HLS/math.h 包含math.h中数学函数特定于FPGA的定义,以用于操作系统。
HLS/extendedmath.h 包括math.h中没有的其他FPGA特定数学函数定义。
HLS/ac_int.h 提供FPGA优化的任意宽度整数支持。
HLS/ac_fixed.h

提供FPGA优化的任意精度定点支持。

HLS/ac_fixed_math.h

提供FPGA优化的任意精度定点数学函数。

HLS/ac_complex.h 提供FPGA优化的复数支持。
HLS/hls_float.h 提供优化的FPGA任意精度IEEE-754编译浮点数支持。
HLS/hls_float_math.h 提供FPGA优化的浮点数学函数。
HLS/math_dsp_control.h 提供ihc::math_dsp_control函数以控制本地范围内支持的数据类型和数学函数的硬件实现。
HLS/stdio.h 提供组件的printf支持,以便printf声明在x86仿真中有效,但在编译成为FPGA架构时在组件中被禁用。
<iostream> 在组建中使用coutcerr,通过HLS_SYNTHESIS宏守卫声明。

math.h

要访问您组件函数中math.h中的函数,包括您源代码中的"HLS/math.h”文件。头可以确保组件调用数学函数的硬件版本。

关于支持的math.h函数,请参阅支持的数学函数获得更多信息。

stdio.h

已综合的组件函数通常不支持C和C++标准库函数,例如FILE对象。

通过包含头文件HLS/stdio.h后,组件可以调用printf。此头会更改printf的行为,具体取决于编译对象,如下:

  • 对于针对x86-64架构(即, -march=x86-64 )的编译,printf调用执行常规行为。
  • 对于针对FPGA架构的编译(即,‑march="<FPGA_family_or_part_number>"),编译器会删除printf调用。

如果您在组件函数中使用printf,而未先将#include "HLS/stdio.h”行包含到代码中,当您将硬件编译为 FPGA架构时,就会收到类似于以下的错误消息:

$ i++ -march="<FPGA_family_or_part_number>" test.cpp
Error: HLS gen_qsys FAILED.
See ./a.prj/dut.log for details.

您可以使用C和C++标准库函数,例如,像所有测试台功能一样正常使用fopenprintf

iostream

RTL中不支持C++标准输出流(coutcerr),但您可以使用它们在仿真中调试组件。但是,您必须通过HLS_SYNTHESIS宏守卫任何coutcerr声明。

此宏可确保组件中的声明在x86 仿真中有效(即,-march=x86-64),但在将其编译为FPGA架构时,在组件中被禁用(即 -march="<FPGA_family_or_part_number>" )。例如:
#include "HLS/hls.h"
#include <iostream>

component int debug_component (int a){
#ifndef HLS_SYNTHESIS
    std::cout << "input value: " << a << std::endl;
#endif
    return a;
}

如果您尝试在组件函数中使用coutcerr,而未先通过HLS_SYNTHESIS宏对代码中的命令行进行守卫,则当您将硬件编译为FPGA架构时,就会收到类似于以下的错误消息:

$ i++ -march="<FPGA_family_or_part_number>" test.cpp 
test.cpp:5: Compiler Error: Cannot synthesize std::cout used inside of a component.
HLS Main Optimizer FAILED.