3、波形查看基础:波形窗口基本操作

波形调试,说白了就是数字IC验证的「眼睛」。你代码写得再好,仿真跑得再欢,最后还是要回到波形上一眼一眼地看信号对不对。我刚开始做验证那会儿,总觉得波形窗口就是个放大缩小、拖来拖去的东西,没什么技术含量。直到有一次,一个时序问题我盯了三天没找到,结果老同事过来,三下五除二用了个测量功能就定位了——嗯,从那以后我再也不敢小看这些「基础操作」了。

3.1 波形窗口的缩放与拖动

先说说最常用的缩放。Verdi里缩放操作其实有好几种方式,我个人习惯用快捷键,因为鼠标点来点去太慢了。

  • 放大:按键盘的 z 键,或者用鼠标滚轮向上滚动。你也可以按住 Ctrl 键,然后用鼠标左键框选一个区域,Verdi会自动放大到那个区域。
  • 缩小:按 Shift+z 组合键,或者滚轮向下滚动。
  • 全屏显示:按 f 键,波形会自动适配到整个窗口。这个我经常用,尤其是信号太多的时候,一眼看全局。
  • 拖动:按住鼠标中键(滚轮键)拖动,或者按住 Ctrl + 鼠标左键拖动。注意,左键拖动是框选,中键拖动才是平移。
小技巧: 我个人习惯把鼠标中键设置为「平移」,左键设置为「框选放大」。你可以在 Verdi 的 Preferences 里调整鼠标映射,找到最适合自己的方式。

为什么会这样设计?其实Verdi的缩放逻辑和很多EDA工具类似——z 放大、Shift+z 缩小,这是从早期Unix工作站时代就传下来的快捷键。你想想看,那时候没有鼠标滚轮,全靠键盘操作,所以快捷键设计得特别高效。

3.2 信号的添加与删除

信号怎么加到波形窗口里?这可能是你每天要操作几十次的事情。

  • 添加信号:在源代码窗口选中一个信号名,然后按 Ctrl+W,或者直接拖拽到波形窗口。你也可以在波形窗口里右键选择「Add Signal」,然后输入信号名。
  • 批量添加:按住 ShiftCtrl 键多选信号,然后一起拖过去。我建议你养成用 Ctrl+W 的习惯,因为手不用离开键盘,效率高很多。
  • 删除信号:选中波形窗口里的信号名(左侧那一列),按 Delete 键。或者右键选择「Delete Signal」。
  • 清空所有信号:右键选择「Delete All Signals」。这个操作要小心,我曾经手滑点错过,结果一上午加的几百个信号全没了……嗯,从那以后我每次清空前都会先保存一下波形配置。
注意: 删除信号是不可撤销的操作!Verdi 没有「撤销删除信号」的功能。如果你不小心删错了,只能重新添加。所以我建议你养成定期保存波形配置的习惯(File → Save Signal File)。

3.3 信号分组与颜色管理

当你的波形窗口里有几十上百个信号时,没有分组和颜色管理,那简直就是一团乱麻。我记得有一次调试一个AXI总线协议,同时看了地址、数据、控制信号、握手信号……加起来快50个,没有分组的话根本分不清谁是谁。

信号分组:

  • 选中多个信号,右键选择「Group」→「Create Group」。给组起个名字,比如「AXI_Address」或「Control_Signals」。
  • 双击组名可以展开或折叠组。折叠后波形窗口瞬间清爽很多。
  • 你还可以创建嵌套组,比如「AXI_Group」下面再分「Read_Channel」和「Write_Channel」。

颜色管理:

  • 选中信号,右键选择「Color」,然后选一个颜色。我个人习惯:时钟信号用红色,复位信号用蓝色,数据信号用绿色,控制信号用黄色。
  • 你也可以给整个组设置颜色,组内所有信号会继承这个颜色。
  • 颜色有什么用?说白了就是让你一眼能看出信号的类别。比如你看到红色波形,就知道那是时钟,不用再去读信号名。
