MCP 服务器
一个模型上下文协议(MCP)服务器,使Claude等AI助手能够直接与AMD/Xilinx Vivado FPGA开发工具进行交互。
特性
- 会话管理:启动/停止持久Vivado TCL会话(避免每个命令启动30秒)
- 项目管理:打开/关闭Vivado项目(.xpr文件)
- 设计流量:运行合成、实现和比特流生成
- 报告与分析:获取时间摘要、利用率报告和设计分析
- 设计查询:探索层次结构、端口、网络和单元
- 模拟:控制Vivado的集成模拟器(xsim)
- 原始TCL:执行任意Vivado TCL命令进行高级操作
需求
- Python 3.10+
- 已安装AMD/Xilinx Vivado(已在2023.2+版本中测试)
- Vivado必须在您的PATH中,或者在启动会话时指定完整路径
安装
来自GitHub
git clone https://github.com/coreyhahn/vivado_mcp.git
cd vivado_mcp
pip install -e .配置Claude代码
添加到您的Claude Code MCP配置中(~/.claude/claude_desktop_config.json 或项目级别 .mcp.json):
{
"mcpServers": {
"vivado": {
"command": "vivado-mcp"
}
}
}或者,如果你想指定Python解释器:
{
"mcpServers": {
"vivado": {
"command": "python",
"args": ["-m", "vivado_mcp"]
}
}
}用法
配置后,Claude可以通过自然语言与Vivado交互。工作流程示例:
- 启动Vivado会话:“开始Vivado会话”
- 打开项目:“在/path/to/project.xpr打开我的项目”
- 运行合成:“综合设计”
- 检查计时:“时间总结是什么?是否符合时间要求?”
- 检查利用率:“显示资源利用率”
- 关闭会话:“停止Vivado会话”
可用工具
会话管理
start_session-启动持续的Vivado TCL会话stop_session-停止Vivado会话session_status-获取会话统计信息
项目管理
open_project-打开Vivado项目(.xpr)close_project-关闭当前项目get_project_info-获取项目信息(零件、目录等)
设计流量
run_synthesis-运行合成run_implementation-跑步地点和路线generate_bitstream-生成比特流
报告与分析
get_timing_summary-获取时间摘要(WNS、TNS、WHS、THS)get_timing_paths-获取故障/关键路径的详细时序路径get_utilization-获取资源利用率(LUT、FF、BRAM、DSP)get_clocks-获取时钟信息get_messages-获取综合/实施消息
设计查询
get_design_hierarchy-获取模块/实例层次结构get_ports-获取顶级端口get_nets-搜索网get_cells-搜索单元格/实例
模拟
launch_simulation-启动行为/合成后/内爆后模拟run_simulation-在指定时间内运行模拟restart_simulation-从时间0重新启动close_simulation-关闭模拟器get_simulation_time-获取当前模拟时间get_signal_value-获取信号的当前值get_signal_values-按模式获取多个信号值add_signals_to_wave-将信号添加到波形查看器set_simulation_top-设置测试台模块get_simulation_objects-列出范围内的信号get_scopes-列出层次结构范围step_simulation-步进模拟add_breakpoint-添加信号断点remove_breakpoints-删除所有断点
高级
run_tcl-执行原始TCL命令generate_full_report-生成完整报告以归档read_report_section-阅读大型报告的部分内容request_feature-请求新功能list_feature_requests-列出提交的请求
建筑
┌─────────────────┐ MCP Protocol ┌─────────────────┐
│ Claude Code │◄────(JSON-RPC)────────►│ Vivado MCP │
│ (AI Client) │ over stdio │ Server │
└─────────────────┘ └────────┬────────┘
│
│ pexpect
│ (TCL commands)
▼
┌─────────────────┐
│ Vivado Process │
│ (TCL mode) │
└─────────────────┘服务器在TCL模式下维护一个持久的Vivado进程。命令通过pexpect发送,并通过等待Vivado提示符捕获输出。这避免了为每个命令启动Vivado时可能出现的约30秒的启动开销。
用Claude重新创建此MCP服务器
这个MCP服务器完全是通过与Claude的对话创建的。以下是如何创建类似的MCP服务器:
1.从明确的目标开始
告诉克劳德你想构建什么:
“我想创建一个MCP服务器,让你控制Vivado FPGA工具。你应该能够启动Vivado、打开项目、运行合成、检查时序等。”
2.描述架构
解释关键技术挑战:
“Vivado需要30秒才能启动,所以我们需要一个持久的会话。Vivado有一个我们可以使用的TCL接口。我们需要将Vivado的文本输出解析为结构化数据。”
3.迭代工具
从基本工具开始,添加更多:
- 会话管理(启动/停止)
- 项目管理
- 设计流命令
- 报告和查询
- 仿真控制
4.使用的关键设计模式
单打比赛:一次只能运行一个Vivado进程
_session: Optional[VivadoSession] = None
def get_session() -> VivadoSession:
global _session
if _session is None:
_session = VivadoSession()
return _session过程管理展望:使Vivado在命令之间保持活力
self.child = pexpect.spawn(
f'{self.vivado_path} -mode tcl -nojournal -nolog',
encoding='utf-8',
timeout=self.timeout
)
self.child.expect('Vivado%', timeout=10) # Wait for prompt输出解析:将文本报告转换为结构化JSON
def parse_timing_summary(output: str) -> dict:
wns_match = re.search(r"WNS\(ns\)\s*:\s*([-\d.]+)", output)
if wns_match:
result["wns"] = float(wns_match.group(1))响应截断:优雅地处理大输出
def truncate_response(content: str, max_chars: int) -> dict:
if len(content) > max_chars:
return {"content": content[:max_chars], "truncated": True}5.MCP服务器结构
每个MCP服务器都需要:
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
server = Server("your-server-name")
@server.list_tools()
async def list_tools() -> list[Tool]:
return [Tool(name="...", description="...", inputSchema={...})]
@server.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
# Handle tool calls
return [TextContent(type="text", text=json.dumps(result))]
async def main():
async with stdio_server() as (read_stream, write_stream):
await server.run(read_stream, write_stream,
server.create_initialization_options())6.创建自己的MCP服务器的提示
将此提示模板与Claude一起使用:
I want to create an MCP server for [YOUR TOOL].
Background:
- [Tool] is a [description] that [what it does]
- It has a [CLI/API/etc] interface that accepts [commands/requests]
- Key operations I want to support: [list operations]
Technical considerations:
- [Startup time, persistent state, output formats, etc.]
Please help me create an MCP server with:
1. Session/connection management
2. Core operations as tools
3. Proper error handling
4. Structured JSON responses
5. Comprehensive code comments
Start with the basic structure and we'll iterate from there.贡献
欢迎投稿!请随时提交问题和拉取请求。
许可证
MIT许可证-有关详细信息,请参阅许可证文件。
致谢
- 创建于 克劳德 (人类学)
- 使用 模型上下文协议 规格
- 与集成 AMD/赛灵思Vivado
