Euclide 是 Synopsys 公司推出的、基于 Eclipse 框架的专用集成开发环境(IDE),专为 SystemVerilog 芯片设计与验证打造。它的核心亮点是在编辑器中集成实时增量编译、elaboration、伪综合(pseudo-synthesis)和规则检查,编写代码的同时即可获得毫秒级的反馈。在此基础上,Euclide 还提供引擎驱动的智能代码补全(Content Assist)、标识符重命名(Rename Identifier)等重构能力,以及跨模块层次的代码导航——这些功能不再是点缀性的文本辅助,而是基于对设计完整语义理解的生产力工具。
简言之,Euclide 将软件 IDE(如 Eclipse、VS Code)的成熟体验带入了芯片设计领域——代码补全、即时错误提示、重构、层级导航,这些对于软件工程师习以为常的功能,在 RTL 开发中同样可以拥有。
很多芯片设计工程师都习惯用 gvim 或 Emacs 写 Verilog。这些编辑器功能强大、可高度定制,在传统环境下有其独特优势。但面对现代超大规模数字芯片设计(数百万行代码、复杂的 UVM 验证环境、多时钟域),纯文本编辑器的短板也越来越明显。
| 能力维度 | gvim/Emacs的做法 | Euclide的做法 |
|---|---|---|
| 代码检查 | 写完后跑 lint/仿真,查看日志再定位 | 边写边实时反馈,波浪线标注错误位置 |
| 代码补全 | 依赖 snipMate/UltiSnips/auto-complete 等插件,模板需手动维护 | Content Assist 引擎驱动,理解代码语义,一键生成模块例化 |
| 代码导航 | 依赖 ctags/cscope/gtags,需手动维护索引 | 基于实时编译结果,Ctrl+Click 跳转、Trace Driver/Load、Call Hierarchy |
| 代码重构 | 手动搜索替换或写脚本,可能误伤无关文本 | Rename Identifier 引擎驱动,精准识别语句级引用,跨文件同步更新 |
| 设计理解 | 手动跟踪模块层次、端口连接 | Design Hierarchy View、UVM Component Hierarchy View 自动展示 |
| 工作流集成 | 多窗口/多 terminal 间切换 | 统一 IDE 界面,集编辑、编译、导航、调试于一体 |
以下是 Euclide 相对于 gvim/Emacs 的核心优势的详细介绍:
| 对比项 | gvim/Emacs | Euclide |
|---|---|---|
| 语法/编译检查 | 需手动调用 lint 工具或等待仿真 | 边写边检查,编译/elaboration/lint 在后台持续执行 |
| 错误定位 | 看日志文件再跳到对应行号 | 编辑器内以波浪线(squiggly line)标记错误位置,鼠标悬停即显示问题描述 |
Euclide 在后台持续进行增量编译和 elaboration。代码中的语法错误、端口不匹配、未声明信号等问题会像 Word 中的拼写错误一样实时标出,而无需等待 lint 脚本或仿真器运行完毕。
这是 Euclide 最强大的功能之一。在完整编译和完整 elaboration 引擎的支撑下,Euclide 能根据地点的具体上下文给出精准的代码建议,其能力远超纯文本编辑器的简单字符串匹配插件。
按 Ctrl+Space 即可在光标位置弹出建议对话框:
按一次:显示通用建议(general suggestions),包括项目中声明的元素、语言关键字、文本宏等
再按一次:切换为模板建议(template suggestions),显示代码模板
选中后按 Enter 或双击即可将生成的代码插入到光标位置。
建议对话框由两个窗口组成:
左窗口:建议列表,按与当前上下文的相关度从高到低排序,列表中的每一项有图标标识元素类型、名称和描述
右窗口:选中建议的详细信息,包括生成代码的预览
按键盘上下键或鼠标点击浏览建议,输入文字可以过滤建议列表。
Euclide 的引擎能理解当前代码上下文,提供精准的建议,包括:
项目中的所有已声明元素(变量、信号、类名等)
定义的语言结构和文本宏
预期实现:如构造函数 (constructor) 或端口连接 (port connections)
代码模板
典型场景举例:
| 场景 | 说明 |
|---|---|
| 函数体内 | 建议当前上下文中所有可用的变量和函数 |
| 类体内 | 自动建议 function override,生成正确的函数签名 |
| UVM 类中 | 根据类的成员字段,建议对应的 UVM field macros(如 uvm_field_int、uvm_field_string 等) |
| 参数传递处 | 在字段编辑模式下再次按 Ctrl+Space,获得针对当前字段的上下文相关建议,如可用参数名称 |
Euclide 提供 Type Assist(类型辅助) 功能,自动补全代码块的闭合部分:
| 输入内容 | 自动补全行为 |
|---|---|
输入 begin 后按 Enter | 自动在下一行插入 end |
输入左括号 ( | 自动插入右括号 ) |
| 声明的下一行 | 自动插入对应的关闭关键字(如 endmodule、endcase) |
快捷键相关操作还包括:
| 操作 | 快捷键 |
|---|---|
| 补全当前语句 | Ctrl+Space |
| 匹配括号/块 | Ctrl+Shift+P(在 { }、begin/end 等之间跳转) |
这是 Content Assist 最实用的场景之一。在 top module 中输入子模块名后按 Ctrl+Space,Euclide 会自动生成完整的模块例化模板,包含所有参数(parameter)和端口(port)。
快捷键 Ctrl+Space 调出建议后选择模块例化,生成的代码中,可填充字段会显示为带边框的文本,之后通过快捷键循环编辑:
| 操作 | 快捷键 |
|---|---|
| 在填充字段间跳转 | 按 Ctrl 键,在各字段间轮流切换 |
| 对当前字段获得上下文建议 | 在字段编辑模式下按 Ctrl+Space |
| 在字段中填入内容 | 直接输入值 |
| 确认退出字段编辑模式 | 按 Enter,或在生成的代码块末尾输入任意字符 |
对比 gvim/Emacs:在 gvim 中做模块例化一般靠手动输入或借助 snipMate/UltiSnips 模板插件(需自行编写模板片段);在 Emacs 中常用 verilog-auto 功能,但同样需要预先配置。Euclide 的自动例化基于引擎对设计的完整理解,自动生成所有参数和端口,无需手动维护模板,且例化后还能在字段编辑模式下进一步补全参数值。
| 操作 | 当前模式 | 快捷键 |
|---|---|---|
| 通用建议 | 普通编辑 | Ctrl+Space(第1次) |
| 模板建议 | 普通编辑 | Ctrl+Space(第2次) |
| 字段间跳转 | 字段编辑 | Ctrl |
| 字段内补全 | 字段编辑 | Ctrl+Space |
| 确认并退出字段编辑 | 字段编辑 | Enter |
Emacs 的 ctags / gtags 或 gvim 的 cscope 虽然能提供跳转功能,但需要额外维护索引,且跨文件调用链的跟踪非常有限。
Euclide 支持:
Ctrl + Click(代码超链接):按住 Ctrl 悬停在标识符上,一键跳转到声明位置
CTRL+SHIFT+G:查找项目中所有对该标识符的引用
CTRL+SHIFT+D CTRL+SHIFT+Q(Trace Driver Trace Load):追踪信号的驱动方和负载方,自动在 Search 视图中列出所有位置
CTRL+ALT+H(Call Hierarchy):查看 function/task/property 的调用链
设计层级视图(Design Hierarchy View):以树形结构展示编译后的完整设计层次结构,支持实例名称搜索
以上这些功能都不需要手动生成 tags 文件——编译引擎始终保持最新的层级信息。
gvim/Emacs 做重构往往需要手动替换或编写脚本。Euclide 提供原生的重构支持,由引擎驱动、基于完整的编译结果,而非简单的文本替换。
ALT+SHIFT+R)这是最常用的重构操作。它将项目中所有编译文件中的指定标识符统一修改为新名称。
可以重命名什么? 所有代码元素——包括:
| 元素类型 | 示例 |
|---|---|
| 信号(wire/reg) | wire [31:0] data_bus → 改为 wire [31:0] data_from_axi |
| 端口(port) | input clk → input core_clk |
| 模块名 | module uart_tx → module uart_v2_tx |
| 实例名 | uart_tx u_inst → uart_tx u_inst_v2 |
| 参数/宏 | parameter WIDTH=8 → parameter DATA_WIDTH=8 |
| 函数/任务名 | function calc_parity → function calc_even_parity |
能否用改连线? 可以。例如有一个顶层信号 data_in 连接了多个子模块:
光标放在 data_in 的声明或任意引用处,按 ALT+SHIFT+R,输入新名 data_from_axi 后,所有编译文件中该标识符都会被同步修改——包括:
顶层 wire 声明
所有模块例化处的连接
所有跨模块层次的引用
不支持什么? Euclide 的 Rename Identifier 是 RTL 源码层的标识符重命名,它不会改变模块的连接拓扑(如不会自动增加一个端口或实例),也不适用于门级网表中的物理 net 名(那是 Innovus rename_net / DC change_names 的范畴)。
鼠标悬停在编译错误的波浪线(squiggly line)上,Euclide 会显示问题描述并提供一键修复建议。可对同一类型的多个问题批量应用修复。
例如:
未声明的信号:自动插入声明
缺失的端口连接:自动补全
类型不匹配:自动修正
CTRL+SHIFT+F)自动调整代码缩进、换行和垂直对齐。格式规则可在 Window → Preferences → Euclidean → Formatter 中自定义。
| 操作 | 快捷键 | 说明 |
|---|---|---|
| Rename Identifier | ALT+SHIFT+R | 全局重命名标识符,所有编译文件同步更新 |
| Quick Fix | 悬停波浪线点击,或 Ctrl+1 | 一键修复错误/警告 |
| Code Formatter | Ctrl+Shift+F | 格式化代码(缩进、对齐、换行) |
Euclide 内置编辑器兼容性模式,通过界面上的图标即可在 Eclipse Emacs Vim 三种模式间切换:
选择 Emacs 模式:键盘绑定和命令遵循 Emacs 习惯
选择 Vim 模式:使用 Vim 的按键操作
也可以在 Window → Preferences → General → Keys 中自定义所有快捷键。此外,Euclide 还通过 Vrapper 插件提供了 Vim 风格的编辑支持。
这意味着你不需要放弃 Vim/Emacs 的操作习惯来学习 Eclipse,一开始就可以用熟悉的快捷键。
用 gvim/Emacs 时需要同时开多个 terminal:
一个窗口写代码
一个窗口跑 lint
一个窗口看仿真 log
一个窗口用 grep 搜索代码
Euclide 将所有这些集成到同一个界面中:
| 视图 | 功能 |
|---|---|
| Project Explorer | 文件树浏览、项目管理 |
| Editor View | 代码编辑器(含语法高亮、折叠、标记出现、Type Assist、Content Assist) |
| Outline View | 当前文件的标识符结构树(类似目录) |
| Design Hierarchy View | 设计层次树(elaboration 后) |
| UVM Component Hierarchy View | UVM 组件层次树 |
| Compilation Order View | 编译顺序及规则集 |
| Problems View | 所有错误/警告清单 |
| Tasks View | 代码中的 TODO/FIXME 标签按钮 |
对于使用 UVM 的项目,Euclide 提供 UVM Configuration Database 的直观查看功能:可以查看 UVM component 层次结构中每个组件的 key-value 设置,并检查遗漏的 set/get 操作。这在调试复杂的 UVM testbench 配置问题时非常有用。
运行 Euclide 启动脚本(位于 linux.gtk.x86_64/eclipse/ 目录):
在 GUI 中通过工具栏 New → Euclidean Project 新建一个项目。
Euclide 使用 CUD(Compilation Unit Definition)文件来描述编译单元,类似传统的 file list,但功能更强:
在 Euclide 中配置 root CUD 后,引擎会自动编译、elaborate 整个设计。关键点:
按 Ctrl+S 保存文件:每次保存都会触发增量编译,几秒内即可看到错误/警告
打开 Problems View:查看所有编译错误和 lint 告警
打开 Design Hierarchy View:浏览设计层次结构
以下是常用快捷键速查表:
| 功能 | 快捷键 | 说明 |
|---|---|---|
| 内容辅助/代码补全 | Ctrl+Space | 智能建议;按两次切换模板建议 |
| 跳转到声明 | F3 或 Ctrl+Click | 跳转至标识符的声明位置 |
| 查找所有引用 | Ctrl+Shift+G | 在 Search 视图中列出所有引用位置 |
| Trace Driver(驱动方) | Ctrl+Shift+D | 追踪信号的驱动源 |
| Trace Load(负载方) | Ctrl+Shift+Q | 追踪信号的负载端 |
| Call Hierarchy | Ctrl+Alt+H | 查看 function/task 调用关系树 |
| 查找/替换(项目级) | Ctrl+H → File Search | 项目级别全文搜索 |
| 查找/替换(文件内) | Ctrl+F | 当前文件搜索替换 |
| 代码格式化 | Ctrl+Shift+F | 自动对齐缩进 |
| 垂直对齐 | Ctrl+Shift+V | 按指定模式对齐代码 |
| Rename Identifier | Alt+Shift+R | 全局重命名标识符,所有编译文件同步更新 |
| Quick Fix | Ctrl+1 或悬停点击 | 一键修复错误/警告 |
| 匹配括号/块 | Ctrl+Shift+P | 在 { }、begin/end 等之间跳转 |
| Mark Occurrences | 点击工具栏图标 | 高亮当前标识符的所有出现位置 |
| 打开 type | Ctrl+Shift+T | 搜索并打开某个 type 的定义 |
| 打开资源 | Ctrl+Shift+R | 按文件名搜索打开文件 |
| 打开 Outline | Ctrl+O | 查看当前文件的结构大纲 |
| Design Hierarchy 视图 | Window → Show View → Hierarchy | 查看设计层次树 |
| Problem 视图 | Window → Show View → Problems | 查看所有错误/警告 |
| UVM 组件层级 | Window → Show View → UVM Components Hierarchy | 查看 UVM 组件树 |
对于已有成熟仿真脚本的项目,Euclide 提供 euclide_external_args 包装脚本,可以直接复用现有的仿真命令来加载设计:
对于多步编译流程:
支持的外部仿真工具包括:vlogan、ncvlog、vcs、vsim、vlog、irun、xrun、ncelab 等。
启动后直接在工具栏点击兼容性模式图标,选择 Emacs 。此时 Euclide 的所有快捷键将切换为对应的 Emacs 绑定。也可通过 Window → Preferences → General → Keys 可以选择 Emacs 键方案。
Vrapper 是一个流行的 Eclipse 插件,提供 Vim 模拟。
| 操作 | Vim 用户 | Emacs 用户 | Euclide 默认 |
|---|---|---|---|
| 向前搜索 | / | Ctrl+S | Ctrl+J(增量搜索)/ Ctrl+K(find next) |
| 向后搜索 | ? | Ctrl+R | Alt+D(向前增量搜索)/ Ctrl+Alt+D(向后增量搜索) |
| 保存 | :w | Ctrl+X Ctrl+S | Ctrl+S |
| 撤销 | u | Ctrl+_ | Ctrl+Z |
| 跳转至声明 | gd | M-. | F3 或 Ctrl+Click |
| 搜索项目 | :grep | M-x rgrep | Ctrl+H → File Search |
| 重命名标识符 | — | — | Alt+Shift+R(也映射到 Refactor 菜单) |
| Quick Fix | — | — | Ctrl+1 或鼠标悬停 |
Euclide 支持鼠标操作:
悬停查看:鼠标悬停在标识符上,显示类型、参数值、注释信息
悬停查看错误:鼠标悬停在错误波浪线上,显示问题描述及 quick fix 建议
Ctrl + 点击:超链接跳转
如果只需要在服务器上做批处理检查(如 CI 流程),Euclide 支持无 GUI 批处理模式:
对于芯片设计师来说,从传统编辑器转向 IDE 的心态转变是最关键的:
不要担心失去控制——Euclide 的 Emacs/Vim 兼容模式能保留你的肌肉记忆
不要害怕 IDE 的"重量"——实时编译反馈和智能导航节省的时间远大于 IDE 启动的时间
从最简单的事情开始——先用 Euclide 打开代码浏览,再用 Content Assist 写模块例化,然后逐步体验重构、Trace Driver 等功能
| 能力 | gvim/Emacs | Euclide |
|---|---|---|
| 编译/语法检查 | 需要手动运行 lint 脚本 | 实时增量编译,即时反馈 |
| 代码补全 | 依赖插件(snipMate/UltiSnips/auto-complete) | Content Assist:通用建议 + 模板建议,引擎驱动 |
| 模块例化 | 手动输入或插件模板 | 自动生成完整例化模板,含参数和端口 |
| 代码导航 | 依赖 tags/cscope,需维护索引 | 内置完整导航,无需手动维护 |
| 重构-重命名 | 手动替换或批量文本搜索替换 | 引擎驱动的 Rename Identifier,识别语句级引用,不破坏无关文本 |
| 重构-快速修复 | 无 | Quick Fix,单条或批量修复 |
| 设计层级 | 手动跟踪 | Design Hierarchy View 自动展示 |
| UVM 支持 | 无 | UVM Component Hierarchy、Config DB 查看 |
| 兼容现有习惯 | — | 内置 Emacs/Vim 编辑模式 |
一句话总结:Euclide 让写 RTL 像写软件代码一样高效——实时编译反馈、智能补全、层级导航、一键重构,让工程师把精力从"找错误"转移到"写出更好的设计"上。
参考资料:
Synopsys Euclidean Reference Guide (T-2022.06-SP2)
Synopsys SolvNetPlus: https://solvnetplus.synopsys.com
分享数字集成电路设计中的经验和方法。分享让工作更轻松。