Skip to main content

wave-mcp — 开源、免 License 的 RTL 波形调试 MCP Server

蓬莱实验室

English | 简体中文

wave-mcp 是腾讯蓬莱实验室验证团队开源的一款 RTL 波形调试 MCP Server,用 FST 波形 + pyslang RTL 网表 等开源数据源,为 LLM 提供一套波形调试工具, 共 27 个工具无需任何商用 License,支持任意并发。MIT 许可开源。

只要你的仿真器能 dump FST(Verilator --trace-fst、Icarus、或把 VCD 转成 FST), wave-mcp 就能读它做调试。它不跑仿真器——你用自己的流程跑出波形,把结果交给它即可。


特性

  • 波形查询:设计层次、实例、信号(位宽/方向/类型,含总线聚合)、信号值(点查询 / 区间,随机访问)。
  • 静态分析(pyslang 网表):连接、驱动、扇入/扇出、声明位置(文件:行号)。
  • 值追踪trace_value 沿驱动链反向遍历、可跨模块下钻,每个节点带真实 FST 值;trace_x 追 X 根因。
  • 网表自愈:从 pyslang 诊断自动补 +incdir+ / 包源并重编,自动探测 UVM 目录;失败时优雅降级,其余工具不受影响。
  • 一致性校验session.json 记录波形/源码指纹,源码或波形变了但网表没更新会报警,绝不静默给错结果。
  • 部署友好:stdio(一人一进程,零运维)/ HTTP 多会话 / 离线自包含包(隔离网)。

架构

仿真器 → dump 波形(FST) → wave-mcp Server(多数据源聚合) → LLM 客户端(MCP)
                              ↑
              FST 波形 + pyslang RTL 网表

数据源(wave_mcp/sources/ + wave_mcp/netlist/):

数据源 实现 能力
fst_source.py pylibfst(fstapi,随机访问)+ 总线聚合 层次探索、信号、信号值
netlist/ + rtl_source.py pyslang(完整 elaboration)+ FST 连接、驱动、扇入扇出、trace、文件/声明
netlist/name_infer.py 实例名 → 模块定义名命名推断 网表未覆盖时兜底补全 module_type

一个 session = 一个隔离的调试上下文(一人一模块),由 session.json 把数据源绑定在一起。


安装

# 从 git 安装(Linux x86_64 开箱即用;依赖 mcp + pylibfst + pyslang)
pip install git+https://github.com/Tencent/wave-mcp.git
# 或克隆后本地安装:
#   git clone <repo> && cd wave-mcp && pip install -e .

# 系统二进制(按需):vcd2fst(GTKWave,VCD→FST 转换;已有 FST 则不需要)
#   Debian/Ubuntu: sudo apt install gtkwave   |   macOS: brew install gtkwave

平台支持Linux x86_64 有全部依赖的预编译 wheel,pip 开箱即用(已测 Python 3.10–3.13;mcp SDK 要求 ≥3.10)。 macOS / Windows / arm64 因 pylibfst 暂无预编译 wheel,需源码编译(cmake+gcc+zlib)。 隔离网 / 离线环境见 docs/DEPLOY_AIRGAP.md


快速开始

开源、无需商用仿真器——用 Verilator 产真实 FST 再打开分析,一条命令:

python examples/verilator_quickstart/run.py   # 需 verilator>=5;详见该目录 README

或用内置的极小样例(手写 VCD → vcd2fst → FST):

# 1) 生成样例
python examples/make_sample.py

# 2) 打包成 session
python -m wave_mcp.cli.build_session \
    --fst examples/sample/dump.fst \
    --top top_tb --filelist examples/sample/rtl.f \
    --out examples/sample/session

# 3) 端到端冒烟测试
python tests/unit/smoke_test.py

# 4) 启动 MCP Server(stdio,推荐:一人一进程)
python -m wave_mcp.server --session examples/sample/session

标准工作流(分析波形的统一入口)

prepare_session 是统一入口——想开始分析波形时第一步就调它,传入仿真已产出的 波形文件,一次完成"(转换 →)建网表 → 建 session → 打开",返回即可直接查询。

prepare_session ─┬─ 波形文件入口                 # .fst 直读 / .vcd 自动转
                 ├─ convert VCD → FST           # 仅当传入 .vcd,默认 speed(fastlz)
                 ├─ build netlist (pyslang)     # 可选,启用 连接/驱动/trace
                 ├─ build session.json + 指纹
                 └─ open session                # 完成后直接用查询类工具

调用示例:

