波形MCP服务器
](https://crates.io/crates/waveform-mcp)
MCP(模型上下文协议)服务器,用于使用 波浪 图书馆。
用法
安装
通过货物安装:
cargo install waveform-mcp构建的二进制文件将位于 ~/.cargo/bin/waveform-mcp.
手动安装:
# Clone the repository
git clone https://github.com/jiegec/waveform-mcp
cd waveform-mcp
# Build the server
cargo build --release构建的二进制文件将位于 target/release/waveform-mcp.
跑步
# Run the server with stdio transport (default)
target/release/waveform-mcp
# Run the server in HTTP mode
target/release/waveform-mcp --http
# Run the server in HTTP mode with custom bind address
target/release/waveform-mcp --http --bind-address 0.0.0.0:8000服务器支持两种传输模式:
- 标准模式 (默认):使用标准输入/输出进行MCP通信
- HTTP模式:使用可流式传输的HTTP服务器进行远程访问
/mcp端点
在HTTP模式下运行时,服务器会监听指定的绑定地址(默认值: 127.0.0.1:8000).HTTP模式允许在多个HTTP会话之间共享波形存储,从而实现波形文件的远程分析。
特性
- 打开VCD(值更改转储)和FST(快速信号跟踪)波形文件
- 列出具有分层路径的波形中的所有信号
- 以缩进树的形式读取波形模块层次结构
- 读取特定时间索引处的信号值(单个或多个)
- 获取信号元数据(类型、宽度、索引范围)
- 查找时间范围内的信号事件(变化)
- 使用时间刻度信息格式化时间值(例如“10ns”、“5000ps”)
- 支持远程访问的流式HTTP服务器
工具
服务器提供8个MCP工具:
- 开放式波形 -打开波形文件
- file_path:.vcd或.fst文件的路径 - alias:波形的可选别名(默认为文件名)
示例响应:
Waveform opened successfully with alias: waveform.vcd- 闭合波形 -关闭波形并释放其内存
- waveform_id:要关闭的波形的ID或别名
示例响应:
Waveform 'waveform.vcd' closed successfully- list_信号 -列出开放波形中的所有信号
- waveform_id:波形的ID或别名 - name_pattern:按名称过滤信号的可选子字符串(不区分大小写) - hierarchy_prefix:按层次结构路径过滤信号的可选前缀 - recursive:包含来自子层次结构的信号的可选标志(默认值:false) - limit:可选返回的最大信号数(默认值:100)
示例响应:
Found 3 signals:
top.clock
top.reset
top.data- 读取层次结构 -以缩进树的形式读取波形模块层次结构
- waveform_id:波形的ID或别名 - scope_path:可选的起始作用域路径 - recursive:包含子体的可选标志(默认值:false) - limit:可选返回的最大模块数(默认值:200)
示例响应:
Hierarchy rooted at 'top':
top
submodule- read_信号 -读取特定时间索引处的信号值
- waveform_id:波形的ID或别名 - signal_path:信号的分层路径(例如“top.module.signal”) - time_index:要读取的可选单次索引 - time_indices:读取多个值的可选时间索引数组
示例响应:
Time index 0 (0ns): 0
Time index 10 (10ns): 1
Time index 20 (20ns): 1- get_signal_info -获取信号的元数据
- waveform_id:波形的ID或别名 - signal_path:信号的分层路径
示例响应:
Signal: top.data
Type: Wire
Width: 8 bits
Index: [7:0]- find_signal_events -查找一个时间范围内的所有信号变化
- waveform_id:波形的ID或别名 - signal_path:信号的分层路径 - start_time_index:可选开始时间范围(默认值:0) - end_time_index:可选的时间范围结束(默认值:上次时间索引) - limit:可选返回的最大事件数(默认值:无限制)
示例响应:
Found 3 events for signal 'top.clock' (time range: 0 to 20):
Time index 0 (0ns): 0
Time index 10 (10ns): 1
Time index 20 (20ns): 0- 查找条件事件 -查找满足条件的事件
- waveform_id:波形的ID或别名 - condition:要计算的条件表达式 - start_time_index:可选开始时间范围(默认值:0) - end_time_index:可选的时间范围结束(默认值:上次时间索引) - limit:可选返回的最大事件数(默认值:100)
示例响应:
Found 2 events for condition '!$past(TOP.signal) && TOP.signal' (time range: 0 to 50):
Time index 5 (50ns): top.signal = 8'h0A
Time index 15 (150ns): top.signal = 8'hFF支持的条件语法:
- 信号路径(例如。, TOP.signal) - 位运算符: ~ (不是), & (和), | (或), ^ (XOR) - 布尔运算符 && (和), || (或), ! (不) - 比较运算符: ==, != - 分组括号: (condition) - $past(signal) -从先前时间索引读取信号值 - Verilog风格的文字: 4'b0101 (二进制), 3'd2 (十进制), 5'h1A (十六进制) - 比特提取: signal[bit] 对于单比特, signal[msb:lsb] 范围
操作员优先级(从高到低):
1. ~, ! (位非,逻辑非) 1. ==, != (平等/不平等) 1. & (按位与) 1. ^ (逐位XOR) 1. | (按位OR) 1. && (逻辑与) 1. || (逻辑OR)
示例:
- 找出信号1和信号2为真的时间: TOP.signal1 && TOP.signal2 - 查找计数器何时等于特定值: TOP.counter == 4'd10 - 找到上升沿: !$past(TOP.signal) && TOP.signal - 找到下降沿: $past(TOP.signal) && !TOP.signal - 查找握手周期(当有效和就绪都被断言时): TOP.valid && TOP.ready - 复杂情况: (TOP.valid && TOP.data != 8'hFF) || TOP.error - 比特操作: TOP.flags & 4'b0001 (检查是否设置了位0) - 请注意: ~TOP.mask (反转所有位)
独立CLI
除了MCP服务器,还有一个独立的CLI工具 waveform-cli 无需MCP客户端即可直接进行命令行访问。
CLI使用情况
# Basic command
waveform-cli open_waveform /path/to/waveform.vcd
# Chain multiple commands with --
waveform-cli open_waveform test.vcd -- list_signals test.vcd --pattern clk
# Full workflow example
waveform-cli open_waveform test.vcd --alias mywave -- \\
list_signals mywave -- \\
read_signal mywave top.clk --time-indices 0,1,2,3 -- \\
close_waveform mywaveCLI命令
- 开放式波形 `
\[--别名`\]-打开波形文件 - 闭合波形 `` -关闭波形
- list_信号 `
\[--图案
\]\[--层次结构 \]\[--递归 \]\[--限制 `\]
- 读取层次结构 `
\[--范围\]\[--递归\]\[--限制`\] - read_信号 `
\[--时间指数|--时间指数
`\]
- get_signal_info `
` -获取信号元数据 - find_signal_events `
\[--开始\]\[--结束\]\[--限制`\] - 查找条件事件 `
\[--开始\]\[--结束\]\[--限制`\]
发展
建筑
cargo build
cargo build --release测试
cargo test
