我的第一篇博客 ---- vivado hls ug902 ---- Vivado HLS简介 (1)

我的第一篇博客——Vivado HLS ug902文档 ------- Vivado HLS简介(1)

HLS

Vivado HLS能够将C、C++、SystemC语言描述的算法转换成RTL级电路,FPGA并行架构在性能、成本和功耗方面要优于传统的架构。

HLS的优点

HLS桥接起软件和硬件领域,具有以下优点:

  1. 提高硬件开发效率;
  2. 提高软件系统性能;

使用Vivado HLS能够:

  1. 在C语言上开发算法,在抽象级别上工作能够减小开发周期。
  2. 通过C语言验证算法,比传统的硬件描述语言更加快速。
  3. 通过优化指令控制C综合,建立特定的高性能的硬件实现。
  4. 通过优化方案能创建多个实现(solution),探索设计空间以寻找最佳实现。
  5. 创建具有可读性和可移植性的C源代码,能够在不同设备上实现。

高级综合基础

高级综合包括以下几个阶段:

  • 调度
    确定每个时钟周期内的操作:
    • 时钟周期或者时钟频率。
    • 操作完成所需要的时间,有目标设备决定。
    • 指定优化指令。
  • 绑定
    指定由哪些资源执行调度阶段所要完成的功能,为了找到最优解决方案,HLS需要知道目标设备的信息。
  • 控制逻辑提取
    提取控制逻辑建立有限状态机(FSM),控制RTL设计序列的操作。

高层次综合(HLS)综合C的代码如下:

  • 顶层模块参数综合成RTL级I/O口;
  • C函数综合成RTL的模块,如果C代码包含子函数的层次结构,那么最终的RTL设计包含模块或实体的层次结构,这些模块或实体与原始的C函数层次结构具有一对一的对应关系。函数的所有实例都使用相同的RTL实现或块;
  • C函数中循环默认不展开(roll),可以使用优化指令进行unroll、pipeline、dataflow;
  • 数组在C代码中最终会被综合RAM或UltraRAM。如果数组在顶层函数接口,高级综合会将会实现为访问外部RAM的设计。

要确定设计是否满足需求,可以在高级综合生成的综合报告中查看性能指标。在分析报告之后,可以使用优化指令来改进实现。综合报告包含关于以下性能指标的信息:

  • 范围(Area): 根据FPGA中可用的资源实现设计所需的硬件资源数量,包括查找表 (LUT)、寄存器、block ram和DSP48。
  • 延迟(Latency):函数计算所有输出值所需的时钟周期数。
  • 起始间隔( Initiation interval, II):函数接受新输入数据前的时钟周期数。
  • 循环迭代延迟(Loop iteration latency):完成循环的一次迭代所需的时钟周期数。
  • 循环启动间隔( Loop initiation interval):循环的下一个迭代开始处理数据之前的时钟周期数。
  • 循环延迟( Loop latency):执行循环所有迭代的循环数。

在高层次综合中,数组默认被综合成RAM,可以通过优化指令综合成FIFOs、存储器和寄存器等。当在顶级函数中使用数组作为参数时,高级综合假设块RAM位于顶级函数之外,并自动创建端口来访问设计之外的块RAM,例如数据端口、地址端口以及任何必需的芯片使能或写信号。

理解Vivado HLS

Xilinx Vivado HLS工具将C函数合成到一个IP块中,可以将该IP块集成到硬件系统中。它与Xilinx的其他设计工具紧密集成,并提供了全面的语言支持和特性,用于为您的C算法创建最佳实现。
以下是Vivado HLS设计流程:

  • 编译、执行(模拟)和调试C算法。
  • 将C算法合成为RTL实现,可以选择使用用户优化指令。
  • 生成全面的报告并分析设计。
  • 运行联合仿真,验证RTL实现。
  • 打包RTL实现为IP格式文件。

输入和输出

