mcpField
S
Silica

Silica

本地服务
github.com/simaanc开发工具132 天前更新

关于 Silica

Silica 是面向硬件设计与验证的 MCP 服务,让编码 Agent 通过结构化工具操作 EDA 工具链。它返回解析后的错误、时序、利用率和反例等结果,并提供工作顺序提示与工具检测。

主要功能

  1. 01执行 RTL 检查与仿真
  2. 02运行形式化验证并查看反例
  3. 03综合、布局布线与 FPGA 编程
  4. 04读取波形、覆盖率和串口输出
  5. 05解析结果并检测 EDA 工具

适用场景

  1. 01定位 RTL 仿真失败并迭代修复
  2. 02验证 FIFO 或 UART 的形式化属性
  3. 03综合设计并为 FPGA 生成位流
  4. 04检查时序、资源利用率及串口输出

MCP 相关

Silica 通过 MCP 向编码 Agent 暴露 EDA 工具,用于检查、仿真、验证、综合、布局布线和设备编程。工具返回结构化结果,而非仅提供原始日志。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"simaanc-silica-eda": {
"command": "uvx",
"args": [
"silica-eda"
]
}
}
}
启动命令uvx silica-eda

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypisilica-eda0.5.0

工具

18

收录的工具列表 · 更新于 1 周前

参数类型必填说明
topany否
filestring是
traceboolean否
timeoutinteger否
coverageboolean否
simulatorstring否
testbenchstring是
extra_sourcesany否

详细介绍

Silica

AI 原生 EDA 环境 · 面向硬件设计与验证的 MCP 服务

PyPI Python License


功能简介

Silica 是一个 MCP 服务,可让编码 Agent 以结构化方式访问 EDA 工具链。Agent 通过 MCP 工具执行 lint、仿真、形式化验证、综合、布局布线、板卡编程,并读取 UART 数据;服务会返回解析后的结果(包括含文件和行号的错误、各时钟的时序、资源利用率、推断出的存储器、反例轨迹),而不是原始日志。

这样就能无需复制粘贴,完成闭环:运行仿真、读取故障、修复 RTL、重新运行。服务还会告知 Agent 工作顺序和需要避免的陷阱;doctor 工具则会报告已安装的 EDA 工具以及如何安装其余工具。

Silica 会驱动由你自行安装的工具:开源工具(主要来自 OSS CAD Suite),以及已加入 PATH 的商业工具(VCS、Questa、Xcelium、Vivado,等等)。各工具的测试情况请参阅支持的工具。

当前可用功能

已在一块 Digilent Arty A7-100T(Xilinx Artix-7)上端到端运行完整流程,使用的 PicoRV32 RISC-V SoC 固件会打印横幅、回显 UART 输入,并通过计时器驱动 LED:

  1. RTL 和 lint:使用 Verilator、Verible 和 svlint,其中 Verilator 会展开整个多文件设计。
  2. 仿真:Icarus 和 Verilator 通过 $readmemh 运行实际固件,并支持波形(read_waveform)和行覆盖率(read_coverage)。
  3. 形式化验证:使用 SymbiYosys 对 UART 和 FIFO 执行证明、覆盖和有界检查;将一个故意设置为错误的断言报告为 FAIL,并提供其反例;还执行 eqy 等价性检查。
  4. 综合:使用 Yosys synth_xilinx,并报告资源利用率,以及作为带初始化数据的块 RAM 推断出的固件 ROM。
  5. 布局布线:使用 openXC7 的 nextpnr-xilinx(目标频率为 100 MHz,布线频率达到 153 MHz),并通过 fpga-as 组装 .bit 文件。
  6. 编程:使用 program_device(openFPGALoader)将程序写入 SRAM,并检查 FPGA 的 DONE 状态。
  7. 串口检查:使用 capture_serial 确认横幅已打印,并通过板卡 UART 完成回显。

这些运行均在一台机器上手动完成(OSS CAD Suite 2026-10-14、openXC7 toolchain-nix 1.0.0、Verible v0.0-4296、svlint 0.9.5)。CI 会在每周集成任务中覆盖这些开源工具;详见支持的工具。

