ug902 ---- Creating a New Solution(3)

Creating a New Solution

Vivado HLS最典型的用法是创建初始设计,然后执行优化以满足所需的资源和性能目标。解决方案提供了一种方便的方法,以确保早期综合运行的结果可以被保存和比较。

新解决方案向导具有与New Project向导中的最终窗口相同的选项,另外还有一个附加选项,允许将应用于现有解决方案的任何指令和相关约束方便地复制到新解决方案中,在新解决方案中可以修改或删除它们。

创建新解决方案之后,可以添加优化指令(如果是从以前的解决方案复制的,则可以修改它们)。下一节将解释如何将指令添加到解决方案中。使用配置选项应用自定义约束,并在优化设计时进行讨论。

Applying Optimization Directives

添加优化指令的第一步是打开信息窗口中的源代码。展开位于资源管理器窗格顶部的源容器,双击源文件以打开它,以便在信息窗格中进行编辑。如下图所示:
ug902 ---- Creating a New Solution(3)_第1张图片
在Information pane中激活源代码后,选择“显示和修改文件的指令右侧的Directives选项卡。directive选项卡包含当前开放源代码中可以应用指令的所有对象和范围。
注意:要将指令应用于其他C文件中的对象,必须打开该文件并使其在Information窗格中处于活动状态。

虽然可以在Vivado HLS GUI中选择对象并应用指令,但Vivado HLS将所有指令应用于包含该对象的范围。例如,您可以将接口指令应用于Vivado HLS GUI中的接口对象。Vivado HLS将指令应用于顶层函数(作用域),并在指令中标识接口端口(对象)。在下面的示例中,函数foo上的data_in端口被指定为一个AXI4-Lite接口。
在这里插入图片描述
可以将优化指令应用于以下对象和范围:

  • Interfaces
    当将指令应用于接口时,Vivado HLS将指令应用于顶级函数,因为顶级函数是包含接口的范围。
  • Functions
    当将指令应用于函数时,Vivado HLS将该指令应用于函数范围内的所有对象。任何指令的作用在函数层次结构的下一层停止。唯一的例外是需要递归选项的指令,例如递归展开层次结构中的所有循环的PIPELINE指令。
  • Loops
    当您将指令应用于循环时,Vivado HLS将指令应用于循环范围内的所有对象。例如,如果将LOOP_MERGE指令应用于循环,Vivado HLS将该指令应用于循环中的任何子循环,但不应用于循环本身。
  • Arrays
    当您将指令应用于数组时,Vivado HLS将该指令应用于包含该数组的范围。
  • Regions
    当您将指令应用于区域时,Vivado HLS将该指令应用于该区域的整个范围。区域是用两个括号括起来的任何区域。例如
    在这里插入图片描述
    注意:可以将指令应用于一个区域,就像将指令应用于函数和循环一样。

Using Tcl Commands or Embedded Pragmas

在Vivado HLS Directive Editor对话框中,可以指定以下任一目标设置:

  • Directive File: Vivado HLS将指令作为Tcl命令插入到文件指令中。解决方案目录中的tcl。
  • Source File:Vivado HLS将指令作为pragma直接插入到C源文件中。
    下表描述了两种方法的优缺点。
    ug902 ---- Creating a New Solution(3)_第2张图片
    ug902 ---- Creating a New Solution(3)_第3张图片
    在为pragma参数指定值时,可以使用文字值(例如,1、55、3.14),或者使用#define传递宏。下面的示例显示了一个带有文字值的pragma
    在这里插入图片描述
    这个例子使用了定义的宏:
    在这里插入图片描述
    注意:不要使用声明的常量为pragmas指定值,因为它们不被支持。

Pragma Validation

在C综合期间,该工具对variables, functions, and loops验证pragmas。这个验证还包括pragma是否冲突。
例如,在声明数组时,默认情况下它被映射到block RAM。您可以对数组进行分区或重新构造,但这些都是相互排斥的选项。如果在同一个变量上错误地指定数组分区和重新塑造,工具就会出错,合成将失败,并显示以下消息
ug902 ---- Creating a New Solution(3)_第4张图片
下图显示了添加到指令文件中的DATAFLOW指令。指令。tcl文件位于“解决方案约束”文件夹中,并使用生成的tcl命令在“信息”窗格中打开。
ug902 ---- Creating a New Solution(3)_第5张图片
当指令作为Tcl命令应用时,Tcl命令指定该范围或该范围内的范围和对象。对于循环和区域,Tcl命令要求标记这些范围。如果循环或区域当前没有标签,则弹出对话框请求标签。
下面展示了标记和未标记循环和区域的示例。
ug902 ---- Creating a New Solution(3)_第6张图片
ug902 ---- Creating a New Solution(3)_第7张图片
提示:命名循环使综合报告易于阅读。自动生成标签被分配给没有标签的循环。

下图显示了添加到源文件中的DATAFLOW指令以及在information窗格中打开的结果源代码。源代码现在包含一个pragma,它指定了优化指令。
ug902 ---- Creating a New Solution(3)_第8张图片
在这两种情况下,都会应用指令,并在执行综合时执行优化。如果修改了代码,通过插入标签或pragma,会弹出一个对话框,提醒您在合成之前保存代码。

