Vivado TCL脚本如何捕获实现运行错误并做对应处理
Vivado TCL 多实现任务错误捕获方案
Vivado TCL 内置run状态查询、流程控制命令,不需要额外工具即可实现失败检测、自动重试、异常流程阻断,避免无效的下游报错。
核心实现逻辑
- 所有任务启动后必须通过
wait_on_runs阻塞等待全部任务执行结束,再做状态校验 - 任务执行完成后,通过
get_property STATUS <任务名>读取运行状态:正常结束的任务状态值包含Complete!关键字,失败任务会返回带Failed、ERROR的状态值 - 对检测到失败的任务,可配置最大重试次数,重试前调用
reset_run清空失败的运行缓存后重新启动,解决内存不足、工具偶发bug导致的随机失败 - 所有重试流程结束后再次统计失败任务,若仍有未通过的任务,直接跳过比特流生成、硬件导出步骤,打印明确错误信息后退出,避免触发找不到比特流的衍生报错
- 可搭配TCL原生
catch命令捕获单条命令的执行异常,避免单个任务崩溃直接终止整个脚本运行
完整可复用脚本
# 基础运行参数配置 set synth_run_name "synth_1" set impl_run_list [list "impl_1" "impl_2" "impl_3" "impl_4" "impl_5" "impl_6"] set max_retry_times 2 set parallel_jobs 16 # 综合流程执行与校验 reset_run $synth_run_name launch_runs $synth_run_name -jobs $parallel_jobs wait_on_runs $synth_run_name set synth_status [get_property STATUS $synth_run_name] if {![string match "*Complete!*" $synth_status]} { puts "ERROR: 综合任务执行失败,当前状态:$synth_status,终止全流程" exit 1 } puts "INFO: 综合流程执行完成" # 批量启动所有实现任务 foreach impl_run $impl_run_list { reset_run $impl_run launch_runs $impl_run -jobs $parallel_jobs } wait_on_runs $impl_run_list # 失败检测与自动重试 set current_retry 0 set remaining_failed [list] while {$current_retry <= $max_retry_times} { set remaining_failed [list] # 逐个校验实现任务状态 foreach impl_run $impl_run_list { set run_status [get_property STATUS $impl_run] if {![string match "*Complete!*" $run_status]} { lappend remaining_failed $impl_run puts "WARN: 实现任务$impl_run运行异常,当前状态:$run_status" } } # 无失败任务直接退出重试循环 if {[llength $remaining_failed] == 0} { break } # 达到最大重试次数不再重试 if {$current_retry == $max_retry_times} { puts "ERROR: 已达到最大重试次数$max_retry_times,仍存在失败任务:$remaining_failed" break } # 执行重试 puts "INFO: 启动第[expr {$current_retry + 1}]轮重试,重试任务列表:$remaining_failed" foreach impl_run $remaining_failed { # 加-clean参数可彻底清空运行缓存,解决缓存损坏导致的重复失败 reset_run $impl_run -clean launch_runs $impl_run -jobs $parallel_jobs } wait_on_runs $remaining_failed incr current_retry } # 后续流程分支判断 if {[llength $remaining_failed] == 0} { puts "INFO: 所有实现任务执行成功,开始执行比特流生成、硬件导出操作" # 在此处插入原有比特流生成、硬件导出的业务逻辑 # 示例: # foreach impl_run $impl_run_list { # launch_runs $impl_run -to_step write_bitstream -jobs $parallel_jobs # } # wait_on_runs $impl_run_list # write_hw_platform -fixed -include_bit -force -file ./output/design.xsa } else { puts "ERROR: 存在未通过的实现任务,跳过比特流生成与硬件导出步骤,避免触发文件不存在类衍生报错" exit 1 }
实用优化提示
- 内存不足导致的随机失败,除了自动重试,可适当调低
parallel_jobs的并行数,减少同时运行的任务数量,降低内存峰值占用 - 针对Vivado版本偶发的缓存损坏问题,重试时的
reset_run加-clean参数可大幅提升重试成功率 - 需要排查具体失败原因时,可在检测到任务失败后,自动打印对应任务的
run.log存储路径,或直接调用read_log [get_property RUN_LOG $impl_run]输出关键报错信息
内容的提问来源于stack exchange,提问作者Fra93
相关产品推荐
相关产品推荐

