Verilog / SystemVerilog / UVM 信号与变量追踪 Vim 插件。
sv_trace 用于跨工程追溯 Verilog / SystemVerilog 代码中信号与变量的声明 (Declarations)、驱动源 (Drivers) 与 负载点 (Loads)。支持 RTL 模块与 SystemVerilog / UVM Class 架构。
插件采用 Vimscript 实现,搭配 Universal-Ctags 与 Ripgrep (或 grep),不需要 Python、LSP 或后台守护进程,支持 Linux 与 Windows。
- 信号与变量追溯:分析过程赋值 (
=/<=)、连续赋值 (assign)、端口连接及参数/宏定义 (parameter,localparam,`uvm_field_*)。 - 跨层追溯 (Parent Hop):若信号为子模块
input端口,自动向上寻找父模块例化点 (.port(signal)) 的驱动源。 - 模块与 Testbench 层次结构 (
:SvTraceHierarchy/<leader>sh):扫描全工程并生成 RTL 模块及 SV/UVM Class 组件层次树。 - 全路径层次结构解析 (
:SvTracePath/<leader>sH):计算并输出变量自顶层向下的完整层次路径(如top.tb.xx_agent.my_drv.case_cfg)。 - 非阻塞赋值与比较运算区分:自动区分
always块内的非阻塞赋值 (<=) 与条件判断语句中的小于等于比较 (<=)。 - 追溯历史栈:按
u/<C-o>后退,<C-i>前进。 - 电路拓扑图导出:一键导出为 Mermaid 流程图 (
e) 或 ASCII 文本树 (E)。 - 浮动窗口预览:查看匹配行上下文代码(
p键开关)。 - 零 Tags / 纯 Grep 模式:无 Ctags 缓存时自动回退为纯正则模式运行。
| 相对路径 | 说明 |
|---|---|
autoload/sv_trace.vim |
插件核心分析与渲染逻辑 |
plugin/sv_trace.vim |
命令定义、默认映射与配置选项 |
syntax/svtrace.vim |
结果窗口语法高亮 |
doc/sv_trace.txt |
Vim 帮助文档 (:help sv_trace) |
example/ |
测试与示例代码 (RTL 与 SV/UVM) |
test/run.vim |
自动化测试脚本 |
- Vim 8.0+ / Neovim 0.5+
- Ripgrep (
rg) (推荐,缺失时回退到系统grep或内置扫描) - Universal-Ctags (推荐,缺失时回退到纯 Grep 启发式匹配)
Linux 安装依赖示例:
# Ubuntu / Debian
sudo apt update && sudo apt install ripgrep universal-ctags
# Fedora / RHEL / CentOS
sudo dnf install ripgrep ctags使用 vim-plug:
Plug 'sqlmap3/sv_trace'使用 packer.nvim:
use 'sqlmap3/sv_trace'使用 lazy.nvim:
{ "sqlmap3/sv_trace" }原生 Vim Package 方式:
# Linux / macOS
mkdir -p ~/.vim/pack/plugins/start
git clone https://github.com/sqlmap3/sv_trace.git ~/.vim/pack/plugins/start/sv_trace
# Windows
mkdir -p $HOME/vimfiles/pack/plugins/start
git clone https://github.com/sqlmap3/sv_trace.git $HOME/vimfiles/pack/plugins/start/sv_trace| 快捷键 | 说明 |
|---|---|
<CR> / 双击 |
跳转到源码位置 |
t |
对光标下的信号重新发起 :SvTrace |
u / <C-o> |
返回上一次追溯结果 |
<C-i> |
前进到下一个追溯结果 |
e |
导出 Mermaid 拓扑图 |
E |
导出 ASCII 文本拓扑图 |
p |
开关浮动代码上下文预览 |
f |
结果文本过滤 |
g |
切换“按类别”/“按文件”分组显示 |
m |
切换作用域过滤 (@module) |
<C-n> / <C-p> |
上/下一个匹配条目跳转 |
<Tab> / o |
折叠/展开当前分类区域 |
c |
清理源码高亮 |
q |
关闭结果窗口 |
| 命令 | 参数 | 说明 |
|---|---|---|
:SvTrace |
[signal] |
追溯指定信号(缺省为光标下信号) |
:SvTraceDrivers |
[signal] |
仅追溯驱动源 (Drivers) |
:SvTraceLoads |
[signal] |
仅追溯负载点 (Loads) |
:SvTraceHierarchy |
— | 显示全工程模块及 Testbench 层次结构树 |
:SvTracePath |
[signal] |
计算并显示变量的全路径层次结构(如 top.tb.xx_agent.my_drv.case_cfg) |
:SvTraceLocList |
[signal] |
将结果输出到 Location List |
:SvTraceQuickfix |
[signal] |
将结果输出到 Quickfix 列表 |
:SvTraceExport |
[mermaid|ascii] |
导出拓扑图 |
:SvTracePin |
[signal] |
固定信号书签 |
:SvTraceUnpin |
[signal] |
取消固定信号 |
:SvTracePins |
— | 查看已固定的信号列表 |
:SvTraceBack |
— | 后退至上一次追溯 |
:SvTraceForward |
— | 前进至下一个追溯 |
:SvTraceTogglePreview |
— | 开关浮动代码预览 |
:SvTraceRefreshTags |
— | 强制刷新 Ctags 索引 |
:SvTraceInfo |
— | 查看当前 Root 与状态配置 |
:SvTraceClearHighlight |
— | 清除信号高亮 |
<leader>st→:SvTrace<leader>sd→:SvTraceDrivers<leader>sl→:SvTraceLoads<leader>sh→:SvTraceHierarchy<leader>sH→:SvTracePath<leader>sL→:SvTraceLocList<leader>sp→:SvTracePin<leader>sP→:SvTracePins
禁用默认映射:
let g:sv_trace_no_default_map = 1
在 _vimrc 或 init.vim 中设置:
" 1. 指定工程根目录 (单目录/多目录)
let g:sv_trace_root = '/path/to/my_chip'
" 或多目录:
" let g:sv_trace_roots = ['/path/to/rtl', '/path/to/tb']
" 2. 文件扫描与检索
let g:sv_trace_search_tool = 'auto' " 'auto' | 'rg' | 'grep'
let g:sv_trace_filetypes = ['v', 'sv', 'svh', 'vh', 'svi']
" 向上查找模块例化 Heads 的最大行数限制 (防止超大文件逐行搜到 line 0)
let g:sv_trace_inst_window = 50
" ==============================================================================
" 4. 浮动预览窗口配置 (Floating Code Preview)
" ==============================================================================
" 开启/关闭光标移动时的浮动预览窗口 (1=开启, 0=关闭)
let g:sv_trace_preview = 1
" 预览窗口显示的上下文行数
let g:sv_trace_preview_height = 5
" ==============================================================================
" 5. 作用域与高亮配置 (Scope & Highlight)
" ==============================================================================
" 结果项标注 @module 作用域标签 (1=开启)
let g:sv_trace_show_scope = 1
" 优先将当前 Buffer 所在 Module 的匹配项排在前面 (1=开启)
let g:sv_trace_prefer_current_module = 1
" 跳转源码后高亮匹配信号 (1=开启)
let g:sv_trace_highlight = 1
" ==============================================================================
" 6. Tags 策略与纯 Grep 模式配置
" ==============================================================================
" 主开关:使用 Tags 辅助提取声明 (1=开启, 0=禁用 tags 纯靠 RegEx/Grep)
let g:sv_trace_use_tags = 1
" 优先复用已有 Tags (Gutentags 缓存 / &tags / 工程 tags) 避免重复运行 Ctags
let g:sv_trace_use_existing_tags = 1
" 统一 Gutentags 缓存目录 (仅会加载与当前工程匹配的 tags 索引文件)
let g:sv_trace_tags_dir = expand('~/.cache/tags')
" 显式指定额外的固定 Tags (如 UVM 官方库 tags)
" let g:sv_trace_tags = ['/path/to/uvm-1.2/tags']
" 未找到任何已有 Tags 时是否自动运行 Ctags (1=是, 0=否)
let g:sv_trace_auto_ctags = 1
let g:sv_trace_tags_ttl = 300 " 生成的 .sv_trace_tags 缓存有效时间(秒)💡 纯 Grep / 零 Tags 运行模式:
若工程极大不希望生成或读取任何tags文件,只需设置let g:sv_trace_use_tags = 0。插件将完全基于强化的 Verilog/SV 语法正则启发式匹配提取声明,无需依赖 Ctags。
在结果窗口中按下 e 键,将自动提取当前信号的驱动与负载关系并导出为标准 Mermaid 流程图 格式:
graph TD
subgraph Drivers
node_0["example/top.v:21<br/>.dout(internal_data)"]
end
node_target(("internal_data"))
subgraph Loads
node_1["example/top.v:25<br/>assign data_out = internal_data + 8'h1;"]
end
node_0 -->|port-out| node_target
node_target --> node_1
按下 E 键可导出直观的 ASCII 文本拓扑树:
================================================================================
Topology Diagram for signal: internal_data
================================================================================
[DRIVERS] (who assigns internal_data)
├── example/top.v:21 .dout (internal_data), <port-out> @top
[TARGET SIGNAL]
└── internal_data
[LOADS] (where internal_data is read)
└── example/top.v:25 assign data_out = internal_data + 8'h1; @top
-
is_comparison_le非阻塞赋值与比较运算启发式区分:- 准确区分 Verilog 中
<=符号在always块内的 非阻塞赋值 (NBA Driver) 与在条件表达式 (if,while, 三元?,&&/||右侧,()) 内的 小于等于比较 (Comparison)。
- 准确区分 Verilog 中
-
两阶段流水线异步渲染:
- 阶段 1:瞬间提取同层与子模块匹配,先出屏渲染
Decl / Driver / Load,防止第一屏等待。 - 阶段 2:后台自动检查信号是否为当前模块
input端口;若是,则以非阻塞方式向上查找父模块例化点的赋值,完成平滑更新。
- 阶段 1:瞬间提取同层与子模块匹配,先出屏渲染
-
高性能
mtime范围缓存:- 全新的
s:file_module_ranges解析机制,一次解析后缓存文件内部所有 Module/Class 的行号区间,后续标注作用域仅需$O(1)$ 区间比较,相比传统逐行向上搜算效率提升数十倍。
- 全新的
插件内置完整的 Headless 无界面冒烟测试集,可在 Shell 中直接运行验证环境正确性:
# Windows
vim -Nu NONE -n -es -S c:/sv_trace/test/run.vim
# Linux / macOS
vim -Nu NONE -n -es -S ~/tools/sv_trace/test/run.vim测试运行完成后,结果将写入 test/out.txt。若输出末尾为 === ALL PASS === 且退出码为 0,说明插件全部功能正常。