这一篇在干嘛?
还没写 testbench、又想先验证设计功能怎么办?Waveform Editor 可以让你像画图一样,在 Wave 窗口里交互式地「画」出激励波形:用向导生成时钟、常数信号,再手工编辑脉冲和边沿。画完的波形可以直接驱动仿真,还能导出成 HDL testbench 或 EVCD 文件,把激励固化下来复用。
FPGA 语境
这相当于安路 TD 里图形化波形激励工具的思路:不写一行代码就能给设计灌激励,适合在设计初期快速验证计数器、状态机这类模块的基本行为。
本课的设计文件
样例设计还是「Basic Simulation」一课用过的那个 8 位二进制加法计数器。路径如下:
- Verilog:
<install_dir>/examples/tutorials/verilog/basicSimulation - VHDL:
<install_dir>/examples/tutorials/vhdl/basicSimulation
本评件使用 Verilog 版本;如果你有 VHDL license,请改用 VHDL 版本,必要时文中会区分两种版本的操作。更多信息参阅 User’s Manual 中的 Generating Stimulus with Waveform Editor,以及 GUI Reference Manual 中的 Wave Window。
本课要做的事情:新建目录并拷入 counter 设计单元;不带 testbench 载入设计;用向导创建波形;在 Wave 窗口交互式编辑波形;把波形导出成 HDL testbench 和扩展 VCD 文件;运行仿真;再用导出的 testbench 和 VCD 文件重新仿真。
编译并载入设计
使用 Waveform Editor 之前,先编译并载入一个设计。
不载入设计也能用
你也可以在载入设计之前就使用 Waveform Editor,详见 User’s Manual 中的 Using Waveform Editor Prior to Loading a Design。
-
新建一个目录并把教程文件拷进去(新建目录是为了不影响其他人共用这些教程文件)。把
<install_dir>/examples/tutorials/verilog/basicSimulation下的counter.v复制到新目录;如果用 VHDL,则复制<install_dir>/examples/tutorials/vhdl/basicSimulation下的counter.vhd。 -
启动 QuestaSIM 并切换到刚才新建的目录:
- 在 UNIX shell 输入
vsim,或在 Windows 下双击 QuestaSIM 图标;弹出 Welcome to Questa SIM 对话框就点 Close。 - 选择 File > Change Directory,切换到第 1 步创建的目录。
- 在 UNIX shell 输入
-
创建工作库并编译设计。在 QuestaSIM> 提示符下依次输入:
vlib workvlog counter.vVHDL 用户则输入:
vcom counter.vhd-
载入设计单元:
- 选择 Simulate > Start Simulation,打开 Start Simulation 对话框。
- 点击
work库旁边的「+」展开它。 - 选中
counter模块。 - 取消勾选 Enable optimization。
- 点击 OK。
-
打开 Wave 和 Objects 窗口(如果已经开着就跳过):在 Main 窗口菜单选择 View > Wave,再选择 View > Objects。
用向导生成激励波形
Waveform Editor 内置一个 Create Pattern Wizard(创建波形向导),一步步带你生成可编辑的波形。
生成时钟 clk
- 在 Objects 窗口右键
clk信号,选择 Modify > Apply Wave。
这会打开 Create Pattern Wizard 对话框,让你指定波形类型(Clock、Repeater 等)以及起止时间。
- 默认类型就是 Clock,正合需要,直接点击 Next:

- 在向导第二个对话框里,Initial Value 一栏输入
1,其余保持默认,点击 Finish:

Wave 窗口里出现了生成的波形:

注意波形图标上的小红点和信号名前的「Edit:」前缀——这两个标记表示这是一条可编辑的波形。(建议把 Wave 窗口 undock 出来,看得更清楚。)
生成复位信号 reset
- 在 Objects 窗口右键
reset信号,从弹出菜单选择 Modify > Apply Wave。 - 波形类型选 Constant,点击 Next。
- Value 一栏输入
0,点击 Finish。
Wave 窗口里出现了第二条生成的波形:

