Vivado 连接 hw_server 失败速查:connection refused 与找不到线缆怎么办
更新时间:2026-10-23。FAQ 速查页,属于 FPGA 工具报错排错系列。Vivado 下载比特流前的最后一道坎是 Hardware Manager 连不上器件:
connect_hw_server直接报 connection refused,或者连上了服务器却open_hw_target找不到任何线缆。这类故障的嫌疑面其实很窄——hw_server 进程、端口与防火墙、远程主机连通性、线缆驱动、USB 权限、线缆占用、硬件供电,一共六条轴,按顺序排除基本十分钟内收口。工具运行期卡死类的故障见 Vivado 运行卡死/超时速查。
本文要回答的问题
connect_hw_server报 connection refused,第一刀切在进程、端口还是防火墙?- 连本机
localhost:3121能成、连远程主机就不行,差别出在哪? - hw_server 连上了但
open_hw_target列表是空的,驱动、权限、占用怎么区分? - Linux 下线缆插着却看不见,udev 规则到底改了什么?
- 线缆被另一个 hw_server 实例占住,怎么查出来并释放?
一、现象与报错原文
Vivado 连接 hw_server 失败在 Tcl Console 里主要有三种典型形态,服务器与主机名均占位。
1. 服务器根本没起来或端口不通,connect_hw_server 直接拒绝:
connect_hw_server -url <host>:3121
ERROR: [Labtools 27-2269] No devices detected on target localhost:3121/xilinx_tcf/<...>
# 或更直接的形态:
couldn't connect to hw_server: connection refused2. 连上了但线缆列表是空的,get_hw_targets 返回空、open_hw_target 报错:
open_hw_target
ERROR: [Labtools 27-2223] Unable to connect to hw_server with URL "localhost:3121".
# 或:
INFO: [Labtools 27-1434] Device xc7k325t (JTAG device index = 0) is programmed ...
# 但 get_hw_targets 只返回 {},即一个线缆都没枚举到3. 远程 hw_server 主机名解析或网络不通,报错措辞与本地相同,但 ping/telnet 层就已经失败——这种情况不要在 Vivado 里反复点 connect,先去系统层验证连通性。
4. 线缆被独占的隐性形态:自己开的 hw_server 一切正常,但 get_hw_targets 始终为空,而旁边同事的机器连同一根线缆却能看见——这往往是有另一个 hw_server 进程(可能是上次没退干净的残留)还抱着 USB 设备不放,JTAG 线缆同一时间只允许一个进程独占。
注意区分两类错误:connection refused 是「服务器侧没人监听」,找不到线缆是「服务器活着但看不见硬件」,两者的排查路径完全不同。GUI 里 Hardware Manager 的 Recent Targets 列表有时还缓存着上一次的目标 URL,直连缓存项失败时别误以为是新问题,先确认这次的 URL 与端口是否真指向你想起的那台 hw_server。
二、现象 → 最可能原因 → 处置速查表
| 现象 | 最可能原因 | 处置 |
|---|---|---|
| 本机 connect 即 refused | hw_server 进程没起 | 手动起 hw_server(Vivado bin 目录下),再 connect |
| 本机进程在但仍 refused | 端口被防火墙拦或非 3121 监听 | ss -tlnp 看监听端口;放行 3121 |
| 本机通、远程 refused | 远程防火墙拦 3121,或 hw_server 绑了 127.0.0.1 | 远端放行端口;确认 hw_server 对外监听 |
| 服务器连上、targets 为空 | 线缆驱动未装(Windows) | 跑 install_drivers 或重装 cable driver |
| 服务器连上、targets 为空(Linux) | udev 权限不足,普通用户摸不到 USB | 装 52-xilinx-digilent-usb.rules,重插或 udevadm trigger |
| 别人能用、自己连上即空 | 线缆被另一个 hw_server 实例独占 | 杀掉残留 hw_server / 让对方 disconnect |
| targets 有但 open 报 JTAG 链错误 | 板子没上电、链路松动、TCK 不稳 | 查供电与线缆;降 TCK 频率重试 |
三、排查决策树
分诊只问两个问题:3121 端口有没有人监听,以及 hw_server 能不能枚举到 USB 线缆。两个答案把现场切成「服务器侧」和「线缆侧」两条通道:
读这张图抓住一条分叉:红色是入口现象与「服务器侧」根因,端口不通就别碰线缆;蓝色是两个排查动作,先端口后枚举;绿色是确认服务器侧无恙的通过节点;橙色是线缆侧的修复动作(驱动、权限、占用、供电);紫色收尾是防复发的固化纪律。 很多人一上来就拔插线缆、重装驱动,其实一半是 hw_server 进程压根没起——先 telnet <host> 3121 一刀切开两条路,再决定往哪边走。
四、逐条排查展开
第一刀:hw_server 进程与 3121 端口。 hw_server 是 Vivado 安装目录 bin 下的独立小程序,GUI 的 Open Target 会自动拉它,但命令行/远程场景经常没人起:
# Linux:看进程与监听
ps aux | grep hw_server
ss -tlnp | grep 3121
# 没有就手动起(路径按实际安装位置):
<Vivado安装目录>/bin/hw_server &端口有人监听但本机防火墙拦着同样表现为 refused,Linux 用 firewall-cmd --add-port=3121/tcp 或对应工具放行;Windows 第一次起 hw_server 时弹出的防火墙授权要点允许。远程场景先用 telnet <host> 3121 或 nc -zv <host> 3121 验证——telnet 层就不通的话,问题在网络或防火墙,与 Vivado 无关。远程主机名解析失败时,hosts 里加一条 IP 映射比每次敲 IP 稳妥(地址按你的环境填,不要写进共享脚本)。
第二刀:线缆驱动与 udev 权限。 服务器连上了、get_hw_targets 返回空 {},九成是线缆侧。Windows 上是 Digilent/Xilinx cable driver 没装或被系统更新顶掉,重跑 Vivado 安装目录下的驱动安装脚本即可。Linux 上更隐蔽:线缆插着、lsusb 里也能看到 Digilent/FTDI 设备,但普通用户没有访问权限,hw_server 枚举时就直接跳过。Vivado 自带 udev 规则:
sudo cp <Vivado安装目录>/data/xicom/cable_drivers/lin64/install_script/install_drivers/52-xilinx*.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger
# 重新拔插线缆后再试第三刀:线缆独占与硬件状态。 JTAG 线缆同一时间只能被一个 hw_server 占用。常见的坑是上次 GUI 没正常退出,后台残留一个 hw_server 抱着线缆不放,新开的实例连上服务器却什么也看不见——ps 找到所有 hw_server 进程,确认无人使用后全部杀掉再重连。targets 能列出但 open_hw_target 报 JTAG 链扫描错误时,轮到硬件:板子上电指示灯、JTAG 线是否插反、多块板级联时链路顺序。链路信号质量差时可以用 open_hw_target -jtag_mode 相关选项或在 Hardware Manager 里把 TCK 频率降到 6 MHz 甚至更低重试,长线缆和飞线场景降频经常立竿见影。
连上之后的完整开门动作就四行,可以在 Tcl Console 里逐条验证每一步的返回:
connect_hw_server -url localhost:3121
current_hw_target [get_hw_targets */xilinx_tcf/Digilent/*]
open_hw_target
get_hw_devices哪一行报错,就回到上面对应的那一刀。
还有一个容易误判的点:Vivado 版本与线缆固件不匹配时,open_hw_target 会提示固件升级或返回链扫描超时。换过 Vivado 大版本后第一次用老线缆,建议先在 Hardware Manager 里让它完成一次固件同步,再跑批量脚本;团队里混用多个 Vivado 版本时,hw_server 也要用与工程匹配的那一份,不同版本的 hw_server 对同一根线缆的表现并不完全一致。
五、防复发纪律
- hw_server 进启动项:常用下载机器把 hw_server 做成 systemd 服务或登录自启,杜绝「忘了起」这一类最低频也最浪费时间的故障。
- udev 规则随 Vivado 装机一起装,写进装机清单;Linux 机器换主板/重装系统后第一件事就是复查
/etc/udev/rules.d/。 - 退出 GUI 前先
disconnect_hw_server,CI 脚本里跑完硬件操作也显式close_hw_target; disconnect_hw_server,不给下一个使用者留独占锁。 - 远程 hw_server 固定主机名 + 防火墙白名单,3121 只对需要的网段开放,既稳定又不把 JTAG 口裸奔到全公司。
- TCK 频率写进团队约定:默认 15 MHz,飞线/长线缆降到 6 MHz,别在每个人机器上各调各的。
这一篇在知识体系里的位置
本篇是 FPGA 排错速查簇中「硬件连接」节点的 FAQ 页:连上器件之后工具运行期卡死的问题见 Vivado 运行卡死/超时速查,下载成功后布线时序类的问题见 Vivado 时序不收敛怎么办。
一句话总结
Vivado 连接 hw_server 失败的分诊起点是 telnet <host> 3121 加 get_hw_targets 两刀:端口不通走服务器侧,查 hw_server 进程、监听端口与防火墙;端口通但 targets 为空走线缆侧,Windows 查驱动、Linux 查 udev 权限、共享环境查线缆被残留 hw_server 独占;targets 有但 open 失败才轮到板子供电与 JTAG 链路,降 TCK 频率重试,根治靠 hw_server 自启、udev 规则随装机、用完显式 disconnect 这三条纪律。