已知限制

  • Vivado 仅支持综合:不包含实现或比特流生成步骤。
  • VCS、Questa 和 Xcelium 适配器仅通过模拟工具调用进行测试,从未在真实安装环境中测试;Quartus、DC Shell、JasperGold、VC Formal、SpyGlass 和 Verdi 也一样。如果其中某个工具运行异常,请附上工具版本和输出并提交问题。
  • iCE40 和 ECP5 比特流使用 icepack/ecppack 打包,并通过真实工具检查,但 program_device 仅在这些开发板上通过模拟 openFPGALoader 调用进行测试:目前没有可用的 iCE40 或 ECP5 开发板。get_project_structure 不会列出 iCE40 的 .pcf 文件。
  • cocotb 需要使用 glibc 与其加载的仿真器兼容的 Python。如果使用 OSS CAD Suite 的仿真器搭配较新的系统 Python(其 glibc 版本比套件中的更新),run_cocotb 会在导入时失败。
  • 形式验证:带有 induction_failures 的 UNKNOWN 证明结果表示结论不确定(k 归纳未能收敛),并非 bug。深度较大的有界检查可能很慢;示例 UART 的 120 步检查耗时 16 分钟。
  • 离线:配置为使用 uvx silica-eda@latest 的客户端(包括 Claude Code 插件)无法在没有网络连接时启动服务;请参阅安装说明中的离线部分,了解 --offline 变通方法。
  • 串口:capture_serial 需要明确指定端口,并且需要对该端口具有读写权限。在编程完成后才开始采集,通常会错过启动横幅。
  • Windows:串口存在性和权限的预检查仅支持 POSIX 系统,基于 pty 的串口测试会在 Windows 上跳过。

