Euclide 入门上手:从 gvim/Emacs 走向 IDE 时代
专栏:ExASIC Sept. 10, 2026, 9:39 a.m. 37 阅读
Euclide 让写 RTL 像写软件代码一样高效——实时编译反馈、智能补全、层级导航、一键重构,让工程师把精力从"找错误"转移到"写出更好的设计"上。

什么是 Euclide?

Euclide 是 Synopsys 公司推出的、基于 Eclipse 框架的专用集成开发环境(IDE),专为 SystemVerilog 芯片设计与验证打造。它的核心亮点是在编辑器中集成实时增量编译、elaboration、伪综合(pseudo-synthesis)和规则检查,编写代码的同时即可获得毫秒级的反馈。在此基础上,Euclide 还提供引擎驱动的智能代码补全(Content Assist)、标识符重命名(Rename Identifier)等重构能力,以及跨模块层次的代码导航——这些功能不再是点缀性的文本辅助,而是基于对设计完整语义理解的生产力工具。

简言之,Euclide 将软件 IDE(如 Eclipse、VS Code)的成熟体验带入了芯片设计领域——代码补全、即时错误提示、重构、层级导航,这些对于软件工程师习以为常的功能,在 RTL 开发中同样可以拥有。

为什么从 gvim/Emacs 转到 Euclide?

很多芯片设计工程师都习惯用 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 的核心优势的详细介绍:

1. 实时增量编译与即时错误反馈

对比项gvim/EmacsEuclide
语法/编译检查需手动调用 lint 工具或等待仿真边写边检查,编译/elaboration/lint 在后台持续执行
错误定位看日志文件再跳到对应行号编辑器内以波浪线(squiggly line)标记错误位置,鼠标悬停即显示问题描述

Euclide 在后台持续进行增量编译和 elaboration。代码中的语法错误、端口不匹配、未声明信号等问题会像 Word 中的拼写错误一样实时标出,而无需等待 lint 脚本或仿真器运行完毕。

2. Content Assist(自动提示、自动补全、自动实例化)

这是 Euclide 最强大的功能之一。在完整编译和完整 elaboration 引擎的支撑下,Euclide 能根据地点的具体上下文给出精准的代码建议,其能力远超纯文本编辑器的简单字符串匹配插件。

如何触发

Ctrl+Space 即可在光标位置弹出建议对话框:

  • 按一次:显示通用建议(general suggestions),包括项目中声明的元素、语言关键字、文本宏等

  • 再按一次:切换为模板建议(template suggestions),显示代码模板

选中后按 Enter 或双击即可将生成的代码插入到光标位置。

建议对话框由两个窗口组成:

  • 左窗口:建议列表,按与当前上下文的相关度从高到低排序,列表中的每一项有图标标识元素类型、名称和描述

  • 右窗口:选中建议的详细信息,包括生成代码的预览

按键盘上下键或鼠标点击浏览建议,输入文字可以过滤建议列表。

(1)自动提示(Context-Sensitive Suggestions)

Euclide 的引擎能理解当前代码上下文,提供精准的建议,包括:

  • 项目中的所有已声明元素(变量、信号、类名等)

  • 定义的语言结构和文本宏

  • 预期实现:如构造函数 (constructor) 或端口连接 (port connections)

  • 代码模板

典型场景举例

场景说明
函数体内建议当前上下文中所有可用的变量和函数
类体内自动建议 function override,生成正确的函数签名
UVM 类中根据类的成员字段,建议对应的 UVM field macros(如 uvm_field_intuvm_field_string 等)
参数传递处在字段编辑模式下再次按 Ctrl+Space,获得针对当前字段的上下文相关建议,如可用参数名称

(2)自动补全(Type Assist & Content Completion)

Euclide 提供 Type Assist(类型辅助) 功能,自动补全代码块的闭合部分:

