通过命令行和TCL脚本运行Vitis HLS的完整指南
引言
在FPGA开发过程中,高效的工作流程对于提高生产力至关重要。Vitis HLS(High-Level Synthesis)作为Xilinx提供的高层次综合工具,允许开发者使用C/C++/SystemC编写代码并将其转换为硬件描述语言(HDL)。虽然Vitis HLS提供了图形用户界面(GUI),但通过命令行和TCL(Tool Command Language)脚本运行Vitis HLS可以大大提高开发效率,特别是对于复杂项目或需要频繁迭代的设计。本文将详细介绍如何使用命令行和TCL脚本运行Vitis HLS,并以一个实用的TCL脚本示例进行说明。
为什么使用命令行和TCL脚本?
在开始深入了解具体方法之前,让我们先明确为什么要使用命令行和TCL脚本而非图形界面:
- 自动化工作流程 - 创建批处理脚本,自动执行重复性任务,减少手动操作
- 版本控制友好 - TCL脚本可以方便地纳入版本控制系统,便于团队协作和历史追踪
- 可重现的结果 - 确保每次运行都执行相同的步骤,提高结果的一致性
- 服务器端运行 - 在无GUI环境的服务器上运行长时间的综合任务
- CI/CD集成 - 便于集成到持续集成/持续部署流程中,实现全自动化开发流程
- 批量处理 - 可以批量处理多个HLS项目或不同配置的同一项目
基本命令行操作
Vitis HLS提供了两种主要的命令行运行方式:
1. 直接使用vitis_hls命令
最基本的命令格式如下:
vitis_hls -f <tcl_script_file>
这个命令会启动Vitis HLS并执行指定的TCL脚本。例如:
vitis_hls -f run_hls.tcl
2. 在交互式TCL shell中运行
您也可以启动Vitis HLS的交互式TCL shell:
vitis_hls -i
然后在shell中输入TCL命令或执行脚本:
source run_hls.tcl
TCL脚本示例详解
让我们详细分析示例中的run_hls.tcl
脚本:
# ########################################################
# Create a solution
# Define technology and clock rate
set_part {xcvu9p-flga2104-2-i}
create_clock -period 5
# Set variable to select which steps to execute
set hls_exec 2
csim_design
if {$hls_exec == 1} {
# Run Synthesis and Exit
csynth_design
} elseif {$hls_exec == 2} {
# Run Synthesis, RTL Simulation and Exit
csynth_design
cosim_design
} elseif {$hls_exec == 3} {
# Run Synthesis, RTL Simulation, RTL implementation and Exit
csynth_design
cosim_design
export_design
} else {
# Default is to exit after setup
csynth_design
}
exit
脚本命令解析
-
设置目标器件:
set_part {xcvu9p-flga2104-2-i}
- 指定目标FPGA器件为Xilinx Virtex UltraScale+ FPGA (xcvu9p)
- 封装类型为FLGA2104
- 速度等级为2-i
-
时钟设置:
create_clock -period 5
- 设置设计的时钟周期为5ns,相当于200MHz的时钟频率
- 这是HLS工具进行调度和优化的重要参数
-
执行控制:
set hls_exec 2
- 定义一个变量来控制执行哪些设计步骤
- 不同的值对应不同的执行流程
-
C仿真:
csim_design
- 运行C/C++代码的功能仿真
- 验证算法的正确性,不考虑硬件实现
-
条件执行:
hls_exec = 1
: 仅运行高层综合hls_exec = 2
: 运行高层综合和RTL协同仿真hls_exec = 3
: 运行完整流程,包括导出RTL设计- 其他值:默认仅运行综合
-
退出:
exit
- 完成所有操作后退出Vitis HLS
通过命令行运行Vitis HLS
下面是使用命令行运行Vitis HLS的详细步骤:
-
准备环境:确保已正确安装Vitis HLS并配置环境变量。通常,Vitis安装过程会创建一个设置脚本,您可以通过运行该脚本来配置环境:
source /path/to/Vitis/settings64.sh # Linux call C:\Xilinx\Vitis\settings64.bat # Windows
-
进入项目目录:使用
cd
命令导航到您的项目目录,该目录应包含您的源代码和TCL脚本。 -
运行TCL脚本:使用以下命令运行Vitis HLS并执行TCL脚本:
vitis_hls -f run_hls.tcl
-
查看输出:Vitis HLS将在命令行中显示执行进度和结果。根据您的TCL脚本设置,它将执行C仿真、高层综合、RTL仿真和/或导出设计等步骤。
-
检查结果:执行完成后,您可以在项目目录中找到生成的文件和报告。
高级TCL脚本技巧
1. 参数化脚本
您可以使TCL脚本接受命令行参数,使其更加灵活:
# 从命令行接收参数
if { $argc >= 1 } {
set hls_exec [lindex $argv 0]
} else {
set hls_exec 2
}
# 从命令行接收时钟频率
if { $argc >= 2 } {
set clock_period [lindex $argv 1]
} else {
set clock_period 5
}
create_clock -period $clock_period
使用方式:
vitis_hls -f run_hls.tcl -tclargs 3 10
这会将hls_exec
设为3,clock_period
设为10ns。
2. 记录运行结果
# 打开日志文件
set logfile [open "hls_run.log" w]
# 运行综合并记录结果
puts $logfile "Starting synthesis at [clock format [clock seconds]]"
csynth_design
puts $logfile "Synthesis completed at [clock format [clock seconds]]"
# 提取关键性能指标
set latency [get_attribute [get_objects latency] TOTAL-WORST]
puts $logfile "Worst case latency: $latency cycles"
# 关闭日志
close $logfile
3. 批量处理多个配置
# 定义不同配置
set configs {
{xcvu9p-flga2104-2-i 5}
{xcvu9p-flga2104-2-i 10}
{xcu250-figd2104-2L-e 5}
}
# 遍历每个配置
foreach cfg $configs {
set part [lindex $cfg 0]
set period [lindex $cfg 1]
# 创建解决方案名称
set sol_name "solution_${part}_${period}ns"
# 打开新解决方案
open_solution $sol_name
# 设置参数
set_part $part
create_clock -period $period
# 运行综合
csynth_design
}
完整项目工作流示例
下面是一个从头开始创建和运行完整HLS项目的TCL脚本示例:
# 项目配置
set project_name "my_hls_project"
set top_function "my_algorithm"
set part_name "xcvu9p-flga2104-2-i"
set clock_period 5
# 源文件路径
set src_dir "./src"
set tb_dir "./testbench"
# 创建项目
open_project -reset $project_name
set_top $top_function
# 添加设计文件
add_files [glob $src_dir/*.cpp]
add_files -tb [glob $tb_dir/*.cpp]
# 创建解决方案
open_solution -reset "solution1"
set_part $part_name
create_clock -period $clock_period
# 设置HLS配置指令
set_directive_interface -mode s_axilite -bundle control "$top_function"
set_directive_pipeline "$top_function/main_loop"
# 执行C仿真
puts "Starting C simulation..."
csim_design -clean
puts "C simulation completed."
# 执行高层综合
puts "Starting High-Level Synthesis..."
csynth_design
puts "High-Level Synthesis completed."
# 收集性能指标
set latency [get_attribute [get_objects latency] TOTAL-WORST]
set interval [get_attribute [get_objects interval] TOTAL-WORST]
set resources [report_utilization -return_string]
puts "Performance metrics:"
puts " Latency: $latency cycles"
puts " Interval: $interval cycles"
puts "Resource utilization:"
puts $resources
# 运行RTL协同仿真
puts "Starting RTL co-simulation..."
cosim_design -trace_level all -rtl verilog
puts "RTL co-simulation completed."
# 导出RTL设计
puts "Exporting RTL design..."
export_design -format ip_catalog -display_name "My HLS IP" -description "Generated by Vitis HLS" -vendor "MyCompany" -version "1.0"
puts "RTL export completed."
exit
与开发工具集成
与Make系统集成
您可以创建一个Makefile来自动化Vitis HLS工作流:
# Makefile示例
VITIS_HLS = vitis_hls
HLS_SCRIPT = run_hls.tcl
.PHONY: hls clean
hls:
$(VITIS_HLS) -f $(HLS_SCRIPT)
clean:
rm -rf ./*.log
rm -rf ./solution*/syn
rm -rf ./solution*/impl
与Jenkins CI/CD集成
// Jenkinsfile示例
pipeline {
agent { label 'vitis-hls' }
stages {
stage('HLS Synthesis') {
steps {
sh 'vitis_hls -f run_hls.tcl'
}
}
stage('Collect Results') {
steps {
archiveArtifacts artifacts: 'solution*/syn/report/*.rpt', fingerprint: true
}
}
}
post {
always {
emailext body: '${BUILD_LOG}',
subject: 'HLS Build ${BUILD_STATUS}',
to: 'team@example.com'
}
}
}
常用TCL命令参考
以下是Vitis HLS中最常用的TCL命令:
项目管理
open_project <name>
- 打开或创建项目set_top <function>
- 设置顶层函数add_files <files>
- 添加设计文件add_files -tb <files>
- 添加测试台文件open_solution <name>
- 打开或创建解决方案close_project
- 关闭当前项目
设置和配置
set_part <part>
- 设置目标器件create_clock -period <ns>
- 设置时钟周期config_compile -name_max_length <num>
- 配置编译选项config_interface -m_axi_addr64
- 配置接口选项
指令
set_directive_interface <options>
- 设置接口类型set_directive_pipeline <label>
- 设置流水线set_directive_unroll <label>
- 展开循环set_directive_array_partition <options>
- 分割数组
运行设计阶段
csim_design
- 运行C仿真csynth_design
- 运行高层综合cosim_design
- 运行RTL协同仿真export_design
- 导出RTL设计
报告和分析
report_timing
- 生成时序报告report_utilization
- 生成资源使用报告get_report <type>
- 获取特定报告数据
最佳实践
- 模块化TCL脚本 - 将常用功能封装到单独的TCL文件中,便于重用
- 参数化配置 - 使用变量定义关键参数,便于调整
- 详细日志 - 记录每个步骤的执行情况和结果,便于调试
- 错误处理 - 添加错误检查和异常处理,提高脚本稳健性
- 版本控制 - 将TCL脚本纳入版本控制系统,便于团队协作
- 注释 - 为复杂操作添加详细注释,提高可读性
总结
通过命令行和TCL脚本运行Vitis HLS提供了强大的自动化能力和灵活性。对于需要频繁迭代或在CI/CD环境中工作的开发人员来说,这是一项必不可少的技能。本文介绍的示例脚本run_hls.tcl
展示了如何通过简单的TCL脚本控制HLS设计流程,从C仿真到RTL导出的每个步骤。
通过掌握这些技术,您可以:
- 自动化重复性工作
- 创建可重现的设计流程
- 在无GUI环境中运行HLS任务
- 集成到更大的开发流程中
- 批量处理多个配置和项目
无论您是初学者还是有经验的HLS用户,命令行和TCL脚本都能帮助您提高工作效率,更有效地管理复杂的HLS项目。
希望本文对您理解和使用Vitis HLS的命令行和TCL脚本功能有所帮助。如有任何问题或建议,欢迎在评论区留言交流!