prepare_session({
  "out_dir":      "sessions/my_module",
  "wave_path":    "sim/dump.fst",          // 仿真产出的波形:.fst 直读 / .vcd 自动转
  "top":          "top_tb",
  "filelist_path":"rtl.f",                 // 与仿真同一份 filelist(启用网表/声明类工具)
  "mode":         "speed"                   // VCD->FST:speed/balanced/size(仅 .vcd 时生效)
})
// 返回 ready + session 摘要后,接着调 signal_values / list_child_instances ...

传入 .fst 零转换直读;传入 .vcd 自动转成 FST(体积约为 VCD 的 1/50)。 想拆开用也行:convert_vcd_to_fstopen_session

纯静态分析(无波形,仿真前即可用)

open_static_session 只凭 RTL 源码建网表并打开 session——不需要任何波形、不跑仿真。 适合仿真前的代码理解:查接口、查驱动/扇入扇出关系、浏览层次结构、做 code review。

open_static_session({
  "out_dir":      "sessions/my_module",
  "top":          "uart",
  "filelist_path":"rtl.f"
})
// 返回 mode:"static" + 可用工具清单;连接/驱动/层次/文件/声明类工具全部可用,
// 值/追踪类工具返回明确的 "needs waveform" 提示

之后仿真产出波形时,用同一个 out_dirprepare_session 升级为完整 session—— 已建好的网表直接复用,不会重新弹性展开。CLI 同样支持:

wave-session --static --filelist rtl.f --top uart --out sessions/my_module

VCD → FST 转换

若仿真器只吐 VCD,可先转 FST(体积约 1/50、随机访问快)。三种入口:

# 后处理转换(最快参数:mode=speed=fastlz + 并行)
wave-vcd2fst --vcd sim/dump.vcd --fst sim/dump.fst --mode speed
#   mode: speed(fastlz,最快) / balanced(lz4) / size(zlib,最小)

# 流式转换——把转换时间藏进仿真时间里,仿真结束 FST 几乎同时就绪
wave-vcd2fst --stream --vcd sim/dump.vcd --fst sim/dump.fst   # 建 FIFO + 后台起 vcd2fst
#   然后 TB 里 $dumpfile("sim/dump.vcd") 指向该 FIFO,正常跑仿真即可

# 建 session 时一步到位(自动转 + 打包)
wave-session --vcd sim/dump.vcd --top top_tb --filelist rtl.f --out sessions/mod

MCP 客户端配置(stdio)

{
  "mcpServers": {
    "wave-mcp": {
      "command": "python",
      "args": ["-m", "wave_mcp.server", "--session", "/abs/path/to/sessions/my_module"]
    }
  }
}

部署模式

  • stdio(推荐):每人本地起一个 Server 子进程,只加载自己模块的 FST+网表。零运维。 python -m wave_mcp.server --session <session_dir>
  • HTTP + 多 Session:一个常驻服务,用 session_id 给每用户分隔离会话。 python -m wave_mcp.server --transport http --host 0.0.0.0 --port 8000 每个工具都接受可选 session_id;先 open_session(session_path, session_id=...) 再调用其它工具。
  • 隔离网 / 离线自包含包:有网机器用 deploy/build_offline_bundle.sh 生成自包含 bundle (自带独立 Python + 全部 wheel + 可选 vcd2fst),拷到目标机 install.sh 离线安装。 详见 docs/DEPLOY_AIRGAP.md

工具(27 个)

类别 工具 说明
波形准备 prepare_session / open_static_session / convert_vcd_to_fst 波形入口(.fst 直读 / .vcd 自动转)→ session 一条龙;open_static_session 无波形纯静态分析;不跑仿真器
会话管理 open_session / close_session / session_info session_info 含 netlist_health + definition_coverage
层次探索 list_child_instances / list_modules / instances_of_module(_matching) / scope_info 模块定义名走三层解析:pyslang 网表 → 命名推断 → 手工 scope_map;静态模式走网表 instance_tree
信号查询 list_signals / signal_info 位宽/方向/类型来自 FST(含总线聚合);声明文件+行号来自网表;静态模式走网表声明表
信号值 signal_values / signal_values_in_range / signal_value_at FST 强项,随机访问
连接/驱动 signal_connectivity / signal_drivers / signal_loads / signal_fanin / active_drivers / driver_contributors pyslang 网表(静态精确)+ 分支条件 4 值求值选活跃驱动;无网表时优雅降级
值追踪 trace_value / trace_x pyslang 网表 × FST 值反向遍历,支持跨模块下钻;trace_x 近似
文件查询 list_files / find_files / modules_in_file filelist + pyslang 网表

