3. Verdi主界面与波形窗口高效操作

Verdi 的调试效率,很大程度上取决于你是否把波形窗口当成“可编程的工作台”来使用,而不是一个只能左右拖动的查看器。本节围绕信号添加/删除/分组、总线拆分与合并、光标与标记、缩放与平移、书签与视图保存五组操作展开,目标是让你在几十万条信号的仿真波形中,快速定位到真正要看的那几条,并把观察结果稳定地保存下来。

一、信号添加、删除与分组:把波形窗口变成“调试清单”

Verdi 波形窗口(nWave)中,信号来源主要有三类:设计层次树(Hierarchy)、信号列表(Signal List / Get Signals)、以及已有波形中的复制粘贴。最常用的添加方式是在层次树中选中信号后按 Ctrl+W(或中键拖拽)送入波形窗口;删除则选中信号行按 Delete。真正提升效率的是“分组”:把同一功能域的时钟、复位、状态机、数据总线放进一个 Group,例如 grp_axi_wr、grp_dma_ch0。分组后可以整体折叠、整体移动、整体保存,避免每次调试都重新找信号。

建议的命名与组织约定如下(示例,可按项目调整):

  • grp_clk_rst:clk、rst_n、pll_lock
  • grp_ctrl_fsm:state、next_state、start、done
  • grp_datapath:data_in、data_out、valid、ready
  • grp_dbg:临时观察信号,调试结束后删除

分组操作本身不改变信号来源,只是视图层的组织。因此可以放心地把同一信号加入多个 Group,用于不同分析视角(例如“时序视角”和“协议视角”)。

二、总线拆分与合并:从“一根粗线”到“逐位可读”

总线在波形中默认显示为一条带数值的粗线,但调试时经常需要看某几位。Verdi 提供两种方向相反的操作:

  • 拆分(Expand / Split Bus):把 data[31:0] 展开为 32 条位线,或按字段拆成 data[31:16]、data[15:0]。常用做法是选中总线后右键选择 Expand,或使用 [ ] 快捷键逐级展开。
  • 合并(Merge / Group as Bus):把多条相关信号(如 addr[7:0]、addr[15:8])合并成一条总线显示,减少行数、便于整体观察数值变化。

拆分时要注意位序约定:Verdi 默认按声明位宽显示,[31:0] 中左侧为高位。若你的设计使用小端字段布局,拆分后应核对字段边界是否与 RTL 一致,避免把 data[7:0] 误读为高字节。合并操作则要求各信号位宽之和与目标总线一致,否则 Verdi 会提示位宽不匹配。

三、光标与标记:把“时间点”变成可引用的坐标

波形调试的核心是“在某个时刻发生了什么”。Verdi 提供两类时间坐标工具:

  • 光标(Cursor):主光标用于定位当前时刻,辅助光标(A/B 光标)用于测量两点之间的时间差。常用快捷键:Shift+←/→ 移动主光标,Ctrl+←/→ 移动辅助光标。
  • 标记(Marker):在关键事件处打标记,例如“复位释放”“握手成功”“错误注入”。标记可以命名,并在波形窗口顶部以标签形式显示,便于快速跳转。

一个实用技巧:先用光标定位到异常时刻,再在该时刻打一个命名标记(如 M1_axi_timeout),然后继续向后分析。这样即使后续缩放、平移,标记仍然锚定在原始时间点,不会丢失。

四、缩放与平移:在“全局”和“细节”之间切换

Verdi 的缩放与平移操作非常密集,建议形成肌肉记忆:

  • 缩放:+/- 以光标为中心放大/缩小;Ctrl+滚轮 连续缩放;F 适配全波形(Fit)。
  • 平移:←/→ 按固定步长平移;Shift+滚轮 水平滚动;Home/End 跳到波形首尾。
  • 区域缩放:按住鼠标中键框选一段时间范围,Verdi 会缩放到该区间,适合快速聚焦某次事务。

缩放时要注意“时间基准”是否变化。Verdi 默认以仿真时间(ns/ps)为横轴,若你切换了时间单位或使用了不同的时间精度,光标读数会随之改变。建议在调试开始时先确认波形窗口右下角的时间单位,再开始测量。

五、书签与视图保存:让调试现场可复现

书签(Bookmark)和视图保存(Save View / Restore View)是 Verdi 中最容易被忽视、但回报最高的功能。书签用于标记“时间点”,视图保存用于标记“整个波形窗口的状态”。

视图保存通常包含:信号列表、分组结构、光标位置、缩放范围、标记、以及当前打开的文件。恢复视图后,你可以回到与上次完全一致的调试现场,而不需要重新添加信号、重新分组、重新缩放。对于需要反复回归的 bug,建议按如下方式命名视图:

# 示例:视图保存命名约定
view_axi_wr_timeout_20240612
view_dma_ch0_overflow
view_clk_rst_bringup

书签则更适合“单点”场景。例如在波形中看到一次异常握手,打上书签 BM_handshake_fail,下次打开波形时直接从书签列表跳转,无需记住具体时间。

Verdi 波形窗口高效操作关系图 信号来源 Hierarchy 层次树 Signal List 信号列表 已有波形复制 Ctrl+W / 中键拖拽 nWave 波形窗口 分组 Group grp_clk_rst / grp_ctrl_fsm / grp_datapath 折叠、整体移动、整体保存 总线拆分 / 合并 data[31:0] → 32 位线 或 字段拆分 addr[7:0]+addr[15:8] → 合并总线 光标 Cursor / 标记 Marker 主光标 + A/B 辅助光标测时间差 命名标记锚定关键事件时刻 缩放 Zoom / 平移 Pan +/- 缩放,F 适配全波形 中键框选区域缩放,←/→ 平移 书签 Bookmark / 视图保存 Save View 可复现调试现场 信号列表 + 分组结构 光标位置 + 缩放范围 标记 + 书签 Restore View 一键恢复 添加 保存 常用快捷键速查 Ctrl+W 添加信号到波形 Delete 删除选中信号 [ ] 展开/折叠总线 + / - 以光标为中心缩放 F 适配全波形 Shift+←/→ 移动主光标 Ctrl+←/→ 移动辅助光标

六、把五组操作串成一条调试路径

实际调试中,这五组操作通常不是孤立的。一个典型路径是:从层次树添加信号(Ctrl+W)→ 按功能分组(Group)→ 对总线拆分(Expand)→ 用光标定位异常时刻并打标记(Marker)→ 框选区域缩放(Zoom)→ 保存视图(Save View)。下次回归时,直接 Restore View,再跳到书签,就能在几秒内回到上次的调试现场。

建议在项目初期就建立一套视图命名与分组命名约定,并把它写进团队的调试规范。Verdi 的视图文件(.rc / .vw)可以随设计版本一起归档,这样即使换人调试,也能快速接手。
注意:视图保存的是“引用”而非“数据”。如果信号在 RTL 中被重命名或删除,恢复视图时对应信号会丢失或报错。因此,视图保存应与设计版本绑定,避免跨版本混用。

最后强调一点:Verdi 的波形窗口操作并不难,难的是形成稳定的操作习惯。建议在下一个调试任务中,刻意练习“先分组、再拆分、后保存”的顺序,把重复劳动压缩到最低,把注意力留给真正的时序与协议分析。