Vivado 运行卡死/超时速查:综合实现停住不动怎么办
更新时间:2026-10-22。FAQ 速查页,属于 FPGA 工具报错排错系列。Vivado 最磨人的故障不是直接红掉,而是「不退出也不出结果」:
synth_design停在某一行几个小时,GUI 鼠标一直转圈,CI 的 batch 作业跑到超时被系统杀掉。本篇分诊运行期卡死与跑批超时。启动期直接报 license 错退出的那类问题见 Vivado license 取不出来怎么办,进程直接闪退、退出码 139/137 的见 Vivado 段错误崩溃速查。
本文要回答的问题
- 综合或实现停了几个小时,怎么先分清是正常地慢、在排队,还是真的挂死?
- batch 模式没有界面,为什么 license 被占满时作业会不声不响地一直等?
ps看到进程状态是D、CPU 是 0%,各自指向哪类根因?- 工程放在网盘/NFS 上、上次崩溃残留锁、Tcl 脚本里有
gets,分别会怎么卡? - CI 里 Vivado 作业固定跑满时长被杀,除了加超时还能做什么?
一、现象与报错原文
Vivado 卡死时现场通常只剩三样东西:vivado.log 的尾行与最后时间戳、进程状态、CPU 占用。以下为四类典型形态,工程名与服务器均占位。
1. 日志停在某一步不再推进,GUI Tcl Console 只剩转圈,batch 作业的 stdout 也不再增长:
Starting 'synth_design'
-----------------------------------------------------------------
[<时间戳>] Running synth_design ...
<- 几小时没有下一行,也没有报错注意这不一定是故障:大设计 route_design 本身就可能跑数小时。判断标准是「尾行时间戳是否推进」加「CPU 是否在跑」,而不是「我觉得它该跑完了」。
2. license 等待。floating license 席位被占满时,GUI 会弹 Unable to checkout license 类提示等人处理;batch 模式下则可能表现为长时间无输出地排队等待,而不是立刻报错失败:
[Vivado 12-3632] Unable to checkout a license for <feature>.环境变量(如指向 2100@<server> 的 license 路径设置)只决定去哪里找 license;席位占满时的排队与超时行为以你本机版本的 Vivado Licensing 指南为准,不要凭印象设变量名。
3. CI 作业固定时长后被杀,日志最后一行停在任意正常阶段,没有任何 Vivado 报错——作业往往是被外部超时机制发信号终止的,和工具自身崩溃是两回事(退出码区分见崩溃速查篇)。
4. 写盘阶段卡住或报错,write_bitstream、write_checkpoint 长时间不返回,日志或系统消息里可能出现 No space left on device,即磁盘已满。
二、现象 → 区分点 → 处置速查表
| 现象 | 区分点 / 最常见原因 | 处置 |
|---|---|---|
| CPU 0%,日志尾行与 license 有关 | floating 席位被占满,batch 默认排队等 | 错峰跑;按本版本 Licensing 指南设 license queue 超时,让它快速失败而不是干等 |
CPU 0%,进程 STAT 为 D | 不可中断睡眠,典型是 NFS/网盘 IO 抖动 | 工程目录与 IP 输出挪本地 SSD 对照,网盘只做归档 |
CPU 0%,wchan 为 n_tty_read/pipe_wait | Tcl 的 gets/确认提示在等 stdin,或管道下游不读 | batch 命令一律 </dev/null,脚本去掉交互提问 |
| 低 CPU,提示锁相关或开工程即卡 | 上次崩溃残留 .Xil、runs 锁、.write.lock | 确认无活进程后清锁文件/锁目录再重开 |
卡在 write_bitstream/写 checkpoint | 磁盘满,或输出在慢盘上 | 清盘、换本地盘;比特流与 DCP 不要直接写网盘 |
| CPU 高、日志时间戳持续推进 | 只是正常长跑(大设计 route 数小时不稀奇) | 按历史耗时设容忍区间,继续等 |
| 某线程 100% 单核但长时间零推进 | IP 综合/Block Design 生成、xsim 编译子进程异常 | 看子进程状态,杀掉异常子进程后重新生成 IP |
| Windows 上整体时快时慢、磁盘灯常亮 | 杀毒软件实时扫描大 DCP/比特流文件 | 把工程目录加入实时扫描排除列表 |
三、排查决策树
分诊只问两个问题:日志尾行的时间戳还在不在推进,CPU 到底在不在跑。答案把现场切成「在计算」和「在等待」两条通道:
读这张图抓住一条分叉:CPU 高位且日志在推进,走绿色通道,它在算,杀掉重来只会浪费已跑完的几个小时;CPU 为 0 或 STAT 为 D,走红色等待通道,嫌疑只有四个——license 席位、IO/磁盘、锁文件、标准输入。 红色是入口现象与等待类根因,蓝色是排查动作,绿色表示「其实在干活/已收口」,橙色是命中根因后的修复。不要一卡就杀进程,排队两小时即将拿到席位的作业和死等 stdin 的作业,杀之前必须分开。
四、逐条排查展开
先取证,再动手。 线程级 CPU 与进程状态一条命令看清:
ps -o pid,stat,%cpu,rss,wchan:24,etime,cmd -p <pid>
top -H -p <pid> # 线程视角:有线程 100% 在跑 = 在算;全 0 = 在等STAT 为 D 是内核态不可中断睡眠,九成在等 IO,工程在 NFS/网盘上时基本石锤;wchan 为 n_tty_read 是等键盘输入,为 pipe_wait 多是等下游管道。Linux 上还可用 strace -p <pid>、macOS 用 dtruss、Windows 用 Process Monitor 看它最后卡在哪个文件或网络调用上。
license 等待:让它快速失败,而不是干等。 先用 lmstat -a -c 2100@<server> 看该 feature 席位是否 issued 等于 total,是则确属排队。GUI 弹窗有人点按钮还好,batch 作业无人值守,可能一直等到 CI 超时。做法是查你本机版本 Vivado Licensing 指南里关于 license queue 超时的设置,给排队行为加上限;同时错峰调度、找管理员回收崩溃残留的僵尸席位。license 链路本身的排错见 Vivado license 取不出来怎么办。
慢盘与锁:工程目录必须在本地盘。 Vivado 运行期要反复读写大量中间文件,工程放在 NFS、网盘同步目录上时,存储一抖就表现为 STAT D 的假死,把整个工程(含 IP 输出目录)复制到本地 SSD 重跑即可立判。上次异常退出还可能残留 .Xil、runs 下的锁文件和 .write.lock,确认没有活着的 Vivado 进程后删掉再开工程。磁盘满则在写 DCP/比特流阶段卡死,查剩余空间、清盘再跑。
交互提示是 batch 作业的隐形杀手。 人在 GUI 前点一下「确认覆盖」就过去的提问,在 -mode batch 下没有 tty 应答,脚本里的 gets 会永远阻塞,表现为进程 0% CPU、日志停在提问前一行。纪律是脚本不写任何需要键盘的分支,提交命令显式重定向标准输入:
cd /proj/demo && timeout 6h vivado -mode batch -source run.tcl \
</dev/null > run.out 2>&1launch_simulation 挂住时同理先查 xsim 编译子进程(xvlog/xelab)是否在等输入或卡在编译,而不是主进程本身的问题。
把「卡死」改造成「带现场的超时失败」。 CI 里给综合、实现分别设超时(大设计 route_design 的超时要按本工程历史耗时给足,时序收敛本身耗时见 Vivado 时序不收敛怎么办),脚本内分段打毫秒级时间戳,哪一段超时一看尾行即知:
proc stage_log {msg} {
puts [format "\[%s\] %s" [clock milliseconds] $msg]
}
stage_log "enter synth_design"
synth_design -top demo_top
stage_log "leave synth_design"真正挂起时先保留 vivado.log、vivado.jou 和进程状态快照再杀进程,这些是事后区分「慢、排队、死锁」的唯一凭据;资源利用率过高导致的超长布线属于「该优化设计」而非「工具挂了」,见 Vivado LUT 利用率超限速查。
五、预防与纪律
- 工程近节点:工程目录、IP 仓库与输出一律放本地 SSD,网盘/NFS 只归档,不从网络盘直接跑实现。
- 跑批无交互:batch 命令固定
</dev/null+ 日志重定向,Tcl 脚本不出现gets和确认分支。 - license 超时化:给排队等待加上限,排队问题在 CI 上表现为快速失败而不是占着作业槽干等。
- 超时与分段日志成对出现:synth/impl 分级超时,阶段间打时间戳;Windows 节点把工程目录加入杀毒排除列表。
- 异常退出后先清锁再重开,并保留挂起现场的日志与进程证据。
这一篇在知识体系里的位置
本篇是 FPGA 排错速查簇中「运行期卡死」节点的 FAQ 页:启动期 license 直接报错见 Vivado license 取不出来怎么办,进程闪退/退出码 139/137 见 Vivado 段错误崩溃速查,资源撑爆导致的长耗时见 Vivado LUT 利用率超限速查,布线阶段本身的耗时与收敛见 Vivado 时序不收敛怎么办。
一句话总结
Vivado 运行卡死/超时的分诊起点是 vivado.log 尾行时间戳加 CPU 占用:CPU 高且日志推进就是正常长跑,继续等;CPU 0% 或 STAT 为 D 走等待通道,用 lmstat、ps 的 wchan、锁文件与磁盘状态在 license 排队、NFS 慢盘、残留锁、交互输入四者间对号入座,根治靠工程放本地盘、batch 重定向 stdin、清锁、license 排队超时化,CI 侧用分级超时配分段毫秒时间戳日志,把无期限卡死改造成带现场的快速失败。