PDM MCP Server
AI-powered FPGA power estimation assistant that wraps Xilinx PDM API as MCP services for natural language power modeling and analysis.
README
PDM MCP Server
AI 驱动的 FPGA 功耗评估助手 — 将 Xilinx Power Design Manager (PDM) 的 Python API 封装为 MCP (Model Context Protocol) 服务,供 AI Agent 通过自然语言进行功耗建模与分析。
前置条件
- Python ≥ 3.10
- Xilinx PDM (Power Design Manager) 已安装
- PDM 的 Python API (
xv_pdm_pytasks) 必须可用 - 安装路径会被自动检测(详见下方「PDM 路径配置」)
- PDM 的 Python API (
安装
从源码安装
git clone <repo-url>
cd pdm_mcp
pip install .
安装后可使用 pdm-mcp 命令:
pdm-mcp version # 显示版本
pdm-mcp serve # 启动 MCP server
PDM 路径配置
MCP Server 启动时会按以下优先级自动查找 PDM 安装路径:
PDM_HOME环境变量 →$PDM_HOME/pdm.bat- 项目根目录的
path.txt文件(格式:PDM:H:\path\to\PDM\bin) - 系统
PATH中的pdm.bat/pdm - 默认安装路径回退(
C:/Xilinx/*/PDM/bin/pdm.bat等)
若自动检测失败,可创建 path.txt 指定路径,或设置环境变量:
set PDM_HOME=H:\AMDDesignTools\PDM_2026.1\PDM\bin
MCP 客户端配置
在 AI 客户端(如 Kimi Code、Claude Desktop 等)中添加 MCP Server 配置:
{
"mcpServers": {
"pdm-mcp": {
"command": "pdm-mcp",
"args": ["serve"]
}
}
}
如果未安装到系统 PATH,指定完整路径:
{
"mcpServers": {
"pdm-mcp": {
"command": "python",
"args": ["-m", "pdm_mcp", "serve"],
"cwd": "H:/path/to/pdm_mcp"
}
}
}
使用
MCP Server 提供 10 个工具,每个工具通过 action 参数选择具体操作。
1. session — 会话管理
| action | 参数 | 说明 |
|---|---|---|
start |
session_id (默认 "default"), mode (默认 "py"), pdm_path, timeout |
启动 PDM 子进程会话 |
stop |
session_id |
关闭指定会话 |
list |
无 | 列出所有活跃会话 |
session(action="start")
session(action="list")
session(action="stop", session_id="my_session")
2. project — 项目管理
| action | 关键参数 | 说明 |
|---|---|---|
open |
path |
打开 .pdm 项目文件 |
create |
name, part |
创建新项目 |
close |
无 | 关闭当前项目 |
save |
save_path (可选) |
保存/另存为 |
info |
无 | 项目基本信息 |
list_blocks |
无 | 列出所有 Block |
list_architectures |
无 | 列出可用 FPGA 架构 |
list_parts |
architecture, package_filter |
筛选器件型号 |
list_processes |
无 | 列出工艺角 (Maximum/Typical) |
select_part |
part, process |
更换器件 |
import_xpe |
file, append |
导入 XPE 文件 |
export_xdc |
file, thermal, rails, overwrite |
导出 XDC 约束 |
export_power_design |
file, overwrite |
导出 Power Design XML |
reset |
无 | 重置项目数据 |
project(action="open", path="my_design.pdm")
project(action="save")
project(action="info")
project(action="list_parts", architecture="Artix-7", package_filter="csg324")
3. power — 功耗查询
| action | 关键参数 | 说明 |
|---|---|---|
summary |
无 | 总功耗摘要(自动保存快照) |
block_power |
block_name |
指定 Block 功耗分解 |
rails |
无 | 电源轨电压/电流/功耗 |
thermal |
无 | 热分析(结温/θ-JA/裕量) |
clock_power |
无 | 各时钟域功耗 |
export_report |
output_path |
导出功耗报告 |
power(action="summary")
power(action="block_power", block_name="logic")
power(action="export_report", output_path="report.txt")
4. scenario — 场景配置
| action | 关键参数 | 说明 |
|---|---|---|
set_environment |
temp, airflow, heatsink |
温度/风流量/散热器 |
set_clock_frequency |
name, freq_mhz |
修改时钟频率 |
set_toggle_rate |
block, pct |
修改翻转率 |
set_resource_util |
block, lut, ff, bram, dsp |
修改资源用量(绝对数量) |
recalculate |
无 | 触发功耗重算 |
compare |
无 | 对比两次功耗快照 |
scenario(action="set_environment", temp=85, airflow=250, heatsink="medium")
scenario(action="set_clock_frequency", name="clk_main", freq_mhz=200)
scenario(action="set_resource_util", block="logic", lut=50000, ff=60000, bram=80, dsp=100)
scenario(action="recalculate")
scenario(action="compare")
5. clock — 时钟管理
| action | 关键参数 | 说明 |
|---|---|---|
list |
无 | 列出所有时钟 |
create |
name, freq, io_type, io_standard, is_gated, min_freq |
创建时钟 |
delete |
name |
删除时钟 |
edit |
name, freq, io_type, ... |
编辑时钟参数 |
settings |
name |
获取时钟设置 |
sample_settings |
无 | 获取示例设置模板 |
replace |
name, other, blocks |
替换时钟引用 |
mgr_types |
无 | 列出时钟管理器类型 |
mgr_list |
无 | 列出现有时钟管理器 |
mgr_create |
name, type, input_clock, vco_range |
创建时钟管理器 |
mgr_delete |
name |
删除时钟管理器 |
mgr_settings |
name |
获取时钟管理器设置 |
clock(action="create", name="clk_200", freq=200, io_type="HD")
clock(action="mgr_create", name="mmcm1", type="MMCM", input_clock="clk_200")
6. ip — IP 核管理
| action | 关键参数 | 说明 |
|---|---|---|
types |
无 | 列出可用 IP 类型 |
list |
ip_type |
列出指定类型的 IP 实例 |
create |
ip_type, ip_name |
创建 IP |
delete |
ip_type, ip_name |
删除 IP |
settings |
ip_type, ip_name |
获取 IP 当前设置 |
sample_settings |
ip_type |
获取 IP 设置模板 |
ip(action="types")
ip(action="list", ip_type="GTH")
ip(action="create", ip_type="GTH", ip_name="gth_0")
7. power_design — 电源设计
| action | 关键参数 | 说明 |
|---|---|---|
info |
无 | 电源域/电源名称概览 |
rail_characteristics |
无 | 电源轨特性详情 |
delivery_design |
无 | 电源交付设计汇总 |
set_consolidation |
mode |
设置电源轨整合模式 |
power_design(action="info")
power_design(action="rail_characteristics")
power_design(action="set_consolidation", mode="Consolidated")
8. vivado — Vivado 数据导入
| action | 关键参数 | 说明 |
|---|---|---|
import_report |
report_path, label |
导入 Vivado 功耗报告 |
compare |
label |
与 PDM 结果逐项对比 |
import_utilization |
util_report_path, block_name |
导入利用率报告 |
vivado(action="import_report", report_path="post_route_power.rpt")
vivado(action="compare", label="vivado_import")
vivado(action="import_utilization", util_report_path="utilization.rpt")
9. estimate — 快速估算(无需 PDM 会话)
| action | 关键参数 | 说明 |
|---|---|---|
quick |
part, clock_mhz, lut_pct, ... |
快速功耗估算 (±40%) |
recommend |
budget, logic_cells, family |
根据预算推荐器件 |
families |
无 | 列出支持的 FPGA 系列 |
estimate(action="quick", part="xc7a100tcsg324-1", clock_mhz=200, lut_pct=60)
estimate(action="recommend", budget=3.0, logic_cells=50000, family="7series")
estimate(action="families")
10. explore — 属性探索
| action | 关键参数 | 说明 |
|---|---|---|
block_resources |
block |
列出 Block 的资源名 |
block_summaries |
block |
列出 Block 的汇总表名 |
resource_info |
block, resource |
获取资源字段名/记录名 |
resource_defaults |
block, resource |
获取资源默认值 |
resource_valid_values |
block, resource, fields |
获取字段有效值范围 |
summary_info |
target, summary |
获取汇总表详情 |
list_property |
target |
列出对象属性名 |
report_property |
target, pattern, all_props, detail |
报告对象属性 |
reset_property |
target, prop |
重置属性为默认值 |
explore(action="block_resources", block="logic")
explore(action="resource_defaults", block="logic", resource="logic_config")
explore(action="report_property", target="project", pattern="*", all_props=True)
使用模板
以下是常见场景的操作模板。直接将这些指令告诉 AI Agent 即可。
模板 A:设计前期最大功耗快速评估(无 PDM 项目)
器件尚未确定,需要快速估算最坏情况功耗,给出电源设计余量。
1. 调用 estimate(action="families"),了解有哪些 FPGA 系列可选。
2. 用 estimate(action="quick") 做粗估。关键参数:
- part: 候选器件,如 "xc7a100tcsg324-1"
- clock_mhz: 主时钟频率
- lut_pct / ff_pct / bram_pct / dsp_pct: 设为预期的最大值(如 80-90)
- io_count / io_standard / io_toggle: IO 数量和翻转率
- temp / airflow / heatsink: 环境条件
3. 多选几个候选器件重复 quick 估算,比较结温。
4. 用 estimate(action="recommend"),传入功耗预算和资源需求,验证选型。
5. 电源余量建议:总功耗 × 1.3 ~ 1.5 作为电源设计目标。
示例对话:
用户: 我在设计一个 200MHz 主频、占用约 70% LUT 的逻辑,用 xc7a100t,
想知道最大功耗大概多少,电源要留多少余量。
(AI 自动调用 estimate quick → 返回总功耗和结温 → 建议余量)
模板 B:精确功耗评估(基于 PDM 项目)
已有 RTL / Vivado 工程,需要精确评估并导出约束到 PCB 设计。
1. session(action="start")
2. project(action="create", name="my_design", part="xc7a100tcsg324-1")
3. 用 explore(action="block_resources", block="logic") 查看可用资源字段。
4. 用 scenario(action="set_resource_util") 填入综合后的 LUT/FF/BRAM/DSP 用量(绝对数量)。
例如 ``lut=50000, ff=60000, bram=80, dsp=100``。
5. 用 clock(action="create") 创建设计中的时钟,或 scenario(action="set_clock_frequency")
修改已有时钟。
6. 用 scenario(action="set_environment", temp=85, airflow=250, heatsink="medium")
设置工作环境。
7. scenario(action="recalculate") 重算功耗。
8. power(action="summary") 查看总功耗,power(action="thermal") 检查结温是否超标。
9. 如结温过高,调整 airflow 或 heatsink,重复步骤 7-8。
10. project(action="export_xdc", file="thermal.xdc") 导出散热约束。
11. power_design(action="rail_characteristics") 查看电源轨特性,确定每路电源需求。
12. project(action="save")
13. session(action="stop")
模板 C:导入 Vivado 结果并验证
综合/布线已完成,导入 Vivado 报告验证 PDM 建模精度。
1. session(action="start")
2. project(action="open", path="my_design.pdm")
3. vivado(action="import_report", report_path="post_route_power.rpt")
4. vivado(action="import_utilization", util_report_path="utilization.rpt", block_name="logic")
5. scenario(action="recalculate")
6. vivado(action="compare") → 总功耗和各项逐项对比,>10% 差异标记 WARN。
7. 根据差异调整 PDM 参数(调用 scenario / clock),重复步骤 5-6。
8. project(action="save")
9. session(action="stop")
模板 D:多场景功耗对比
同一设计在不同频率、温度下的功耗差异。
1. session(action="start")
2. project(action="open", path="my_design.pdm")
3. power(action="summary") → 保存快照 A(基准)
4. scenario(action="set_clock_frequency",
name="clk_main", freq_mhz=300) → 调整频率
5. scenario(action="recalculate")
6. power(action="summary") → 保存快照 B
7. scenario(action="compare") → 对比 A vs B
8. scenario(action="set_environment",
temp=85, airflow=0, heatsink="none") → 调整环境
9. scenario(action="recalculate")
10. power(action="summary") → 保存快照 C
11. scenario(action="compare") → 对比 B vs C
12. session(action="stop")
模板 E:器件选型与 Part 替换
当前器件功耗超标,需要更换器件并重新评估。
1. session(action="start")
2. project(action="open", path="my_design.pdm")
3. project(action="list_parts", architecture="Artix-7") → 查看同架构备选器件
4. power(action="summary") → 当前功耗
5. project(action="select_part", part="xc7a200tfbg484-2") → 换更大器件
6. scenario(action="recalculate")
7. power(action="summary") → 验证新器件功耗和结温
8. 若不满意,重复步骤 5-7。
9. project(action="save", save_path="my_design_a200t.pdm")
10. session(action="stop")
模板 F:时钟系统规划
从零配置复杂时钟网络(含 MMCM/DPLL)。
1. session(action="start")
2. project(action="create", name="clock_design", part="xcku3p-ffva676-1-i")
3. clock(action="sample_settings") → 了解时钟设置模板结构
4. clock(action="create", name="sys_clk", freq=125,
io_type="HD", io_standard="LVCMOS 1.8V") → 创建系统时钟
5. clock(action="mgr_types") → 查看可用的时钟管理器
6. clock(action="mgr_create", name="mmcm_sys",
type="MMCM", input_clock="sys_clk", vco_range="Low") → 创建 MMCM
7. clock(action="mgr_settings", name="mmcm_sys") → 查看 MMCM 产生的输出时钟
8. scenario(action="recalculate")
9. project(action="save")
10. session(action="stop")
模板 G:电源轨设计与原理图检查
导出电源设计数据,提供给硬件工程师做原理图检查。
1. session(action="start")
2. project(action="open", path="my_design.pdm")
3. scenario(action="set_environment", temp=85,
airflow=250, heatsink="medium")
4. scenario(action="recalculate")
5. power_design(action="info") → 查看电源域和电源名称
6. power_design(action="rail_characteristics") → 查看每路电压/电流
7. power_design(action="delivery_design") → 查看电源交付方案
8. power_design(action="set_consolidation",
mode="Consolidated") → 尝试整合模式
9. power_design(action="delivery_design") → 对比整合后的方案
10. project(action="export_power_design",
file="power_design.xml") → 导出 XML 供原理图检查
11. project(action="export_xdc", file="thermal.xdc",
thermal="Ambient") → 导出环境温度约束
12. project(action="save")
13. session(action="stop")
模板 H:导入 XPE 快速起步
已有 Vivado XPE 文件,直接导入作为起点。
1. session(action="start")
2. project(action="create", name="from_xpe", part="xc7a100tcsg324-1")
3. project(action="import_xpe", file="baseline.xpe") → 导入 XPE 数据
4. power(action="summary") → 查看导入后的功耗
5. explore(action="block_resources", block="logic") → 查看 XPE 填充了哪些资源
6. scenario(action="set_environment", temp=85, airflow=250,
heatsink="medium")
7. scenario(action="recalculate")
8. power(action="summary")
9. project(action="save")
10. session(action="stop")
模板 I:同设计跨器件功耗对比(基于 PDM)
同一套设计参数(资源、时钟、环境),在不同 FPGA 型号上的功耗和结温差异。
1. session(action="start")
2. project(action="open", path="my_design.pdm")
# ---- 器件 A ----
3. scenario(action="set_resource_util", block="logic",
lut=50000, ff=60000, bram=80, dsp=100)
4. clock(action="create", name="clk_main", freq=200)
5. scenario(action="set_environment", temp=85, airflow=250, heatsink="medium")
6. scenario(action="recalculate")
7. power(action="summary") → 保存快照(器件 A)
# ---- 器件 B ----
8. project(action="select_part", part="xc7a200tfbg484-2") → 切换到更大器件
9. scenario(action="recalculate")
10. power(action="summary") → 保存快照(器件 B)
11. scenario(action="compare") → 对比 A vs B
# ---- 器件 C ----
12. project(action="select_part", part="xcku3p-ffva676-1-i") → 切换到 UltraScale
13. scenario(action="recalculate")
14. power(action="summary") → 保存快照(器件 C)
15. scenario(action="compare") → 对比 B vs C
16. session(action="stop")
说明:
compare对比的是最近两次power(summary)的快照。三器件以上需两两依次对比,每次compare后记录输出即可。
模板 J:纯快速估算跨器件对比(无需 PDM)
连 PDM 项目都不需要,直接用
estimate quick快速比较多个器件。
1. estimate(action="quick", part="xc7a35tcsg324-1", clock_mhz=200,
lut_pct=70, temp=85, airflow=250, heatsink="medium")
→ 记录: A35T → 功耗 X.XW, 结温 YY°C
2. estimate(action="quick", part="xc7a100tcsg324-1", clock_mhz=200,
lut_pct=70, temp=85, airflow=250, heatsink="medium")
→ 记录: A100T → 功耗 X.XW, 结温 YY°C
3. estimate(action="quick", part="xc7a200tfbg484-2", clock_mhz=200,
lut_pct=70, temp=85, airflow=250, heatsink="medium")
→ 记录: A200T → 功耗 X.XW, 结温 YY°C
4. estimate(action="quick", part="xcku3p-ffva676-1-i", clock_mhz=200,
lut_pct=70, temp=85, airflow=250, heatsink="medium")
→ 记录: KU3P → 功耗 X.XW, 结温 YY°C
5. 横向比较四个器件的总功耗和结温,选择最优性价比型号。
11. guide — 引导式评估向导
只需告诉 AI "我想评估 xxx 的功耗",AI 会调用本工具一步步询问所需参数, 每步给出可选值,无需记忆任何工具名。
流程:器件型号 → 评估模式(quick/pdm/vivado) → 逐步填参 → 自动计算结果。
# 用户: "我想评估 xc7a100t 的功耗"
# AI 自动调用:
guide(step="start")
# → 返回: "请输入 FPGA 器件型号"
guide(step="device", value="xc7a100tcsg324-1")
# → 返回: "选择评估模式: quick / pdm / vivado"
guide(step="mode", value="quick", device="xc7a100tcsg324-1")
# → 返回: "主时钟频率是多少 (MHz)?"
guide(step="quick_clock_mhz", value="200", device="xc7a100tcsg324-1")
# → 返回: "LUT 利用率大约多少 (%)?"
# ... 逐步收集参数 ...
# → 最终返回: 功耗估算结果(含 breakdown、结温)
示例对话:
用户: 我想评估 xc7a100t 的功耗,200MHz 主频,资源用了大概 70%
AI: (自动调用 guide → 收集参数 → 返回总功耗 1.2W,结温 45°C,建议电源余量 1.8W)
开发
运行测试
pip install -e ".[dev]"
pytest tests/ -v
项目结构
pdm_mcp/
├── src/pdm_mcp/
│ ├── __main__.py # CLI 入口 (pdm-mcp serve)
│ ├── server.py # FastMCP 实例 + 工具注册
│ ├── config.py # PDM 路径检测
│ ├── analysis/
│ │ ├── estimator.py # 快速功耗估算模型
│ │ └── power_parser.py # Vivado 报告解析器
│ ├── session/
│ │ ├── pdm_session.py # PDM 子进程管理(哨兵协议)
│ │ ├── session_manager.py # 多会话生命周期
│ │ └── base_session.py # 抽象基类 + PdmResult
│ └── tools/ # 10 个 MCP 工具
│ ├── session_tools.py
│ ├── project_tools.py
│ ├── power_tools.py
│ ├── scenario_tools.py
│ ├── clock_tools.py
│ ├── ip_tools.py
│ ├── power_design_tools.py
│ ├── import_tools.py
│ ├── estimate_tools.py
│ └── exploration_tools.py
├── scripts/mainloop.py # PDM 子进程 REPL
├── tests/ # 测试
├── docs/ # UG1781 参考文档
└── pyproject.toml
Bug 反馈
请通过以下任一方式提交反馈:
-
GitHub Issues: 在项目仓库提交 Issue,附上以下信息:
pdm-mcp version输出- 完整的错误信息 / 堆栈跟踪
- 复现步骤
- PDM 版本 (
pdm.bat所在目录名即为版本号)
-
日志: 启动 MCP Server 时会输出日志到 stderr,包含 PDM 路径检测信息和运行时错误。如果遇到问题,请附上日志。
-
常见问题排查:
问题 可能原因 解决方法 PDM 路径检测失败PDM 未安装或路径不在默认位置 设置 PDM_HOME或创建path.txt会话 'xxx' 不存在未调用 session(action="start")先启动会话再操作 No project open未调用 project(action="open")先打开项目再查询 功耗值为 0 未设置资源利用率或时钟频率 调用 scenario配置参数后recalculate
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。