输入内容自动补全行为
输入 begin 后按 Enter自动在下一行插入 end
输入左括号 (自动插入右括号 )
声明的下一行自动插入对应的关闭关键字(如 endmoduleendcase

快捷键相关操作还包括:

操作快捷键
补全当前语句Ctrl+Space
匹配括号/块Ctrl+Shift+P(在 { }begin/end 等之间跳转)

(3)自动实例化(Module Instantiation)

这是 Content Assist 最实用的场景之一。在 top module 中输入子模块名后按 Ctrl+Space,Euclide 会自动生成完整的模块例化模板,包含所有参数(parameter)和端口(port)

快捷键 Ctrl+Space 调出建议后选择模块例化,生成的代码中,可填充字段会显示为带边框的文本,之后通过快捷键循环编辑:

操作快捷键
在填充字段间跳转Ctrl 键,在各字段间轮流切换
对当前字段获得上下文建议在字段编辑模式下按 Ctrl+Space
在字段中填入内容直接输入值
确认退出字段编辑模式Enter,或在生成的代码块末尾输入任意字符

对比 gvim/Emacs:在 gvim 中做模块例化一般靠手动输入或借助 snipMate/UltiSnips 模板插件(需自行编写模板片段);在 Emacs 中常用 verilog-auto 功能,但同样需要预先配置。Euclide 的自动例化基于引擎对设计的完整理解,自动生成所有参数和端口,无需手动维护模板,且例化后还能在字段编辑模式下进一步补全参数值。

Content Assist 操作速查

操作当前模式快捷键
通用建议普通编辑Ctrl+Space(第1次)
模板建议普通编辑Ctrl+Space(第2次)
字段间跳转字段编辑Ctrl
字段内补全字段编辑Ctrl+Space
确认并退出字段编辑字段编辑Enter

3. 代码层级导航远超文本搜索

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 文件——编译引擎始终保持最新的层级信息。

4. Refactoring(重构能力)

gvim/Emacs 做重构往往需要手动替换或编写脚本。Euclide 提供原生的重构支持,由引擎驱动、基于完整的编译结果,而非简单的文本替换。

(1)Rename Identifier(标识符重命名 | ALT+SHIFT+R

这是最常用的重构操作。它将项目中所有编译文件中的指定标识符统一修改为新名称。

可以重命名什么? 所有代码元素——包括:

元素类型示例
信号(wire/reg)wire [31:0] data_bus → 改为 wire [31:0] data_from_axi
端口(port)input clkinput core_clk
模块名module uart_txmodule uart_v2_tx
实例名uart_tx u_instuart_tx u_inst_v2
参数/宏parameter WIDTH=8parameter DATA_WIDTH=8
函数/任务名function calc_parityfunction calc_even_parity

能否用改连线? 可以。例如有一个顶层信号 data_in 连接了多个子模块:

// top.sv
wire [31:0] data_in;
mod_a u_a (.data(data_in), ...);
mod_b u_b (.data_internal(data_in), ...);

// mod_a.sv
module mod_a (input [31:0] data, ...);
// mod_b.sv
module mod_b (input [31:0] data_internal, ...);

光标放在 data_in 的声明或任意引用处,按 ALT+SHIFT+R,输入新名 data_from_axi 后,所有编译文件中该标识符都会被同步修改——包括:

  • 顶层 wire 声明

  • 所有模块例化处的连接

  • 所有跨模块层次的引用

不支持什么? Euclide 的 Rename Identifier 是 RTL 源码层的标识符重命名,它不会改变模块的连接拓扑(如不会自动增加一个端口或实例),也不适用于门级网表中的物理 net 名(那是 Innovus rename_net / DC change_names 的范畴)。

(2)Quick Fix(快速修复)

鼠标悬停在编译错误的波浪线(squiggly line)上,Euclide 会显示问题描述并提供一键修复建议。可对同一类型的多个问题批量应用修复

例如:

  • 未声明的信号:自动插入声明

  • 缺失的端口连接:自动补全

  • 类型不匹配:自动修正

(3)Code Formatter(代码格式化 | CTRL+SHIFT+F

自动调整代码缩进、换行和垂直对齐。格式规则可在 Window → Preferences → Euclidean → Formatter 中自定义。

重构操作速查

操作快捷键说明
Rename IdentifierALT+SHIFT+R全局重命名标识符,所有编译文件同步更新
Quick Fix悬停波浪线点击,或 Ctrl+1一键修复错误/警告
Code FormatterCtrl+Shift+F格式化代码(缩进、对齐、换行)

5. 保留 Vim/Emacs 操作习惯

Euclide 内置编辑器兼容性模式,通过界面上的图标即可在 Eclipse Emacs Vim 三种模式间切换:

  • 选择 Emacs 模式:键盘绑定和命令遵循 Emacs 习惯

  • 选择 Vim 模式:使用 Vim 的按键操作

也可以在 Window → Preferences → General → Keys 中自定义所有快捷键。此外,Euclide 还通过 Vrapper 插件提供了 Vim 风格的编辑支持。

这意味着你不需要放弃 Vim/Emacs 的操作习惯来学习 Eclipse,一开始就可以用熟悉的快捷键。

6. 集成化的工作流

用 gvim/Emacs 时需要同时开多个 terminal:

  • 一个窗口写代码

  • 一个窗口跑 lint

  • 一个窗口看仿真 log

  • 一个窗口用 grep 搜索代码

Euclide 将所有这些集成到同一个界面中:

视图功能
Project Explorer文件树浏览、项目管理
Editor View代码编辑器(含语法高亮、折叠、标记出现、Type Assist、Content Assist)
Outline View当前文件的标识符结构树(类似目录)
Design Hierarchy View设计层次树(elaboration 后)
UVM Component Hierarchy ViewUVM 组件层次树
Compilation Order View编译顺序及规则集
Problems View所有错误/警告清单
Tasks View代码中的 TODO/FIXME 标签按钮

7. UVM 配置数据库支持

对于使用 UVM 的项目,Euclide 提供 UVM Configuration Database 的直观查看功能:可以查看 UVM component 层次结构中每个组件的 key-value 设置,并检查遗漏的 set/get 操作。这在调试复杂的 UVM testbench 配置问题时非常有用。

快速上手:从零开始

第一步:创建 Workspace 和 Project

运行 Euclide 启动脚本(位于 linux.gtk.x86_64/eclipse/ 目录):

euclide -workspace /home/user/euclide_workspace

在 GUI 中通过工具栏 New → Euclidean Project 新建一个项目。

第二步:创建 CUD 文件

Euclide 使用 CUD(Compilation Unit Definition)文件来描述编译单元,类似传统的 file list,但功能更强:

# 包含 RTL 文件
-f rtl/top.f

# 包含验证文件
-f dv/tb.f

# 指定 ruleset
-property -r -ruleset rtl all
-property -r -ruleset testbench dv/

# 将 IP 目录设为黑盒
-property -box ip/srams/

# 定义宏
-define+ AXI_WIDTH=64

第三步:加载设计

在 Euclide 中配置 root CUD 后,引擎会自动编译、elaborate 整个设计。关键点:

  • Ctrl+S 保存文件:每次保存都会触发增量编译,几秒内即可看到错误/警告

  • 打开 Problems View:查看所有编译错误和 lint 告警

  • 打开 Design Hierarchy View:浏览设计层次结构

第四步:代码导航和编辑的常用快捷键

以下是常用快捷键速查表:

功能快捷键说明
内容辅助/代码补全Ctrl+Space智能建议;按两次切换模板建议
跳转到声明F3Ctrl+Click跳转至标识符的声明位置
查找所有引用Ctrl+Shift+G在 Search 视图中列出所有引用位置
Trace Driver(驱动方)Ctrl+Shift+D追踪信号的驱动源
Trace Load(负载方)Ctrl+Shift+Q追踪信号的负载端
Call HierarchyCtrl+Alt+H查看 function/task 调用关系树
查找/替换(项目级)Ctrl+H → File Search项目级别全文搜索
查找/替换(文件内)Ctrl+F当前文件搜索替换
代码格式化Ctrl+Shift+F自动对齐缩进
垂直对齐Ctrl+Shift+V按指定模式对齐代码
Rename IdentifierAlt+Shift+R全局重命名标识符,所有编译文件同步更新
Quick FixCtrl+1 或悬停点击一键修复错误/警告
匹配括号/块Ctrl+Shift+P{ }begin/end 等之间跳转
Mark Occurrences点击工具栏图标高亮当前标识符的所有出现位置
打开 typeCtrl+Shift+T搜索并打开某个 type 的定义
打开资源Ctrl+Shift+R按文件名搜索打开文件
打开 OutlineCtrl+O查看当前文件的结构大纲
Design Hierarchy 视图Window → Show View → Hierarchy查看设计层次树
Problem 视图Window → Show View → Problems查看所有错误/警告
UVM 组件层级Window → Show View → UVM Components Hierarchy查看 UVM 组件树

使用现有仿真流程加载设计

对于已有成熟仿真脚本的项目,Euclide 提供 euclide_external_args 包装脚本,可以直接复用现有的仿真命令来加载设计:

euclide_external_args vcs \ 
    <VCS OPTIONS> \ 
    -f file_list.f \ 
    -euclide_args \ 
    -workspace /home/user/euclide_workspace \ 
    -project_location $ENV_NAME/tlab/

对于多步编译流程:

euclide_external_args vlogan -clean <OPTIONS> -f tb.lst
euclide_external_args vlogan <OPTIONS> -f rtl.lst
euclide_external_args vcs <OPTIONS> \ 
    -euclide_args \ 
    -workspace /home/user/euclide_workspace \ 
    -project_location $ENV_NAME/tlab/

支持的外部仿真工具包括:vloganncvlogvcsvsimvlogirunxrunncelab 等。

用现有的 gvim/Emacs 知识快速迁移

1. 选择编辑模式

启动后直接在工具栏点击兼容性模式图标,选择 Emacs 。此时 Euclide 的所有快捷键将切换为对应的 Emacs 绑定。也可通过 Window → Preferences → General → Keys 可以选择 Emacs 键方案。

Vrapper 是一个流行的 Eclipse 插件,提供 Vim 模拟。

2. 常用操作的对应关系

操作Vim 用户Emacs 用户Euclide 默认
向前搜索/Ctrl+SCtrl+J(增量搜索)/ Ctrl+K(find next)
向后搜索?Ctrl+RAlt+D(向前增量搜索)/ Ctrl+Alt+D(向后增量搜索)
保存:wCtrl+X Ctrl+SCtrl+S
撤销uCtrl+_Ctrl+Z
跳转至声明gdM-.F3Ctrl+Click
搜索项目:grepM-x rgrepCtrl+H → File Search
重命名标识符Alt+Shift+R(也映射到 Refactor 菜单)
Quick FixCtrl+1 或鼠标悬停

3. 善用鼠标(这是进步的标志)

Euclide 支持鼠标操作:

  • 悬停查看:鼠标悬停在标识符上,显示类型、参数值、注释信息

  • 悬停查看错误:鼠标悬停在错误波浪线上,显示问题描述及 quick fix 建议

  • Ctrl + 点击:超链接跳转

4. 批处理模式

如果只需要在服务器上做批处理检查(如 CI 流程),Euclide 支持无 GUI 批处理模式:

euclide -no_gui \ 
    -f compilation/mini_core.f \ 
    -job_type problem_report \ 
    -output_dir compilation/batch_mode_results/

从 gvim/Emacs 到 Euclide:需要时间但值得

对于芯片设计师来说,从传统编辑器转向 IDE 的心态转变是最关键的:

  1. 不要担心失去控制——Euclide 的 Emacs/Vim 兼容模式能保留你的肌肉记忆

  2. 不要害怕 IDE 的"重量"——实时编译反馈和智能导航节省的时间远大于 IDE 启动的时间

  3. 从最简单的事情开始——先用 Euclide 打开代码浏览,再用 Content Assist 写模块例化,然后逐步体验重构、Trace Driver 等功能

全文总结

能力gvim/EmacsEuclide
编译/语法检查需要手动运行 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

感谢阅读,更多文章点击这里:【专栏:ExASIC】
公众号:【ExASIC】

分享数字集成电路设计中的经验和方法。分享让工作更轻松。

最新20篇