You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:48:18