下面是Vivado HLS的输入:

  • C函数的编写采用C、C++或者SystemC
    这是Vivado HLS的主要输入。该函数可以包含子函数的层次结构。
  • 约束
    需要约束,包括时钟周期、时钟不确定性和FPGA目标。时钟不确定性默认为时钟周期的12.5%(如果没有指定)。
  • 指令
    指令是可选的,并指导合成过程实现特定的行为或优化。
  • C测试台和任何相关文件
    Vivado HLS使用C测试台模拟合成前的C函数,并使用C/RTL协仿真验证RTL输出。可以在命令提示符下使用Vivado HLS图形用户界面(GUI)或使用Tcl命令交互地将C输入文件、指令和约束添加到Vivado HLS项目中。还可以创建一个Tcl文件并以批处理模式执行命令。

下面是Vivado HLS的输出:

  • 硬件描述语言(HDL)格式的RTL实现文件。
    Vivado HLS将实现文件打包为IP块,以便与其他工具一起使用。
  • 报告文件
    该输出是综合、C/RTL联合仿真和IP打包的结果。

测试台、支持语言和C语言库

在任何C程序中,顶层函数都称为主函数(main())。在Vivado®HLS设计流中,可以将main()下面的任何子函数指定为用于综合的顶层函数。不能综合函数main()。以下是附加规则:

  • 只允许一个函数作为综合的顶层函数。
  • 任何在顶层函数下面的子函数也会被综合。
  • 如果想要综合不在顶层函数下的函数,则必须将这些函数放到到单个顶层函数中进行综合。

测试台

在使用Vivado HLS设计流时,要综合一个功能不正确的C函数,然后分析实现细节,以确定该函数为何不能按预期执行,这是非常耗时的。为了提高生产力,在合成之前,使用一个测试平台(test bench)来验证C函数在功能上是否正确。
C测试台包含main()函数和任何不在用于综合的顶级函数的层次结构中的子函数。这些函数通过向用于综合的函数激励并提供其预输出来验证用于合成的顶级函数在功能上是否正确。
Vivado HLS使用测试平台编译和执行C仿真。在编译过程中,您可以选择Launch Debugger选项来打开一个完整的C-debug环境,能够对C仿真进行分析。
因为Vivado HLS使用测试台在合成之前验证C函数,并自动验证RTL输出,所以强烈建议使用测试台(test bench为非必要条件)。

支持语言

Vivado HLS 下面标准的C编译/仿真:

  • ANSI-C (GCC 4.6)
  • C++ (G++ 4.6)
  • SystemC (IEEE 1666-2006, version 2.2)

C、C++和SystemC的语言结构

Vivado HLS支持许多C、c++和SystemC语言构造以及每种语言的所有本地数据类型,包括float和double类型。但是,有些结构不支持综合,包括:

  • 动态内存分配
    FPGA有固定的资源,动态创建和释放内存资源不支持。
  • 操作系统(OS)的操作
    所有进出FPGA的数据必须从输入端口读取或写入输出端口。不支持OS操作,如文件读/写或OS查询(如时间和日期)。相反,C测试台可以执行这些操作,并将数据作为函数参数传递到函数中进行综合。

C库

C库包含为在FPGA中实现而优化的函数和构造。使用这些库有助于确保高质量的结果(QoR),也就是说,最终的输出是优化资源使用的高性能设计。因为库是用C语言提供的,在c++或SystemC中,可以将库合并到C函数中,并在综合之前对它们进行仿真,以验证函数的正确性。
Vivado®HLS提供了以下C库来扩展标准C语言:

  • 任意精度数据类型(1 - 1024 bit)
  • 半精度(16位)浮点数据类型
  • 数学操作(Math)
  • Xilinx®IP函数,包括快速傅里叶变换(FFT)和有限脉冲响应(FIR)
  • FPGA资源功能,以帮助最大限度地利用移位寄存器LUT (SRL)资源

仅在函数边界上需要任意精度类型,因为Vivado HLS会优化内部逻辑,并删除不向输出端口扩展的数据位和逻辑。

