3、波形查看基础:波形窗口基本操作
波形调试,说白了就是数字IC验证的「眼睛」。你代码写得再好,仿真跑得再欢,最后还是要回到波形上一眼一眼地看信号对不对。我刚开始做验证那会儿,总觉得波形窗口就是个放大缩小、拖来拖去的东西,没什么技术含量。直到有一次,一个时序问题我盯了三天没找到,结果老同事过来,三下五除二用了个测量功能就定位了——嗯,从那以后我再也不敢小看这些「基础操作」了。
3.1 波形窗口的缩放与拖动
先说说最常用的缩放。Verdi里缩放操作其实有好几种方式,我个人习惯用快捷键,因为鼠标点来点去太慢了。
- 放大:按键盘的
z键,或者用鼠标滚轮向上滚动。你也可以按住Ctrl键,然后用鼠标左键框选一个区域,Verdi会自动放大到那个区域。 - 缩小:按
Shift+z组合键,或者滚轮向下滚动。 - 全屏显示:按
f键,波形会自动适配到整个窗口。这个我经常用,尤其是信号太多的时候,一眼看全局。 - 拖动:按住鼠标中键(滚轮键)拖动,或者按住
Ctrl+ 鼠标左键拖动。注意,左键拖动是框选,中键拖动才是平移。
为什么会这样设计?其实Verdi的缩放逻辑和很多EDA工具类似——z 放大、Shift+z 缩小,这是从早期Unix工作站时代就传下来的快捷键。你想想看,那时候没有鼠标滚轮,全靠键盘操作,所以快捷键设计得特别高效。
3.2 信号的添加与删除
信号怎么加到波形窗口里?这可能是你每天要操作几十次的事情。
- 添加信号:在源代码窗口选中一个信号名,然后按
Ctrl+W,或者直接拖拽到波形窗口。你也可以在波形窗口里右键选择「Add Signal」,然后输入信号名。 - 批量添加:按住
Shift或Ctrl键多选信号,然后一起拖过去。我建议你养成用Ctrl+W的习惯,因为手不用离开键盘,效率高很多。 - 删除信号:选中波形窗口里的信号名(左侧那一列),按
Delete键。或者右键选择「Delete Signal」。 - 清空所有信号:右键选择「Delete All Signals」。这个操作要小心,我曾经手滑点错过,结果一上午加的几百个信号全没了……嗯,从那以后我每次清空前都会先保存一下波形配置。
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)。
e)可以自动把光标吸附到信号的跳变沿上,非常精准。
高级测量:
- 频率测量:在时钟信号上放两个光标,测量一个周期的时间,然后取倒数就是频率。Verdi 也支持直接显示频率,在光标信息窗口里勾选「Frequency」即可。
- 脉宽测量:测量信号高电平或低电平的持续时间。把光标放在上升沿和下降沿上,看时间差。
- 建立时间/保持时间检查:这个在时序分析里很常用。测量数据信号变化沿到时钟采样沿之间的时间,看是否满足时序约束。
我曾经遇到过一个案例:一个接口的数据总线上偶尔出现毛刺,但频率很低,肉眼根本看不出来。后来我用光标测量了数据信号的脉宽,发现有一个信号的脉宽比其他信号短了0.5ns。顺着这个线索查下去,发现是某个组合逻辑的路径延迟太大,导致数据在时钟沿附近不稳定。嗯,如果没有光标测量功能,这个问题可能永远都发现不了。
-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。这样下次回归测试时,直接加载配置,所有信号都在老位置,不用重新排。省下来的时间,喝杯咖啡不香吗?
好了,波形窗口的基础操作就这些。别觉得简单,这些操作你每天会用几十次甚至上百次。练熟了,调试效率能翻倍。下一章我们会聊更高级的波形分析技巧,比如如何用波形对比功能快速定位差异。