Applying Optimization Directives to Global Variables

指令只能应用于范围内的范围或对象。因此,它们不能直接应用于任何函数范围之外声明的全局变量。

要将指令应用于全局变量,请将该指令应用于使用全局变量的范围(函数、循环或区域)。在使用变量的范围上打开directive选项卡,应用指令并在directive Editor中手动输入变量名。

Applying Optimization Directives to Class Objects

优化指令也可以应用于类中定义的对象或范围。不同之处在于,类通常是在头文件中定义的。使用以下操作之一打开头文件

  • 从Explorer pane中,打开Includes文件夹,导航到头文件,并双击该文件以打开它。
  • 在C源代码中,将光标放在头文件上(#include语句),按下Ctrl键打开并单击头文件。

然后用头文件中的对象填充instructions选项卡,可以应用指令。

注意!当将指令作为pragmas应用于头文件时,应该小心。该文件可能被其他人使用或用于其他项目。每次在设计中包含头文件时,都会应用作为pragma添加的任何指令。

Applying Optimization Directives to Templates

要在使用Tcl命令时手动对模板应用优化指令,请在引用类方法时指定模板参数和类。例如,给定以下c++代码
在这里插入图片描述
使用下面的Tcl命令指定函数的 INLINE指令:
在这里插入图片描述

Using #Define with Pragma Directives

Pragma指令本身不支持使用define语句指定的值。下面的代码试图使用define语句指定流的深度,但无法编译。
提示:使用显式值指定depth参数。
ug902 ---- Creating a New Solution(3)_第9张图片

如果不需要#define,可以使用常量,例如const int
在这里插入图片描述
可以在C代码中使用宏来实现此功能。使用宏的关键是在宏中使用层次结构。这允许正确地执行扩展。代码可按以下步骤编译:
ug902 ---- Creating a New Solution(3)_第10张图片

Failure to Satisfy Optimization Directives

当应用优化指令时,Vivado HLS将信息输出到控制台(和日志文件),其中详细描述了过程。在下面的示例中,Pipeline指令应用于II=1(迭代间隔为1)的C函数,但是综合不能满足这个目标。
ug902 ---- Creating a New Solution(3)_第11张图片
注意!如果Vivado HLS不能满足优化指令,它会自动放松优化目标,并寻求创建一个性能目标较低的设计。如果它不能找到该目标,它将报错停止。

通过寻求创建满足较低优化目标的设计,Vivado HLS能够提供三种重要类型的信息:

  • 使用当前的C代码和优化指令可以实现哪些目标性能。
  • 未能满足更高性能目标的原因列表。
  • 一个可以分析的设计,以提供更多的洞察力和帮助理解失败的原因。

在message SCHED-69中,未能到达目标II的原因是端口有限。设计必须访问一个块RAM,而一个块RAM最多只有两个端口。

这样的失败之后,下一步就是分析问题所在。在本例中,分析代码的第52行并/或使用Analysis透视图确定瓶颈,以及是否可以减少对两个以上端口的需求,或者确定如何增加端口的数量。

通过优化设计,达到了预期的性能,验证了RTL的正确性,并将合成结果封装为IP。

Verifying the RTL is Correct

使用C/RTL cosimulation工具栏按钮或菜单 Solution > Run C/RTL cosimulation验证RTL结果。

验证完成后,控制台显示消息SIM-1000以确认验证成功。C测试台中任何printf命令的结果都会被回显到控制台。

在这里插入图片描述

仿真报告在信息窗格中自动打开,显示通过或失败状态以及延迟和II的测量数据。

重要!只有当C测试台返回0值时,C/RTL联合模拟才会通过。协同仿真在测试台上测试场景,如果返回True或0,则通过。如果失败,则返回False或1。

Reviewing the Output of C/RTL Co-Simulation

当RTL验证完成时,将在解决方案文件夹中创建一个sim目录。下图显示了创建的子文件夹。

  • 报告文件夹包含仿真的每种RTL类型的报告和日志文件。
  • 为每种验证的RTL类型创建一个验证文件夹。验证文件夹名为verilog或vhdl。如果没有验证RTL格式,则不会创建文件夹。
  • 用于仿真的RTL文件存储在验证文件夹中。
  • RTL仿真在验证文件夹中执行。
  • 任何输出,例如跟踪文件,都被写入验证文件夹。
  • 文件夹autowrap、tv、wrap和wrap_pc是Vivado HLS使用的工作文件夹。这些文件夹中没有用户文件。

如果在C/RTL联合仿真对话框中选择了Setup Only选项,则会在验证文件夹中创建可执行文件,但不会运行仿真。通过在命令提示符处执行模拟可执行文件,可以手动运行仿真。
ug902 ---- Creating a New Solution(3)_第12张图片

Packaging the IP

Vivado HLS设计流中的最后一步是将RTL输出打包为IP。使用Export RTL工具栏按钮或菜单Solution > Export RTL打开Export RTL对话框,如图所示。
ug902 ---- Creating a New Solution(3)_第13张图片

Reviewing the Output of IP Packaging

当 Export RTL过程完成时,将在解决方案文件夹中创建文件夹impl
ug902 ---- Creating a New Solution(3)_第14张图片

在所有情况下,输出包括:

  • 该报告文件夹。如果选择了flow选项,Verilog和VHDL综合或实现的报告将放在此文件夹中。
  • verilog文件夹。它包含Verilog格式的RTL输出文件。如果选择了flow选项,则在此文件夹中执行RTL综合或实现。
  • 硬件描述语言(vhdl)文件夹中。它包含VHDL格式的RTL输出文件。如果选择了flow选项,则在此文件夹中执行RTL综合或实现。

重要!Xilinx不建议将verilog或vhdl文件夹中的文件直接用于您自己的RTL合成项目。相反,Xilinx建议使用下面讨论的打包的IP输出文件。

在Vivado HLS在设计中使用Xilinx IP的情况下,例如使用浮点设计,RTL目录包含一个脚本,用于在RTL合成期间创建IP。如果将verilog或vhdl文件夹中的文件复制出来并用于RTL合成,则您有责任正确使用这些文件夹中出现的任何脚本文件。如果使用包IP,则此过程由design Xilinx工具自动执行。

Format Selection下拉框确定创建了哪些其他文件夹。提供了以下格式:IP Catalog, System Generator for DSP, and Synthesized Checkpoint (.dcp)。

Archiving the Project

要将Vivado HLS项目存档为行业标准ZIP文件,请选择file > archive。使用Archive Name选项为指定的ZIP文件命名。您可以按照以下方式修改默认设置

  • 默认情况下,只归档当前活动解决方案。要确保所有解决方案都已存档,请取消Active Solution Only 选项
  • 默认情况下,存档包含存档解决方案的所有输出结果。如果只想存档输入文件,请取消选择Include Run Results选项。

Using the Command Prompt and Tcl Interface

在Windows上,Vivado HLS命令提示符可以从“开始”菜单中调用Xilinx
Design Tools → Vivado 2018.x → Vivado HLS → Vivado HLS 2018.x Command Prompt.

在Windows和Linux上,使用vivado_hls命令中的-i选项可以在交互模式下打开Vivado HLS。然后Vivado HLS等待输入Tcl命令。
在这里插入图片描述
默认情况下,Vivado HLS在当前目录中创建一个vivado_hls.log文件。要为日志文件指定不同的名称,可以使用-1 选项。
help命令用于访问关于这些命令的文档。所有命令的完整列表提供使用:
在这里插入图片描述
使用命令名可以对任何单个命令提供帮助。
在这里插入图片描述
任何命令或命令选项都可以使用自动完成功能来完成。在指定了单个字符之后,按tab键会导致Vivado HLS列出完成命令或命令选项的可能选项。输入更多字符可以改进对可能选项的筛选。例如,在键入open之后按tab键列出以open开头的所有命令。
在这里插入图片描述
在键入open_p自动完成open_project命令后选择Tab键,因为没有其他可能的选项。

键入exit命令退出交互模式并返回到shell提示符
在这里插入图片描述

Vivado HLS的其他选项包括:

  • vivado_hls -p: 打开指定的项目.
  • vivado_hls -nosplash: 在没有Vivado HLS启动屏幕的情况下打开GUI
  • vivado_hls -r:返回安装根目录的路径
  • vivado_hls -s:返回系统类型(例如:Linux, Win)
  • vivado_hls -v:返回发布版本号。

嵌入到Tcl脚本中的命令以批处理模式执行,使用-f 选项。
在这里插入图片描述
在GUI中创建项目的所有Tcl命令都存储在脚本中。解决方案中的tcl文件。如果希望开发Tcl批处理脚本,请使用该脚本。tcl文件是一个理想的起点。

Understanding the Windows Command Prompt

在Windows操作系统上,Vivado HLS命令提示符是使用最简单的GNU for Windows (minGW)环境实现的,该环境允许使用标准的Windows DOS命令和/或Linux命令的子集。
下图显示了Linux ls命令和DOS dir命令都用于列出目录的内容。
请注意,并非所有Linux命令和行为都支持minGW环境。下面是一些已知的支持方面的共同差异.

  • 不支持Linux which命令。
  • Makefile中的Linux路径扩展为minGW路径。在所有Makefile文件中,将任何Linux风格的路径名赋值(如FOO:=:/)替换为引用路径名的版本(如FOO:=:/),以防止任何路径替换

Improving Runtime and Capacity

Vivado HLS分级调度操作。循环中的操作被调度,然后循环、子函数和带有函数的操作被调度。当下面情况,Vivado HLS的运行时间将增加:

  • 有更多的对象要调度。
  • 有更多的自由和更多的可能性去探索。

Vivado HLS调度对象。无论对象是浮点乘法操作还是单寄存器,它仍然是一个要调度的对象。浮点乘法可能需要多个周期来完成并使用许多资源来实现,但是在调度级别上它仍然是一个对象。

你可能感兴趣的:(ug902 ---- Creating a New Solution(3))