在 Wave 窗口里手工编辑波形
Waveform Editor 提供了大量交互式编辑波形的命令(反转、镜像、拉伸边沿、剪切、粘贴等),可以通过菜单、工具栏按钮或键盘鼠标快捷键使用。下面实际操练几个。
给 reset 插入一个脉冲
- 点击 Wave 窗口标题栏,让 Wave 窗口成为活动窗口。
- 点击工具栏上的 Edit Mode 图标。
- 在 Wave 窗口的 Pathnames 列点击
reset信号,使它被选中。 - 点击 Wave Edit Toolbar 上的 Insert Pulse 图标(Wave Edit Toolbar 的详细说明见 GUI Reference Manual)。
也可以在 Wave 窗口里右键 reset 的波形本身(注意不是点路径名或值),选择 Edit > Wave Editor > Insert Pulse。
- 在 Edit Insert Pulse 对话框里,Duration 一栏填
100,Time 一栏填100,点击 OK:
| Edit Insert Pulse | ||
| Signal NameEdit:/counter/reset | ||
| Duration | Time | Time Unit |
| 100 | 100 | ns |
现在 reset 信号在 100 ns 到 200 ns 之间变高:

拉伸 clk 的一个边沿
- 在 Pathnames 列点击信号名选中
clk。 - 在波形面板里,点击
clk波形 350 ns 跳变稍偏右的位置,光标应该吸附到 350 ns 的跳变上。如果看不到黄色游标线,在游标时间轴上任意点一下,把游标带进当前视图。 - 右键这个跳变,从弹出菜单选择 Wave Editor > Stretch Edge。
如果该命令是灰色的,多半是游标没有停在 350 ns 的边沿上。
- 在 Edit Stretch Edge 对话框里,Duration 填
50,确认 Time 一栏显示的是350,然后点击 OK:

波形边沿被拉伸,高电平从 300 ns 一直延续到 400 ns:

注意区分「拉伸」和「移动」边沿:Stretch 命令在移动一个边沿时会连带移动波形上的其他边沿(要么拉长波形总时长,要么删除仿真起始处的一些边沿);Move 命令只移动这一个边沿,不影响其他边沿。你可以在 Wave 窗口里看到 clk 的波形现在延伸到了 1050 ns。
删除一个边沿
- 点击
clk波形 400 ns 跳变右侧的位置,光标应吸附到 400 ns。 - 点击 Delete Edge 图标:

这会打开 Edit Delete Edge 对话框,Time 已经自动填好 400 ns,点击 OK。边沿被删除,clk 保持高电平直到 500 ns:

撤销与重做
- 点击 Undo 图标:

Edit Undo 对话框会让你选择 Undo Count(要撤销的动作数)。保持 Undo Count 为 1,点击 OK,刚才删掉的 400 ns 边沿就回来了。
- 重新选中
clk信号,让 Redo 图标变为可用。 - 点击 Redo 图标,在 Edit Redo 对话框里点 OK。
边沿又被删除了。绝大多数编辑操作都可以任意撤销/重做,但有两个例外:扩展全部波形(extend all waves)和改变驱动类型(drive type),这两个操作无法撤销。
保存并复用波形命令
QuestaSIM 生成波形所用的命令可以保存下来,之后随时加载这个「格式」文件重新生成波形。下面把命令存盘,退出并重新载入仿真,再打开格式文件验证。
-
把波形命令保存为格式文件:
- 在菜单栏选择 File > Save Format,打开 Save Format 对话框:

- 默认文件名是
wave.do。 - 点击 OK,把名为
wave.do的 DO 文件保存到当前目录。 - 点击右上角的 Close 图标(x)或通过菜单 View > Wave 关闭 Wave 窗口。
-
退出仿真再重新载入设计:
- 在 Main 窗口选择 Simulate > End Simulation,点击 Yes 确认退出仿真。
- 在 QuestaSIM> 提示符下输入:
vsim counter-
打开格式文件:
- 选择 View > Wave 打开 Wave 窗口。
- 在菜单栏选择 File > Load > Macro File。
- 双击
wave.do打开它。
之前创建的波形全部重新出现了。如果波形没有出现,多半是你没有载入 counter 设计单元。
导出创建好的波形
到这里,你可以直接跑仿真,也可以先把画好的波形导出成四种激励文件格式之一。我们先把波形导出,留到本课后半段使用。
导出为 HDL testbench
- 选择 File > Export > Waveform。
- 选择 Verilog Testbench(用 VHDL 样例文件的话就选 VHDL Testbench)。
- 必要时把 End Time 填为
1000。 - 在 File Name 一栏输入
export,点击 OK:

QuestaSIM 会在当前目录创建 export.v(或 export.vhd)文件,本课后面会编译并仿真它。
导出为扩展 VCD(EVCD)文件
- 选择 File > Export > Waveform。
- 选择 EVCD File。
- 必要时把 End Time 填为
1000,点击 OK。
QuestaSIM 会创建名为 export.vcd 的扩展 VCD 文件,本课后面会导入它。
运行仿真
波形编辑完毕,现在可以跑仿真了。
-
添加一个设计信号:
- 在 Objects 窗口右键
count,选择 Add Wave。
- 在 Objects 窗口右键
信号被加进 Wave 窗口。
- 运行仿真。在 QuestaSIM> 提示符下输入:
run 1000仿真运行 1000 ns,sim:/counter/count 的波形被画了出来:

观察 count 在 300 ns 到 500 ns 之间的信号跳变:跳变发生在 clk 变高的时刻,可以看到 count 完全跟着你刚才通过拉伸和删除边沿编辑出来的 clk 波形在走——激励生效了。
-
退出仿真:
- 在 Main 窗口选择 Simulate > End Simulation,点击 Yes 确认;如果询问是否保存波形命令,点 No。
用导出的 testbench 仿真
前面把画好的波形导成了 testbench 文件,现在编译、装载并运行它。
-
编译并装载 testbench:
- 在 QuestaSIM 提示符下输入
vlog export.v(VHDL 用户输入vcom export.vhd)。
- 在 QuestaSIM 提示符下输入
work 库里应该出现一个名为 export 的设计单元:
| Library | ||
| Name | Type | Path |
| work | Library | C:/tutorials/verilog/basicSimulation/work |
| counter | Module | C:\tutorials\verilog\basicSimulation/counter.v |
| export | Module | C:\tutorials\verilog\basicSimulation/export.v |
| floatfixlib | Library | $MODEL_TECH/../floatfixlib |
| mc2_lib | Library | $MODEL_TECH/../mc2_lib |
| mtiAvm | Library | $MODEL_TECH/../avm |
| mtiOvm | Library | $MODEL_TECH/../ovm-2.0.3 |
| mtiPA | Library | $MODEL_TECH/../pa_lib |
- 在 QuestaSIM> 提示符下输入:
vsim -voptargs="+acc" export-
添加波形并运行:
- 在 VSIM> 提示符下输入
add wave *。 - 接着输入
run 1000。
- 在 VSIM> 提示符下输入
Wave 窗口里的波形和上一次练习看到的完全一致:
| Wave - Default | |
| Msgs | |
| /export/count | 8'h07 |
| /export/clk | 1'h1 |
| /export/reset | 1'h0 |
| Now | 1000 ns |
| Cursor 1 | 0 ns |
-
退出仿真:
- 在 VSIM> 提示符下输入
quit -sim,点击 Yes 确认。
- 在 VSIM> 提示符下输入
导入 EVCD 文件
前面还导出了一个扩展 VCD 文件,现在用它来激励 counter 设计单元。
-
载入 counter 设计单元并添加波形:
- 在 QuestaSIM> 提示符下输入:
vsim -voptargs="+acc" counter- 在 Objects 窗口右键
count,选择 Add Wave。
-
导入 VCD 文件:
- 确保 Wave 窗口是活动窗口,然后在菜单栏选择 File > Import > EVCD。
- 双击
export.vcd。
创建好的波形在 Wave 窗口里画了出来:

- 点击 Run -All 图标。
仿真运行 1000 ns,sim:/counter/count 的波形被画了出来:

信号自动映射
导入 EVCD 文件时,如果信号名和位宽都匹配,信号映射会自动完成;不匹配就需要手动映射,详见 User’s Manual 中的 Signal Mapping and Importing EVCD Files。
收尾
本课到此结束,结束当前仿真即可:
- 在 VSIM> 提示符下输入
quit -sim;如果询问是否保存波形命令,点 No。
自测
自测
- 用 Create Pattern Wizard 分别给 clk 和 reset 生成了什么类型的波形?各设置了什么参数?
- Wave 窗口里波形图标上的小红点和信号名前的「Edit:」前缀表示什么?
- Stretch Edge 和 Move 两种编辑命令在移动边沿时有什么本质区别?
- 哪两种波形编辑操作是无法撤销的?
- 画好的波形可以导出成哪几种激励文件格式?导入 EVCD 文件时,什么情况下信号映射可以自动完成?