综合、优化和分析

Vivado®HLS是基于项目的。每个项目包含一组C代码,并且可以包含多个解决方案。每个解决方案可以有不同的约束和优化指令。可以在Vivado HLS GUI中分析和比较每个解决方案的结果。
以下是Vivado HLS设计过程中的综合、优化和分析步骤:

  1. 创建具有初始解决方案的项目。
  2. 验证C仿真执行无误。
  3. 运行综合获得结果。
  4. 分析结果。

在分析结果之后,可以为具有不同约束和优化指令的项目创建一个新的解决方案,并综合新的解决方案。重复此过程,直到设计具有所需的性能特征。使用多个解决方案可以在继续开发的同时仍然保留以前的结果。

优化

使用Vivado®HLS,可以在设计中应用不同的优化指令,包括:

  • 指示任务在管道(pipeline)中执行,允许任务的下一次执行在当前执行完成之前开始。
  • 指定函数、循环和区域完成的延迟。
  • 指定使用资源数量的限制。
  • 覆盖代码中固有的或隐含的依赖关系,并允许指定的操作。
  • 选择I/O协议,确保最终设计可以连接到其他具有相同I/O协议的硬件块。

Vivado HLS自动确定任何子函数使用的I/O协议。不能控制这些端口,除非指定端口已注册。
可以使用Vivado HLS GUI将优化指令直接放到源代码中。或者,可以使用Tcl命令来应用优化指令。

分析

当综合完成时,Vivado HLS自动创建合成报告,以帮助了解实现的性能。在Vivado HLS GUI中,Analysis透视图包含Performance选项卡,它允许您交互地详细分析结果。

RTL验证

如果你添加了一个C test bench项目,可以使用它来验证RTL功能相同的C函数。 C试验台验证综合和顶层的输出函数,如果RTL功能是相同的返回0到顶层函数main()。Vivado HLS在C模拟和C/RTL联合模拟中都使用这个返回值来确定结果是否正确。如果C测试台返回一个非零值,Vivado HLS报告模拟失败。
注意:如果测试工作台没有将值0返回给函数main(),即使输出数据正确有效,Vivado HLS也会报告仿真失败。
提示:Vivado HLS自动创建执行C/RTL联合仿真设施,并使用以下受支持的RTL模拟器之一自动执行仿真:

  • Vivado Simulator (XSim)
  • ModelSim simulator
  • VCS
  • NCSim
  • Riviera
  • Xcelium

如果选择Verilog或VHDL HDL进行仿真,Vivado HLS将使用您指定的HDL模拟器。Xilinx设计工具包括Vivado模拟器。第三方HDL模拟器需要来自第三方供应商的许可证。VCS和NCSim模拟器仅在Linux操作系统上受支持。

RTL导出

使用Vivado HLS,可以导出RTL,并将最终的RTL输出文件打包成以下任何一种Xilinx IP格式的IP:

  • Vivado IP Catalog
    导入到Vivado IP目录,以便在Vivado设计套件中使用。
  • System Generator for DSP
    将HLS设计导入系统生成器。
  • Synthesized Checkpoint (.dcp)
    像导入任何Vivado设计套件检查点一样,直接导入Vivado设计套件。

注意:综合检查点格式调用逻辑综合并将RTL实现编译为gate级实现,后者包含在IP包中。
对于除综合检查点之外的所有IP格式,可以选择在Vivado HLS中执行逻辑综合,以评估RTL综合或实现的结果。这个可选步骤允许您在交付IP包之前确认Vivado HLS提供的时间和区域估计。这些门级结果不包括在打包的IP中。
注意:Vivado HLS基于每个FPGA的内置库估计时间和区域资源。当你使用逻辑综合将RTL编译成门级实现、在FPGA中执行门的物理位置以及门之间互连的路由时,逻辑综合可能会进行额外的优化,从而更改Vivado HLS估计。

你可能感兴趣的:(vivado,hls,FPGA,Xilinx)