快速开始

  1. 安装 uv。 silica 本身无需单独安装:你的 Agent 会使用 uvx silica-eda@latest 启动它;uv 的 uvx 会在首次使用时从 PyPI 下载 silica-eda 并运行。运行 uvx silica-eda@latest --version 即可检查。

  2. 将 silica 添加到你的 Agent。 运行设置向导 uvx silica-eda@latest setup,它会为你写入各客户端的配置(请参阅设置向导);也可以按照在 Agent 中安装中的说明操作。

  3. 安装所需的 EDA 工具:OSS CAD Suite 适用于大多数开源工具,Verible 和 svlint 用于代码检查,openXC7 用于 Xilinx 布局布线。然后让 Agent 运行 doctor。

  4. 试试 UART 示例 examples/uart/:

    运行 examples/uart/ 中的 UART TX 仿真,并告诉我是否通过。

    然后修改代码,让 Agent 找出 bug:

    在 examples/uart/uart_tx.sv 中,将 DATA 状态中的移位操作改为 shift_reg <= {shift_reg[6:0], 1'b0};。运行仿真,找出 bug 并修复它。

    随后,测试平台会打印诸如 bit[2] is 0, expected 1 的 [FAIL] 行,Agent 应能据此追查到移位方向。

在 Agent 中安装

以下每个客户端都会通过 uvx silica-eda@latest 启动服务,因此无需单独安装 silica:首次使用时,uvx 会将其下载到缓存环境中;之后客户端下次启动服务时会获取新版本。请先安装 uv,它会提供 uvx。如果你更愿意自行安装 silica,uv tool install silica-eda 或 pip install silica-eda 会将 silica 命令添加到 PATH 中,此时客户端的命令改为 silica,参数为 serve。uvx silica-eda 需要高于 0.3.1 的 silica-eda 版本;若使用 0.3.1,请改用 uvx --from silica-eda@latest silica。

silica 会驱动你单独安装的 EDA 工具(Verilator、Yosys、SymbiYosys、nextpnr 等);请参阅安装 EDA 工具。连接后,让 Agent 运行 doctor 工具:它会列出已安装的工具,以及如何安装缺少的工具。

Claude Code(插件,包含工作流技能)

在 Claude Code 中:

/plugin marketplace add simaanc/silica-eda
/plugin install silica-eda@silica-eda

在 Claude Code 2.1.275 或更高版本中,也可以一步完成:/plugin install silica-eda --marketplace simaanc/silica-eda。

更新:插件的服务始终通过 uvx silica-eda@latest 运行。如要自动获取插件更新(新技能、配置变更),请为 marketplace 开启自动更新;该功能默认关闭:/plugin → Marketplaces → silica-eda → Enable auto-update。管理员可以在托管设置中 marketplace 的 extraKnownMarketplaces 条目上设置 "autoUpdate": true。若不开启自动更新,请运行 /plugin marketplace update silica-eda。

不使用插件时,只添加服务:

claude mcp add --transport stdio --scope user silica -- uvx silica-eda@latest
Claude Desktop

打开 Settings → Developer → Edit Config,将服务添加到 claude_desktop_config.json,然后退出并重启 Claude Desktop:

{
  "mcpServers": {
    "silica": {
      "command": "uvx",
      "args": ["silica-eda@latest"]
    }
  }
}

如果服务未能启动,Claude Desktop 可能无法读取 shell 的 PATH:将 which uvx 返回的完整路径填入 command。

Codex CLI
codex mcp add silica -- uvx silica-eda@latest

或添加到 ~/.codex/config.toml:

[mcp_servers.silica]
command = "uvx"
args = ["silica-eda@latest"]
# The first launch downloads silica; Codex's default start timeout is 10 s.
startup_timeout_sec = 60
Cursor

添加到 ~/.cursor/mcp.json(所有项目)或 .cursor/mcp.json(单个项目):

{
  "mcpServers": {
    "silica": {
      "type": "stdio",
      "command": "uvx",
      "args": ["silica-eda@latest"]
    }
  }
}

一键安装:在浏览器中打开此链接(GitHub 不会将 cursor:// 链接设为可点击):

cursor://anysphere.cursor-deeplink/mcp/install?name=silica&config=eyJjb21tYW5kIjoidXZ4IiwiYXJncyI6WyJzaWxpY2EtZWRhQGxhdGVzdCJdfQ==
VS Code(GitHub Copilot)
code --add-mcp '{"name":"silica","type":"stdio","command":"uvx","args":["silica-eda@latest"]}'

或添加到 .vscode/mcp.json(工作区)或用户配置文件中的 mcp.json:

{
  "servers": {
    "silica": {
      "type": "stdio",
      "command": "uvx",
      "args": ["silica-eda@latest"]
    }
  }
}
Gemini CLI
gemini mcp add -s user silica uvx silica-eda@latest

或添加到 ~/.gemini/settings.json(用户级)或 .gemini/settings.json(项目级):

{
  "mcpServers": {
    "silica": {
      "command": "uvx",
      "args": ["silica-eda@latest"]
    }
  }
}
### 设置向导

uvx silica-eda@latest setup(或通过 pip 安装后运行 silica setup)会询问你使用哪些客户端和 EDA 工具,将工具选择保存到 ~/.silica/config.toml,并在每个客户端的配置中添加一个运行 uvx silica-eda@latest 的 silica 服务。向导会显示每项更改,并在写入前征求你的同意;文件中的其他服务和设置会予以保留。如果 uvx 位于 PATH 中,向导会使用其完整路径,因为桌面应用可能无法读取 shell 的 PATH。

客户端向导执行的操作
Claude Code运行 claude mcp add --transport stdio --scope user silica -- uvx silica-eda@latest
Claude Desktop在 claude_desktop_config.json 中配置 mcpServers(macOS、Windows、Linux)
Codex CLI运行 codex mcp add silica -- uvx silica-eda@latest
VS Code (Copilot)运行 code --add-mcp '{"name":"silica","type":"stdio","command":"uvx","args":["silica-eda@latest"]}',将其添加到你的用户配置文件
Cursor在 ~/.cursor/mcp.json 中配置 mcpServers,并设置 "type": "stdio"
Gemini CLI在 ~/.gemini/settings.json 中配置 mcpServers
Windsurf在 ~/.codeium/windsurf/mcp_config.json 中配置 mcpServers
OpenCode在 ~/.config/opencode/opencode.json 中配置 mcp,格式为 {"type": "local", "command": ["uvx", "silica-eda@latest"]}(macOS、Linux)
Zed在 ~/.config/zed/settings.json 中配置 context_servers(Linux)

如果客户端文档未提供适用于你平台的配置路径(Zed 在 macOS 和 Windows 上、OpenCode 在 Windows 上),或者现有文件无法作为普通 JSON 读取(例如含注释的 Zed settings.json),向导会保持文件不变,并打印需要手动添加的配置块。

可选依赖。 capture_serial 需要 pyserial,run_cocotb 需要 cocotb。使用 uvx 时,将它们添加到参数中:"args": ["--with", "pyserial", "silica-eda@latest"](或 --with cocotb)。使用 pip 时,安装 silica-eda[serial] 或 silica-eda[cocotb]。

离线使用。 @latest 会让 uvx 在每次客户端启动服务时向 PyPI 查询最新版本,因此没有网络时服务无法启动(error: Request failed after 3 retries),即使 silica 已在缓存中也一样。要离线使用,请在软件包前添加 --offline:"args": ["--offline", "silica-eda@latest"](无法编辑插件的命令:使用 /plugin 禁用插件,并通过 claude mcp add --scope user silica -- uvx --offline silica-eda@latest 添加服务)。uvx 随后会运行缓存中已有的最新版本;这需要此前至少在线启动过一次。恢复更新时,请移除 --offline。

固定版本或回滚。 将 silica-eda@latest 替换为确切版本 silica-eda@<version>(例如该版本发布后使用 uvx [email protected]),客户端便会一直运行该版本,直到你进行更改。若某个版本有问题,可用同样的方式固定到之前的版本以回滚。Claude Code 插件始终运行 @latest;要在其中固定版本,请改用 claude mcp add 添加指定版本的服务,而不要安装插件。版本发布记录见 PyPI 和变更日志。

MCP 工具

工具描述
doctor报告 silica 的版本、是否有更新版本、已安装的 EDA 工具(及其版本),以及如何安装缺失的工具。
lintVerible、Verilator、svlint 或 SpyGlass。Verilator 会一起展开 file 和 extra_files。错误和警告会附带文件、行号和规则。
format_rtl使用 verible-verilog-format 格式化 SystemVerilog。先显示差异(dry_run),遇到语法错误时拒绝处理文件。
run_simulationVerilator、Icarus、GHDL、VCS、Questa 或 Xcelium。在 DUT 的目录中运行;返回错误,包括 $fatal/$error 消息、可选的 VCD(trace,测试平台调用 $dumpfile/$dumpvars)以及 Verilator 覆盖率。
run_cocotb运行 cocotb(Python)测试平台;逐项报告测试通过或失败。需要 cocotb extra。
read_waveform在指定时间窗口内读取 VCD/FST 波形中的信号跳变,无需查看器。
launch_waveform为用户在 Surfer、GTKWave 或 Verdi 中打开波形。
read_coverage按文件汇总 Verilator 的 coverage.dat,并列出未覆盖的行。
run_formalSymbiYosys prove/bmc/cover、eqy 等价性检查、JasperGold、VC Formal。failures 是可达的反例(附带轨迹);UNKNOWN prove 则会列出 induction_failures。
synthesizeYosys、Vivado、Quartus 或 DC Shell。提供利用率、附带文件和行号的错误、面向 FPGA 目标的 JSON 网表,以及(Yosys)每个推断出的存储器及其映射和是否包含初始化数据。
run_place_route支持 ice40、ECP5、Nexus、MachXO2 和 Xilinx 7-series 的 nextpnr(arch="xilinx",openXC7)。返回可加载的比特流:Xilinx(通过 fpga-as 生成 .bit)、iCE40(通过 icepack 生成 .bin)和 ECP5(通过 ecppack 生成 .bit)。提供各时钟的布线时序和利用率。
program_deviceopenFPGALoader。默认使用 SRAM,可按需使用 SPI 闪存;只有 FPGA 断言 DONE 时,Xilinx 加载才算成功。接收 .bit/.bin。
capture_serial在指定时间内读取 UART,可选择发送文本并匹配 expect 正则表达式。只打开指定的端口。需要 serial extra。
get_project_structure列出项目的 RTL 和约束文件。
read_rtl / search_rtl读取带行号的文件 / grep 项目的 RTL。
write_rtl修改文件,先显示差异(默认 dry_run=True)。
get_constraints读取约束文件(.xdc、.sdc、.lpf)。

包含分步排查脚本的提示词:debug_simulation_failure、debug_formal_failure、write_testbench、generate_assertions、close_timing、cdc_review。

支持的工具

工具使用方验证情况
Verilatorlint、run_simulation、read_coverageCI 中使用真实工具;用于 Arty A7 工作流
Icarus Verilogrun_simulation、run_cocotbCI 中使用真实工具;用于 Arty A7 工作流
GHDLrun_simulation(VHDL)CI 中使用真实工具
cocotbrun_cocotbCI 中使用真实工具
Verible、svlintlint、format_rtlCI 中每个 PR 都使用真实工具(Verible v0.0-4296、svlint 0.9.5)
YosyssynthesizeCI 中使用真实工具(generic、ice40、xilinx);用于 Arty A7 工作流
SymbiYosys、eqyrun_formalCI 中使用真实工具
nextpnr-ice40 + icepackrun_place_route(arch="ice40")CI 中使用真实工具(布局布线、封装);仅模拟编程
nextpnr-ecp5 + ecppackrun_place_route(arch="ecp5")CI 中使用真实工具(布局布线、封装);仅模拟编程
nextpnr-nexus、-machxo2run_place_route仅模拟
openXC7 nextpnr-xilinx + fpga-asrun_place_route(arch="xilinx")在硬件上测试(Arty A7-100T);CI 中对 xc7a35t 进行综合、布局布线和 .bit 组装
openFPGALoaderprogram_device在硬件上测试(Arty A7-100T);仅模拟 iCE40 和 ECP5
pyserialcapture_serial在硬件上测试;CI 中进行基于 pty 的测试
Surfer、GTKWave、Verdilaunch_waveform未测试(启动后不等待结果)
VCS、Questa、Xceliumrun_simulation仅模拟
Vivadosynthesize仅模拟;仅综合
Quartus、DC Shellsynthesize仅模拟
JasperGold、VC Formalrun_formal仅模拟
SpyGlasslint仅模拟

“CI 中使用真实工具”表示每周集成工作流会从 OSS CAD Suite 运行该工具,但 Verible 和 svlint 除外:CI 工作流会在每个 PR 中安装并测试它们。openXC7 工作流会从 toolchain-nix 构建 openXC7,并在其代码变更时以及每周运行 Xilinx 工作流。“在硬件上测试”表示手动运行 Arty A7-100T,详见当前可用功能。“仅模拟”表示使用捕获的或具有代表性的输出进行单元测试,不会实际安装工具。

在硬件上检查设计

program_device 和 capture_serial 可在真实开发板上完成闭环:对其编程,然后读取设计输出的内容。capture_serial 需要 pyserial,可通过 serial extra 安装:

pip install "silica-eda[serial]"

run_place_route 生成比特流后,通常会进行如下检查;这里检查 Arty A7-100T 上的固件是否会回显其收到的内容:

program_device(bitstream="build/soc.bit", board="arty_a7_100t")
  -> {"success": true, ...}

capture_serial(port="/dev/serial/by-id/usb-Digilent_Digilent_USB_Device_<serial>-if01-port0",
               baud=115200, duration=6, send="hello silica\r", send_delay=0.5,
               expect="hello silica")
  -> {"matched": true, "match": "hello silica", "elapsed_s": 0.53,
      "lines": [{"t": 0.526, "text": "hello silica"}], ...}

请明确指定端口;silica 不会扫描串行设备。对于带有 FTDI JTAG+UART 桥接器的开发板(Digilent Arty、Basys、Nexys),UART 是第二个接口 if01。编程完成后,设计会立即开始运行,因此启动时打印的横幅通常会在之后开始捕获前消失:发送固件会回应的内容(如上所示),或在捕获期间按下开发板的复位按钮。如果端口不存在,或当前用户无法打开端口,结果会包含 error 和类似如下的 fix:

sudo setfacl -m u:you:rw /dev/ttyUSB1   (temporary: lasts until the device is unplugged);
permanent: sudo usermod -aG uucp you, then log out and back in

Xilinx 7 系列工作流

完成 openXC7 设置后,只需调用三次,即可将 Artix-7 设计从 RTL 部署到开发板:

synthesize(top_module="soc_top", files=["rtl/soc_top.sv", ...], target="xilinx", tool="yosys")
  -> {"netlist": "/tmp/silica_synth_.../netlist.json", "memories": [...], ...}

run_place_route(netlist="<netlist>", arch="xilinx", device="xc7a100tcsg324-1",
                constraint="arty.xdc", freq=100, output="build/soc.bit")
  -> {"output": "build/soc.bit", "timing_summary": {"clocks": [{"max_freq_mhz": 153.4, "pass": true}]}, ...}

program_device(bitstream="build/soc.bit", board="arty_a7_100t")
  -> {"success": true, ...}

device 是包含速度等级的完整器件型号。对于 Arty A7-100T,openFPGALoader 的开发板名称为 arty_a7_100t(arty 对应 35T)。

配置

控制工具选择

默认情况下,所有检测到的工具都可用,auto 会选择最合适的工具(优先开源工具)。如需按类别控制,请编辑 ~/.silica/config.toml:

[tools.simulation]
priority = ["verilator", "iverilog"]   # ordering for auto-selection
enabled  = ["verilator", "iverilog"]   # allowlist — everything else is blocked

priority 会调整 auto 的尝试顺序。enabled 是强制执行的允许列表:列表中未列出的工具都无法使用,即使模型明确要求使用该工具——请求会被拒绝,并返回错误,说明工具名称和已启用的工具,以便模型改用允许的工具重试。适用于机器上安装了不应运行的商业工具的情况(例如许可证池、隔离网络工作流)。将 enabled 留空或不设置则不作限制。

类别:simulation、synthesis、place_route、formal、lint、format、waveform、program。

安全防护

专为让自主 Agent 操作真实代码仓库而设计:

  • 文件访问限制在项目目录内——read_rtl、write_rtl、format_rtl、get_constraints、search_rtl 和 get_project_structure 会拒绝逃出项目根目录的绝对路径或 .. 路径(项目根目录由 SILICA_PROJECT_ROOT、project.root 配置项或服务启动时所在的目录指定)。相对路径会基于该根目录解析。
  • 写入操作优先显示差异——write_rtl 默认执行试运行并返回统一差异;只有明确确认后才会写入磁盘。
  • 工具卡住不会导致服务崩溃——每次工具调用都有超时限制,超时后会返回结构化错误,而不会导致会话崩溃。
命令行
命令说明
silica serve启动 MCP 服务(stdio)。未指定子命令时的默认命令。silica-eda 是同一命令。
silica setup交互式向导,用于写入 MCP 客户端配置,以通过 uvx silica-eda@latest 启动服务;参见设置向导。
silica config显示配置和检测到的工具。
silica --version、silica --help显示版本或命令列表。

版本管理与兼容性

silica 遵循语义化版本,适用对象是 MCP 客户端和 Agent 所依赖的内容:工具名称、参数及其结果中的字段。相同规则也适用于 0.x 版本。

  • 在同一主版本内,不会重命名或移除工具,不会移除参数或将其改为必填项,也不会移除或重命名结果字段。次要版本可以新增工具、可选参数和结果字段。
  • 弃用事项会在CHANGELOG.md 以及受影响工具的说明中公布,并至少提前一个次要版本告知,然后才会在下一个主版本中实施变更。
  • 每项用户可见的变更都会在合并时记入变更日志的“Unreleased”部分,并在发布时移至对应的版本标题下。

开发

git clone https://github.com/simaanc/silica-eda
cd silica-eda
uv sync                                       # editable install + dev deps
uv run ruff check silica/ tests/ scripts/
uv run pytest tests/ -q                       # integration tests skip tools that aren't installed
uv run silica serve                           # run the server from the checkout

有关规范,请参阅 CONTRIBUTING.md;有关代码布局,请参阅 docs/architecture.md;有关发布流程,请参阅 RELEASING.md。

许可证

silica 采用 GNU Affero 通用公共许可证 v3.0(AGPL-3.0-only)授权。你可以使用、修改和再分发,包括用于商业用途。如果你分发修改后的版本,或将其作为服务运行并允许他人通过网络与之交互,则必须以相同许可证公开你所作修改的源代码。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。