信号类型 推荐颜色 说明
时钟 (clk) 红色 最醒目的颜色,一眼定位时钟沿
复位 (rst_n) 蓝色 与时钟区分,容易识别复位状态
数据总线 绿色 数据信号用绿色,视觉上比较柔和
控制信号 黄色/橙色 控制逻辑用暖色,突出其「决策」角色
状态机 紫色 状态机信号用紫色,与其他信号区分
我的经验: 颜色管理一定要形成团队规范。我们团队就统一了颜色方案,新人来了先学这个。这样大家互相看波形时,不用问「这个信号是什么」,看颜色就知道了。省了很多沟通成本。

3.4 波形测量:光标与时间差

波形测量是调试中最核心的操作之一。你看到一个信号跳变了,想知道它和另一个信号之间的时间关系,这时候就要用光标。

基本光标操作:

  • 添加光标:在波形区域点击左键,会出现一个竖线,那就是光标。Verdi支持多个光标,最多可以添加10个。
  • 移动光标:直接用鼠标拖动光标,或者用键盘的左右方向键微调。按住 Shift + 方向键可以一次移动一个时钟周期(如果波形里有时钟信号的话)。
  • 删除光标:右键点击光标,选择「Delete Cursor」。

测量时间差:

  • 添加两个光标(比如光标A和光标B),Verdi会自动在窗口底部显示它们之间的时间差。
  • 你也可以用 Ctrl+左键 快速添加第二个光标,然后看底部状态栏的 Delta 值。
  • 时间差的单位默认是秒(s),你可以右键点击时间显示区域,改成纳秒(ns)或皮秒(ps)。
实用技巧: 如果你想测量两个信号上升沿之间的时间差,先把光标A对齐到第一个信号的上升沿,再把光标B对齐到第二个信号的上升沿。Verdi 的「Snap to Edge」功能(快捷键 e)可以自动把光标吸附到信号的跳变沿上,非常精准。

高级测量:

  • 频率测量:在时钟信号上放两个光标,测量一个周期的时间,然后取倒数就是频率。Verdi 也支持直接显示频率,在光标信息窗口里勾选「Frequency」即可。
  • 脉宽测量:测量信号高电平或低电平的持续时间。把光标放在上升沿和下降沿上,看时间差。
  • 建立时间/保持时间检查:这个在时序分析里很常用。测量数据信号变化沿到时钟采样沿之间的时间,看是否满足时序约束。

我曾经遇到过一个案例:一个接口的数据总线上偶尔出现毛刺,但频率很低,肉眼根本看不出来。后来我用光标测量了数据信号的脉宽,发现有一个信号的脉宽比其他信号短了0.5ns。顺着这个线索查下去,发现是某个组合逻辑的路径延迟太大,导致数据在时钟沿附近不稳定。嗯,如果没有光标测量功能,这个问题可能永远都发现不了。

注意: 光标测量依赖于仿真时间精度。如果你的仿真时间精度是1ns,那测量结果也只能精确到1ns。如果你需要皮秒级的精度,记得在仿真时设置 -timescale 1ps/1ps

3.5 波形配置的保存与加载

最后说一个容易被忽略但很重要的功能——波形配置的保存。你花了一上午把信号排好序、分好组、配好颜色,结果一关窗口全没了,那得多崩溃。

  • 保存配置:File → Save Signal File,或者按 Ctrl+S。文件后缀通常是 .rc.sig
  • 加载配置:File → Load Signal File,选择之前保存的文件。
  • 自动加载:Verdi 支持在启动时自动加载上次的波形配置。在 Preferences 里勾选「Restore last session」即可。

我个人习惯是每个测试用例都单独保存一个波形配置文件,命名规则是 testcase_name.sig。这样下次回归测试时,直接加载配置,所有信号都在老位置,不用重新排。省下来的时间,喝杯咖啡不香吗?

好了,波形窗口的基础操作就这些。别觉得简单,这些操作你每天会用几十次甚至上百次。练熟了,调试效率能翻倍。下一章我们会聊更高级的波形分析技巧,比如如何用波形对比功能快速定位差异。