使用配置文件控制Vitis编译
简介
Vitis™统一软件平台采用配置文件的方式来控制编译器和链接器行为,这将取代赛灵思® OpenCL编译器(XOCC)中以往的命令行开关样式。使用配置文件的主要优势包括:
- 不易出错:旧的命令行开关样式导致命令较长,难以阅读和修改。如下例:
v++ -t hw --log_dir /f1/f2/log_dir --report_dir /f1/f2/report_dir --xp vivado_prop:run.impl_1.STEPS.ROUTE_DESIGN.TCL.POST=/f1/f2/f3/mypostroute.tcl --xp
param:compiler.userPostSysLinkTcl=/f1/f2/f3/f4/user_port_sys_link.tcl --nk
my_krnl:1:krnl_1 --sp krnl_1.m00_axi:bank0 --sp krnl_1.m01_axi:bank1 --sp
krnl_1.m02_axi:bank2 --sp krnl_1.m03_axi:bank3 --sp krnl_1.m04_axi:bank1 --sp
krnl_1.m05_axi:bank2 --sp krnl_1.m06_axi:bank0 --sp krnl_1.m07_axi:bank0 --sp
krnl_1.m08_axi:bank1 --sp krnl_1.m09_axi:bank2 --sp krnl_1.m10_axi:bank3
--profile_kernel data:my_krnl:all:m01_axi –debug --platform ./f1/f2/xilinx_u200_xdma_201920_1/xilinx_u200_xdma_201920_1.xpfm --kernel_frequency 0:300|1:350 -o my_design.xclbin ./my_krnl.xo
- 不同类型的选项可分组到不同的小节/文件中:Vitis工具提供诸多不同的选项,它们属于不同的类别。例如,其中一些用于控制Vitis编译器/链接器行为,一些用于控制Vivado® 工具流。为提高易用性,配置文件支持将类似类型的选项分组到一个小节甚至一个文件中。格式为:
[section name]
Option1=A
...
Option1=B
在一个配置文件中,我们可以有多个小节,如上所示。
- 使用多个配置文件可以利用makefile相关规则。修改一个配置文件中的选项不会导致所有内容重新编译。
- 按遇到开关的顺序读取开关。如果同一个开关重复出现冲突信息,则使用第一个开关读取。开关的优先顺序如下,其中第一项的优先级最高:
- 命令行开关。
- 从左到右的配置文件(在命令行上)。
- 在配置文件中,优先级从上到下。
尽管多次指定开关的用法屡见不鲜,但建议避免这种做法,因为这将产生更多的工作来确定哪个选项优先。而且,多次指定同一选项并不具备任何优势。
将当前命令行开关迁移到配置文件
如果您已有使用命令行样式选项的现有设计,您需要掌握如何将其转换为新的配置样式。有关这方面的信息,请见Vitis统一软件开发平台文档(UG1393)中的Vitis编译器配置文件。
下面总结了一些常用的选项,并重点介绍新旧命令行样式之间的比较。
布尔开关(任何小节)
设置为True或False的选项。通常用于启动特定的流程。
Purpose of Option |
Old |
New |
Select stage |
--link(or –l) |
link=1 |
Enable debug mode |
-g |
debug=1 |
通用开关(任何小节)
通常用于指定项目配置。
Purpose of Option |
Old |
New |
Select target platform |
--platform xxx |
platform=xxx |
Directory for logs |
--log_dir |
log_dir= |
Directory for reports |
--report_dir |
report_dir= |
Select compile target |
--target hw |
target=hw |
连接开关(小节名称:[连通性])
系统拓扑的选项,如存储器连接、计算单元设置等。
Purpose of Option |
Old |
New |
Number of CUs |
--nk foo:2:foo_1.foo_2 |
nk=foo:2:foo_1.foo_2 |
Specify memory connection |
--sp vadd_cu1.m_axi_gmem:HBM[0:3] |
sp=vadd_cu1.m_axi_gmem:HBM[0:3] |
Specify streaming connection between CUs |
--sc vadd_1.stream_out:vadd_2.stream_in |
stream_connect=vadd_1.stream_out:vadd_2.stream_in |
Assign CU to SLR |
--slr vadd_1:SLR0 |
slr=vadd_1:SLR0 |
HLS参数(小节名称:[hls])
用于配置HLS工具的选项。
Purpose of Option |
Old |
New |
Specify kernel frequency |
--kernel_frequency:250 |
clock= |
Generate separate AXI interface for each argument(only for OpenCL kernel) |
--max_memory_ports |
max_memory_ports=all|kernel_name |
Vivado属性和参数(小节名称:[Vivado])
用于配置Vivado工具的选项。
Purpose of Option |
Old |
New |
Vivado Properties |
--xp vivado_prop run.synth.STEPS.SYNTH_DESIGN.TCL.PRE=pre.tcl |
prop=run.synth.STEPS.SYNTH_DESIGN.TCL.PRE=pre.tcl |
Vivado Parameters |
--xp vivado_param:project.writeIntermediateCheckpoints=1 |
param=project.writeIntermediateCheckpoints=1 |
高级开关(小节名称:[高级])
控制流程的高级选项。
Purpose of Option |
Old |
New |
Misc |
--xp vivado_prop run.synth.STEPS.SYNTH_DESIGN.TCL.PRE=pre.tcl |
prop=run.synth.STEPS.SYNTH_DESIGN.TCL.PRE=pre.tcl |
Non-Vivado Properties |
--xp prop:kernel.krnl_vadd.kernel_flags= |
prop=kernel.krnl_vadd.kernel_flags= |
Non-Vivado Parameters |
--xp param:compiler.acceleratorBinaryContent=dcp |
param=compiler.acceleratorBinaryContent=dcp |
用例示例
在下面的小节中,我们将提供一些常见的用例来展示如何使用配置文件来实现它。
控制Vitis编译和链接
最常用的v++选项可能都与控制Vitis编译器和链接器有关。例如,您可能需要为您的内核设计创建多个计算单元(CU),并分配存储器连接。您可以创建connectivity.ini文件并将以下行添加到该文件中:
[connectivity]
nk=foo:3
sp=foo_1.m_axi_p0:DDR[0]
sp=foo_2.m_axi_p0:DDR[1]
sp=foo_3.m_axi_p0:DDR[2]
connectivity.ini文件需要在v++脚本中获取,如下所示。
v++ -l … --config connectivity.ini …
控制HLS和Vivado编译
有时,我们需要控制HLS参数和Vivado策略来提高性能。在这种情况下,我们可以创建一个配置文件来同时控制它们,也可以使用两个单独的文件。这里我们将使用两个文件演示: hls_config.ini and vivado_config.ini.
在 hls_config.ini中
, 我们希望过度约束HLS工具以获得更好的时序余裕。例如,内核目标频率为300MHz;我们可以将HLS目标频率增加到320MHz,如下所示:
[hls]
clock=320000000:foo
在 vivado_config.ini中,
我们可以对Vivado中的实现策略进行微调,以获得更好的实现效果,但这需要扎实的硬件设计经验。如果您对这些选项的结果没有信心,赛灵思不建议手动修改。例如,我们可以在vivado_config.ini中添加以下行:
[vivado]
prop=run.impl_1.STEPS.OPT_DESIGN.ARGS.DIRECTIVE=Explore
prop=run.impl_1.STEPS.PLACE_DESIGN.ARGS.DIRECTIVE=Explore
prop=run.impl_1.STEPS.PHYS_OPT_DESIGN.IS_ENABLED=true
prop=run.impl_1.STEPS.PHYS_OPT_DESIGN.ARGS.DIRECTIVE=AggressiveExplore
prop=run.impl_1.STEPS.ROUTE_DESIGN.ARGS.DIRECTIVE=Explore
prop=run.impl_1.STEPS.OPT_DESIGN.TCL.PRE=/preopt.tcl
您或许会注意到,该文件在opt_design阶段之前生成了一个Tcl文件。在这个Tcl文件中,您可以添加一些时序或布局约束,这有利于提高性能。
之后,这两个配置文件可以在v++脚本中一起生成:
v++ -l … --config vivado_config.ini –config hls_config.ini …
总结
Vitis工具提供了新的配置文件方法来替代传统的命令行开关样式。使用配置文件更有效且更不易出错。如果您将要创建新的设计,赛灵思建议您迁移到配置文件,因为旧样式将在未来版本中弃用。