做数字IC验证的,几乎没有不用Verdi的。无论是跑仿真看fsdb波形,还是追RTL代码逻辑、查netlist连接关系,Verdi基本就是日常工作离不开的伙伴。但有个现象我这两年碰到过好几次,周围同事也经常遇到,就是Verdi从2020版升到2021版之后,不少人突然找不到“Find String”这个搜索框了。明明就是想在代码窗口里搜一个信号名、字符串或者关键字,结果菜单翻了一圈,工具栏找了一遍,愣是没看到熟悉的输入框。第一反应就是版本改了、功能被挪走了,或者干脆是license出了问题。其实真不是Verdi把功能砍了,是2021版的UI布局和默认设置跟老版本不一样了,加上搜索功能入口本来就有好几个层级,不熟悉的人确实很容易懵。这篇文章我不打算光讲一个“哪里点”的问题,而是把Verdi 2021里跟字符串搜索、信号搜索相关的所有实用入口、快捷键、操作习惯一次性理清楚,帮你把调试体验拉回甚至超过以前的水平。
先说一下这篇文章适合谁看。如果你正在用Verdi 2021.x版本做仿真调试,尤其从旧版本迁移上来之后感觉搜索功能“失踪”,那本文就是为你准备的。即便你用的不是2021版,而是2022、2023这几个后续版本,里面的绝大部分操作路径和快捷键依然是通用的,只是菜单名或图标位置可能有细微差异。文章核心就解决三件事:怎么把“Find String”这个经典搜索框找回来;在RTL源码窗口、nWave波形窗口、Signal List信号列表、Netlist Browser这些不同场景下分别怎么高效搜索;以及在搜索过程中经常踩到哪些坑、怎么绕开。
1. 界面布局与搜索入口:为什么2021版“找不到”Find String
很多人在2021版里找不到Find String框,第一反应是“功能被删了”,但其实它一直都在,只是不再像老版本那样默认浮在代码窗口边上,或者以一个非常显眼的固定搜索条形式摆在那里。新版Verdi把搜索入口重新组织过,更强调“按功能区分”,所以你要先搞清楚自己到底想搜什么:是搜RTL代码里的文本字符串,还是搜波形窗口里的信号名,还是搜原理图/网表里的instance名。这三类搜索,入口全都不一样。
1.1 默认界面变化与菜单路径
Verdi 2021的默认界面和老版本相比,工具栏默认只显示一小部分常用按钮,搜索相关按钮默认并不全部摊开。以前你习惯在工具栏上直接看到一个“Find”或者放大镜图标的输入框,新版默认是收起来的。这时候最稳的方式是走菜单路径,不依赖图标。
在打开RTL源码文件(.v、.sv、.vhd)之后,如果要在当前代码窗口搜索字符串,经典路径是:
Edit -> Find String快捷键是Ctrl+F(Linux环境下也可能是Ctrl+F或F,取决于你的键盘映射)。这个菜单项打开的就是那个非常经典的Find String对话框,支持输入搜索内容、设置搜索范围(当前文件/所有打开文件/整个目录)、选择是否区分大小写、是否按正则表达式搜索等。如果你发现Ctrl+F没反应,先别怀疑键盘,建议手动点一下Edit -> Find String,看对话框能不能弹出来。能弹出来就说明快捷键被改了,进Tools -> Preference -> Hotkeys里重新绑定就好。
还有一个容易忽略的地方:在RTL代码窗口的右上角或工具栏区域,新版Verdi有一个“Quick Search”的小放大镜图标,点击后会在代码窗口顶部弹出一个小型搜索条,叫Quick Search Bar。这个搜索条跟经典Find String对话框是两套东西,它可以做到边输入边高亮,但功能选项少很多,不支持正则,也不支持全目录搜索。很多人觉得自己“找不到Find String框”,其实是不小心只会用Quick Search Bar,并没有打开那个完整的Find String对话框。
1.2 为什么以前“看得到”,现在“看不到”了
我在实际使用中观察下来,Verdi 2021之所以让大家觉得Find String框“消失”,主要有三个原因:
第一个原因是工具栏定制问题。Verdi的工具栏是可以自己拖拽定制的,如果你从旧版本导入了老的layout或配置文件,有些按钮会错乱或者干脆没加载进来。反过来,如果你没有导入旧配置,新版的默认工具栏又不会把搜索框直接放出来。这就导致一个尴尬局面:老用户找不到,新用户不知道有。解决方法是右键点击工具栏空白区域,选“Customize”或“Toolbar Setup”,在搜索相关分类里把Find String按钮拖到常用工具栏。
第二个原因是窗口焦点问题。Verdi是多窗口联动工具,同一个操作在不同的焦点窗口下行为完全不一样。比如焦点在nWave波形窗口时,菜单栏上可能不会出现“Edit -> Find String”这个选项,而是变成“Search -> Signal/Object”之类的条目。有些用户眼睛只看菜单栏第一层,看到没有Find String就以为功能没了,其实是焦点窗口不对。
第三个原因更容易被忽视——RTL代码窗口如果处于“Read Only”或者“Source Browser”模式下,部分菜单项会被置灰或隐藏。这种情况通常发生在你打开的是综合后的网表文件,或者从Library Browser里跳转出来的只读源文件上。解决方法是确认当前文件处于可编辑的源码视图模式,或者直接换一个Source窗口再试。
2. RTL源码窗口里的搜索核心方法与快捷键
明确了菜单路径之后,真正影响调试效率的,其实是你能不能熟练运用各种搜索方式和快捷键组合。说实话,如果只是偶尔搜一两个信号名,随便怎么点都行。但如果你是在追一个跨模块的bug,需要在几十个文件里反复搜索同一个信号的驱动和负载,那搜索手法的差别就是几小时和十几分钟的差别。
2.1 最经典的Find String对话框完整用法
按Ctrl+F打开的Find String对话框,看起来很简单,里面有几个选项,但很多人用了一年都没用全过。我逐个说一下我在实践中认为最有用的选项。
Search In区域,默认是“Current File”。如果你要搜整个工程或某个目录,可以选“All Opened Files”或者“Specified Directory”。这里有个细节:选“Specified Directory”的时候,可以勾选“Include Subdirectories”,并且可以指定文件扩展名过滤,比如只搜.v和.sv文件,避免把一堆生成文件、日志文件也扫一遍。这样搜出来的结果列表里,每一条都会带上文件和行号,双击就能跳转。
Match Case,区分大小写。SystemVerilog里信号命名通常是大小写敏感的,这个选项默认是关的,但如果你在搜“clk”的时候总把“CLK”“Clk”也搜出来,会特别烦。我个人的习惯是调试RTL时把这个勾上,调试脚本或者配置文件时再放开。
Regular Expression,正则表达式,这是很多人的认知盲区。Verdi的Find String支持正则后,你可以一次性匹配多种命名模式。举个例子,你要找所有带rd_data前缀的信号,直接搜^rd_data.*,或者搜rd_data_[0-9]+这种带数字编号的总线信号,一次就能全部列出来。这个功能用在查找总线信号、查找带特定后缀的打拍信号上非常高效。
Search Backward,向光标上方搜索,快捷键是Shift+Ctrl+F或者搜索框里的方向选项。这个在长文件里往上翻代码时很实用,不用每次滚到文件头再往下搜。
Search and Mark,这个选项建议大家勾上,它会在所有匹配到的地方做一个书签标记(bookmark)。之后你可以用F2在标记之间跳转,一键在信号的多个驱动点、多个例化点之间来回切。我排查多驱动冲突问题时基本离不开这个功能。
2.2 常用快捷键组合,背熟能省一半时间
搜索快捷键这块,很多老手也只记住了Ctrl+F,但其实跟查找相关的还有一组非常常用的快捷键,列出来你就知道了:
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 打开Find String对话框 | Ctrl+F | 最基础,不解释 |
| 在搜索结果中跳转上一处/下一处 | F3 / Shift+F3 | 打开对话框后按F3可以连续查找下一个 |
| 打开Quick Search Bar | Ctrl+Shift+F或工具栏放大镜 | 边输入边高亮,轻量搜索 |
| 跳到指定行号 | Ctrl+G | 配合搜索结果快速定位 |
| 添加/跳转书签 | F2 / Next Bookmark | 常在源码大文件中定位 |
| 搜索选中信号并高亮所有例化位置 | 选中信号后按x | 这是Verdi独有特性,会高亮所有同名信号 |
最后这个x是我特别想强调的。在RTL代码窗口里,用鼠标双击选中一个信号名,再按小写字母x,Verdi会在当前窗口里把所有出现该信号名的地方都高亮出来,而且不同驱动类型会有不同颜色。这个功能在某些老版本里叫“Highlight Selected Object”,2021版里依然保留。它和Find String搭配起来非常好用:先用x高亮全局,再用Find String精确查找某个具体位置,基本能应对90%的信号定位场景。
2.3 Quick Search Bar与Find String的取舍
有些朋友升级2021版后发现,Quick Search Bar好像挺好用的,就不纠结Find String框了。这里我提醒一句,这两个搜索方式各有各的适用场景,最好都掌握。
Quick Search Bar的优势是即时显示、低干扰,尤其适合你大概记得信号名的某一段、但又不确定全称的时候,边打字边看命中情况。它默认不支持正则,也不支持跨文件搜索,所以一旦你判断需要搜目录级别或者多文件时,还是得回到完整的Find String对话框。
另外,Quick Search Bar有一个小问题:在超大文件(比如一个10万行的top.v)里输入搜索词,会有轻微卡顿,因为它每输入一个字符就要实时扫描整个文件。在这种场景下,反而是传统的Find String对话框+一次性列出所有匹配的方式更流畅。
3. 波形与信号列表中的搜索:nWave和Signal List的隐藏操作
字符串搜索不只在RTL代码里用,做调试时更常遇到的一个场景是:打开fsdb波形之后,你需要在Signal List里快速定位某个信号,或者在nWave的波形窗口中把某个信号加到波形里看timing。这个环节如果全靠鼠标在列表里滚动查找,效率极低。
3.1 Signal List窗口的Find与Filter
Verdi里,打开fsdb波形时通常会有一个“Signal List”窗口(也叫Signal Browser),里面列出了当前设计层级下的所有信号。在2021版中,这个窗口顶部有一个Filter输入框,也就是很多人期待的“Find String”样式的小框。它支持你直接输入信号名的任意一部分,列表会实时过滤。
这个Filter和传统的Find String有些不同——它是按关键字匹配并显示所有包含该关键字的信号,不是传统的“跳转到下一个匹配处”。如果你更习惯老式搜索,可以在Signal List窗口内直接按Ctrl+F,会弹出一个Find对话框,用来在列表里定位信号名。这两种方式我觉得可以按场景选:
- 信号数量少(几十个以内),直接用Filter输入关键词,一眼就能看到目标;
- 信号数量巨大(几千上万个),尤其来自复杂SoC设计时,建议用
Ctrl+F快速跳转,避免Filter把列表过滤得太狠,反而不容易判断信号所在的原先位置。
3.2 在nWave波形窗口里向波形图添加信号的3种快捷方式
nWave是Verdi的波形显示窗口,日常添加信号最原始的方法是:在Signal List里点中信号,然后拖到波形区。但调试时效率最高的其实是另外几种方式。
方式一:在nWave窗口按Ctrl+A后在波形区输入信号名。直接在波形窗口激活的前提下,按快捷键或者在filter区域输入信号名片段,Verdi会从已加载的信号列表里匹配,选中后回车就能加波形。这种方式适合你知道信号名、但暂时不想在Signal List里翻找的情况。
方式二:在RTL代码窗口里选中信号,按Ctrl+W,这一步我们通常叫“送波形”。它是把信号从代码窗口直接发送到nWave波形窗口,非常方便。尤其在做前面说的“找一个信号的驱动点”时,看到哪个信号需要看时序,直接Ctrl+W送进去,完全不用去Signal List里找。注意2021版中Ctrl+W默认是“Add to Waveform”,如果没反应,检查一下是不是和某个系统快捷键冲突了。
方式三:使用nWave的Search功能,搜索信号对象。在nWave窗口菜单中选择Search -> Signal/Object,会弹出搜索界面,支持按信号名搜索、按“contains”模糊匹配,甚至支持搜索instance路径里的关键字。这个功能其实对标的就是Find String在波形场景下的变体,很多人不知道,所以总觉得只有在代码窗口才能搜信号。
3.3 Netlist Browser里的搜索技巧
除了写RTL代码和看波形,工程师经常还会打开综合后的网表(netlist)。网表文件动辄几十万行,信号名、instance名都是一长串带路径的字符串,这时候在网表界面里搜索的能力就变得更重要了。
在Netlist Browser(原理图/网表视图)中,查找instance或net的快捷键通常是Ctrl+F,同样会弹出Find String对话框,但搜索范围是当前网表视图。更高级的用法是在Netlist Browser左侧的“Search”区域,输入一个instance名或net名的通配符,比如*u_uart*,Verdi会过滤出所有名字里含u_uart的instance。这个操作在追一个信号跨了多少级、经过哪些module时特别有用。
再说一个比较隐蔽的:在原理图视图里,鼠标悬停在一个net上时,按F可以高亮该net的所有连接点;按h(hierarchy)可以上下跳转层级。这些虽然不是字符串搜索,但属于“对象搜索”的范畴,很多做后仿或查连接关系的朋友没有充分利用起来,实际上它们比反复输入信号名要高效得多。
4. 常见问题排查与调试效率提升的配套技巧
搜索功能本身说完了,但我知道实际操作中大家更容易遇到的问题其实是“找得到入口但效果不对”,或者“搜索功能好好地突然失灵了”。这些坑我基本都踩过一遍,集中整理一下,顺便把几个配合搜索一起使用、能让调试效率整体上一个台阶的Verdi自带功能也讲清楚。
4.1 经典问题定位:找不到输入框时的排查步骤
如果你在2021版中遇到“没有Find String框”的现象,按下面这个顺序检查,一般几分钟就能定位:
- 确认焦点窗口是RTL代码窗口(Source Browser),不是nWave,也不是Netlist Browser。不同窗口的菜单结构不一样,焦点不对自然看不到对应菜单项。
- 确认菜单路径是
Edit -> Find String,如果菜单里这一项是灰色,说明当前文件处于只读模式或不支持编辑的视图,换一个文件或重新打开该文件。 - 尝试快捷键
Ctrl+F,如果无反应,进Tools -> Preference -> Hotkeys搜索“Find”,看看快捷键是否被修改或冲突。 - 看看工具栏图标,右键工具栏空白处,选择“Customize”,在“Edit”或“Search”分类下,把Find String按钮或搜索框拖回工具栏。
- 如果以上都不行,可以退出Verdi,删除当前用户的Verdi配置文件(通常是用户home目录下的
.verdi*或.synopsys_verdi*及novas.rc、verdi.rc之类的文件),重启Verdi恢复默认界面布局。做这一步前建议先备份原配置文件,避免其他自定义设置丢失。
这些步骤里,第5步其实属于“终极手段”,但实际遇到界面异常时往往最有效。Verdi的界面状态存在用户的配置文件里,旧版本的配置在新版本下加载时偶尔会“半生效”,导致部分菜单和工具栏处于不完整状态。删除配置重启后,界面恢复默认,搜索功能一般也就回来了。
4.2 搜索不到结果?先检查这4个地方
搜索框明明能打开,输入信号名却搜不到东西,这种情况也挺常见,而且90%不是Verdi坏了,而是搜索条件设置不对。
第一,检查当前文件是否真的包含了你要搜的信号。听起来像废话,但做过顶层集成的人应该都懂:有时候你打开的是某个模块的低层文件,信号名其实是在上一层才能看到的。用Search In里的“All Opened Files”或“Specified Directory”能有效避免这种问题。
第二,检查大小写匹配。SystemVerilog里信号命名确实区分大小写,如果你不确定信号名里data还是Data,干脆别勾Match Case,或者用正则[Dd]ata。
第三,检查是不是有不可见字符。复制信号名时如果带上空格、Tab或者换行,搜索时自然匹配不到任何内容。遇到这种情况,可以手动重新输入信号名的核心部分,不要直接粘贴一串看起来很对的字符串。
第四,如果搜索结果的列表弹出来了,但双击不跳转,大概率是文件路径映射问题。Verdi有时候会显示一个文件的内容,但内部记录的路径和当前打开的文件不一致(多发生在从波形反向定位到代码的场景)。解决方式是在该文件窗口内,用File -> Open重新打开一次对应文件,让Verdi重新建立路径映射。
4.3 搜索配合其他功能:Store/Replay、Signal History 与书签系统
搜索只是定位问题的第一步,真正提高调试效率还要靠搜索之后的“记录、整理、回放”能力。Verdi的Store/Replay机制很多人不知道,但在找复杂bug时极为好用。
当你打开fsdb波形,加了一些信号,缩放到了某个感兴趣的时序区间,还按了几次搜索跳转位置后,可以进Window -> Store Window Layout把这个状态保存下来(或者直接存为xxx.rc文件)。之后无论何时重新打开Verdi,只要执行对应的Replay或直接加载这个布局,之前配置的窗口位置、信号列表、缩放区间全都会恢复。这个功能在需要反复对比同一段信号、或者把问题交接给同事时特别有价值。我之前调试一个跨时钟域数据同步问题时,就是把“关键信号+搜索匹配点+高亮设置”存成了一个rc文件,第二天打开还在,省了半小时重新配置的时间。
另外,nWave窗口左侧通常会有一个“History”面板,记录你在这段时间内所有添加到波形区的信号操作。如果想找回之前误删的一个信号,或者想回看自己当时是怎么一步步把信号拉进来的,直接从History里点选即可。配合前面提到的搜索送波形操作,这套组合可以做到:搜索信号名->找驱动点->送波形->存布局->下次一键恢复,整个流程非常顺滑。
4.4 个人实操中的几个习惯与建议
文章最后,说点我在实际项目里总结出来的经验。用Verdi做调试,工具熟练度对效率的影响比想象中大得多。我用过2020、2021、2023几个版本,说实话,2021版改版带来的界面“惊吓”其实是短暂的,一旦把这些入口摸清,你反而会觉得新版的搜索体系更灵活,因为它是按窗口类型区分搜索的,不容易串。
我的第一个习惯是:每到一个新版本,先把快捷方式备份一份。Verdi的快捷键可以通过Tools -> Preference -> Hotkeys里导出成文件,这个文件很小,但能在你切换服务器、升级版本时省下大量重新配置的时间。
第二个习惯是:把常用的搜索场景做成模板。比如查多驱动、查例化、查模块定义,这些操作路径都不同,但可以通过对话框历史记住大部分参数。Verdi的Find String对话框会保留历史输入,下次打开时下拉框里就有之前搜过的关键词,算是半个“收藏夹”。
第三个习惯有点个人色彩:我会刻意练习用快捷键而不是鼠标。刚开始记不住,就在工位上贴一张手写的快捷键表,用一星期基本就能形成肌肉记忆。调试有时就像在和时间赛跑,提交任务卡住时,能在别人找菜单的功夫里多完成一轮搜索定位,这种差距在项目紧张的时候是真能感觉到的。
说到底,Verdi 2021里的Find String框没有真正走丢,它只是换了藏身的地方。花十几分钟把这些入口捋顺,之后每一次搜索都会觉得“嗯,这么找才对”。如果你在按文中步骤操作时还是有问题,不妨检查一下自己的Verdi版本小版本号,2021.x的某些小版本确实存在界面细节差异,但大的操作逻辑和快捷键设计是延续下来的,耐心一点,总能找回来的。