第 连接/驱动 与 追踪 类需要 pyslang 网表建成(prepare_session 时给对 filelist/incdirs/defines); active_drivers / trace_x 在条件为 X 或表达式超出 4 值求值子集时为 value-informed 近似,会标注 selection_method,但始终提供精确的静态驱动链 + 每节点 FST 值 + 代码位置。


实现要点

  • 不用朴素解析大 VCD(慢、易 OOM);走 FST + C 系读取库(pylibfst)+ 进程常驻 + 随机访问,契合 AI 的点查询/搜索场景。
  • 网表离线一次性构建并持久化maps.json:DriverMap/FanInMap/LoadMap/LocMap + instance_tree),Server 启动加载,不每次重建。
  • definition_name 三层解析:netlist(含锚点向上推导)→ 命名推断(含 interface 守卫、置信度分级)→ 手工 scope_map
  • MCP 返回structuredContent(机器可读)+ content[].text 人读文本(无转义 \n / \")。

目录结构

wave_mcp/
  server.py              # MCP server,注册全部 27 工具(mcp SDK v2 MCPServer)
  session.py             # Session / SessionManager / session.json / 指纹校验 / 三层 definition_name
  pipeline.py            # prepare_session / prepare_static_session:波形或纯 RTL →网表→session 编排
  convert.py             # vcd2fst 封装:并行能力探测 + 串行 fallback + FIFO 流式
  timeutil.py            # 时间字符串 <-> FST 时间单位换算
  sources/
    fst_source.py        # pylibfst:层次 / 信号 / 值 / 总线聚合
    rtl_source.py        # pyslang 网表加载 + 查询:连接/驱动/trace/文件/netlist_health
  netlist/
    slang_netlist.py     # pyslang elaboration → maps.json + 自愈 + UVM 探测
    trace_engine.py      # 结构×时间 trace 引擎 + definition_name 解析
    expr_eval.py         # 4 值(0/1/x/z) 分支条件求值
    name_infer.py        # 实例名→模块定义名命名推断
  cli/build_session.py   # wave-session:组装 session 目录 + 指纹
  cli/vcd2fst.py         # wave-vcd2fst:VCD→FST(含流式)
deploy/                  # 离线 bundle 构建 + 安装脚本(见 docs/DEPLOY_AIRGAP.md)
examples/make_sample.py             # 生成极小样例
examples/verilator_quickstart/      # Verilator 开箱示例(--trace-fst 产真实 FST,无需 xrun)
tests/                              # 统一回归入口 run_regression.py + unit/ 四态等套件
LICENSE                            # MIT
docs/THIRD_PARTY.md                # 第三方组件许可声明

开源协议

本项目以 MIT 许可发布(见 LICENSE)。

依赖与内置组件均为宽松许可,无 copyleft 传染:mcp / pyslang / pylibfst 皆为 MIT/BSD。离线包附带的 vcd2fst 转换器由 GTKWave 的 MIT 源码(libfst/fstapi + vcd2fst helper)构建,作为独立进程调用(聚合关系,不影响 wave-mcp 的 MIT 许可); 其内含的 jrb 组件为 LGPL-2.1,随包提供构建脚本以满足可重链接义务。 详见 docs/THIRD_PARTY.md

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wave_mcp-0.1.0.tar.gz (76.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wave_mcp-0.1.0-py3-none-any.whl (77.0 kB view details)

Uploaded Python 3

File details

Details for the file wave_mcp-0.1.0.tar.gz.

File metadata

  • Download URL: wave_mcp-0.1.0.tar.gz
  • Upload date:
  • Size: 76.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.6

File hashes

Hashes for wave_mcp-0.1.0.tar.gz
Algorithm Hash digest
SHA256 d0f5c9f108f6a260777e98e812a10d8cb1cad027dc7ede78e6e63a0103f955b3
MD5 5fb8a38a647cfdecf3d17afe2ea088b6
BLAKE2b-256 8636d456f3f2909bb4a7f0a182797bba3960ad669ddb7417322ae20c5a4c9dd6

See more details on using hashes here.

File details

Details for the file wave_mcp-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: wave_mcp-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 77.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.6

File hashes

Hashes for wave_mcp-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8f5a488283f354e240b3d87a096877c754962264241df54198a1751a791cb53e
MD5 08eeeb8b386d9fa758c81b06ca89dbea
BLAKE2b-256 da96c61777bcf4f6ddea4d38668d1d362613f1b1940542cff66eeb3b9399df36

See more details on using hashes here.

Release history Release notifications | RSS feed

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

0.1.1

2 files

This release

0.1.0 This release

2 files

0.0.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page