这一篇在干嘛?

还没写 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。

  1. 新建一个目录并把教程文件拷进去(新建目录是为了不影响其他人共用这些教程文件)。把 <install_dir>/examples/tutorials/verilog/basicSimulation 下的 counter.v 复制到新目录;如果用 VHDL,则复制 <install_dir>/examples/tutorials/vhdl/basicSimulation 下的 counter.vhd

  2. 启动 QuestaSIM 并切换到刚才新建的目录:

    • 在 UNIX shell 输入 vsim,或在 Windows 下双击 QuestaSIM 图标;弹出 Welcome to Questa SIM 对话框就点 Close。
    • 选择 File > Change Directory,切换到第 1 步创建的目录。
  3. 创建工作库并编译设计。在 QuestaSIM> 提示符下依次输入:

vlib work
vlog counter.v

VHDL 用户则输入:

vcom counter.vhd
  1. 载入设计单元:

    • 选择 Simulate > Start Simulation,打开 Start Simulation 对话框。
    • 点击 work 库旁边的「+」展开它。
    • 选中 counter 模块。
    • 取消勾选 Enable optimization。
    • 点击 OK。
  2. 打开 Wave 和 Objects 窗口(如果已经开着就跳过):在 Main 窗口菜单选择 View > Wave,再选择 View > Objects。

用向导生成激励波形

Waveform Editor 内置一个 Create Pattern Wizard(创建波形向导),一步步带你生成可编辑的波形。

生成时钟 clk

  1. 在 Objects 窗口右键 clk 信号,选择 Modify > Apply Wave。

这会打开 Create Pattern Wizard 对话框,让你指定波形类型(Clock、Repeater 等)以及起止时间。

  1. 默认类型就是 Clock,正合需要,直接点击 Next:

Create Pattern Wizard

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

Specifying Clock Pattern Attributes

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

The clk Waveform

注意波形图标上的小红点和信号名前的「Edit:」前缀——这两个标记表示这是一条可编辑的波形。(建议把 Wave 窗口 undock 出来,看得更清楚。)

生成复位信号 reset

  1. 在 Objects 窗口右键 reset 信号,从弹出菜单选择 Modify > Apply Wave。
  2. 波形类型选 Constant,点击 Next。
  3. Value 一栏输入 0,点击 Finish。

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

The reset Waveform

在 Wave 窗口里手工编辑波形

Waveform Editor 提供了大量交互式编辑波形的命令(反转、镜像、拉伸边沿、剪切、粘贴等),可以通过菜单、工具栏按钮或键盘鼠标快捷键使用。下面实际操练几个。

给 reset 插入一个脉冲

  1. 点击 Wave 窗口标题栏,让 Wave 窗口成为活动窗口。
  2. 点击工具栏上的 Edit Mode 图标。
  3. 在 Wave 窗口的 Pathnames 列点击 reset 信号,使它被选中。
  4. 点击 Wave Edit Toolbar 上的 Insert Pulse 图标(Wave Edit Toolbar 的详细说明见 GUI Reference Manual)。

也可以在 Wave 窗口里右键 reset 的波形本身(注意不是点路径名或值),选择 Edit > Wave Editor > Insert Pulse。

  1. 在 Edit Insert Pulse 对话框里,Duration 一栏填 100,Time 一栏填 100,点击 OK:
Edit Insert Pulse
Signal NameEdit:/counter/reset
DurationTimeTime Unit
100100ns

现在 reset 信号在 100 ns 到 200 ns 之间变高:

Signal reset with an Inserted Pulse

拉伸 clk 的一个边沿

  1. 在 Pathnames 列点击信号名选中 clk
  2. 在波形面板里,点击 clk 波形 350 ns 跳变稍偏右的位置,光标应该吸附到 350 ns 的跳变上。如果看不到黄色游标线,在游标时间轴上任意点一下,把游标带进当前视图。
  3. 右键这个跳变,从弹出菜单选择 Wave Editor > Stretch Edge。

如果该命令是灰色的,多半是游标没有停在 350 ns 的边沿上。

  1. 在 Edit Stretch Edge 对话框里,Duration 填 50,确认 Time 一栏显示的是 350,然后点击 OK:

Edit Stretch Edge Dialog Box

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

Stretching an Edge on the clk Signal

注意区分「拉伸」和「移动」边沿:Stretch 命令在移动一个边沿时会连带移动波形上的其他边沿(要么拉长波形总时长,要么删除仿真起始处的一些边沿);Move 命令只移动这一个边沿,不影响其他边沿。你可以在 Wave 窗口里看到 clk 的波形现在延伸到了 1050 ns。

删除一个边沿

  1. 点击 clk 波形 400 ns 跳变右侧的位置,光标应吸附到 400 ns。
  2. 点击 Delete Edge 图标:

Delete Edge 图标

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

Deleting an Edge on the clk Signal

撤销与重做

  1. 点击 Undo 图标:

Undo 图标

Edit Undo 对话框会让你选择 Undo Count(要撤销的动作数)。保持 Undo Count 为 1,点击 OK,刚才删掉的 400 ns 边沿就回来了。

  1. 重新选中 clk 信号,让 Redo 图标变为可用。
  2. 点击 Redo 图标,在 Edit Redo 对话框里点 OK。

边沿又被删除了。绝大多数编辑操作都可以任意撤销/重做,但有两个例外:扩展全部波形(extend all waves)和改变驱动类型(drive type),这两个操作无法撤销。

保存并复用波形命令

QuestaSIM 生成波形所用的命令可以保存下来,之后随时加载这个「格式」文件重新生成波形。下面把命令存盘,退出并重新载入仿真,再打开格式文件验证。

  1. 把波形命令保存为格式文件:

    • 在菜单栏选择 File > Save Format,打开 Save Format 对话框:

Save Format Dialog Box

  • 默认文件名是 wave.do
  • 点击 OK,把名为 wave.do 的 DO 文件保存到当前目录。
  • 点击右上角的 Close 图标(x)或通过菜单 View > Wave 关闭 Wave 窗口。
  1. 退出仿真再重新载入设计:

    • 在 Main 窗口选择 Simulate > End Simulation,点击 Yes 确认退出仿真。
    • 在 QuestaSIM> 提示符下输入:
vsim counter
  1. 打开格式文件:

    • 选择 View > Wave 打开 Wave 窗口。
    • 在菜单栏选择 File > Load > Macro File。
    • 双击 wave.do 打开它。

之前创建的波形全部重新出现了。如果波形没有出现,多半是你没有载入 counter 设计单元。

导出创建好的波形

到这里,你可以直接跑仿真,也可以先把画好的波形导出成四种激励文件格式之一。我们先把波形导出,留到本课后半段使用。

导出为 HDL testbench

  1. 选择 File > Export > Waveform。
  2. 选择 Verilog Testbench(用 VHDL 样例文件的话就选 VHDL Testbench)。
  3. 必要时把 End Time 填为 1000
  4. 在 File Name 一栏输入 export,点击 OK:

The Export Waveform Dialog Box

QuestaSIM 会在当前目录创建 export.v(或 export.vhd)文件,本课后面会编译并仿真它。

导出为扩展 VCD(EVCD)文件

  1. 选择 File > Export > Waveform。
  2. 选择 EVCD File。
  3. 必要时把 End Time 填为 1000,点击 OK。

QuestaSIM 会创建名为 export.vcd 的扩展 VCD 文件,本课后面会导入它。

运行仿真

波形编辑完毕,现在可以跑仿真了。

  1. 添加一个设计信号:

    • 在 Objects 窗口右键 count,选择 Add Wave。

信号被加进 Wave 窗口。

  1. 运行仿真。在 QuestaSIM> 提示符下输入:
run 1000

仿真运行 1000 ns,sim:/counter/count 的波形被画了出来:

The counter Waveform Reacts to Stimulus Patterns

观察 count 在 300 ns 到 500 ns 之间的信号跳变:跳变发生在 clk 变高的时刻,可以看到 count 完全跟着你刚才通过拉伸和删除边沿编辑出来的 clk 波形在走——激励生效了。

  1. 退出仿真:

    • 在 Main 窗口选择 Simulate > End Simulation,点击 Yes 确认;如果询问是否保存波形命令,点 No。

用导出的 testbench 仿真

前面把画好的波形导成了 testbench 文件,现在编译、装载并运行它。

  1. 编译并装载 testbench:

    • 在 QuestaSIM 提示符下输入 vlog export.v(VHDL 用户输入 vcom export.vhd)。

work 库里应该出现一个名为 export 的设计单元:

Library
NameTypePath
workLibraryC:/tutorials/verilog/basicSimulation/work
counterModuleC:\tutorials\verilog\basicSimulation/counter.v
exportModuleC:\tutorials\verilog\basicSimulation/export.v
floatfixlibLibrary$MODEL_TECH/../floatfixlib
mc2_libLibrary$MODEL_TECH/../mc2_lib
mtiAvmLibrary$MODEL_TECH/../avm
mtiOvmLibrary$MODEL_TECH/../ovm-2.0.3
mtiPALibrary$MODEL_TECH/../pa_lib
  • 在 QuestaSIM> 提示符下输入:
vsim -voptargs="+acc" export
  1. 添加波形并运行:

    • 在 VSIM> 提示符下输入 add wave *
    • 接着输入 run 1000

Wave 窗口里的波形和上一次练习看到的完全一致:

Wave - Default
Msgs
/export/count8'h07
/export/clk1'h1
/export/reset1'h0
Now1000 ns
Cursor 10 ns
  1. 退出仿真:

    • 在 VSIM> 提示符下输入 quit -sim,点击 Yes 确认。

导入 EVCD 文件

前面还导出了一个扩展 VCD 文件,现在用它来激励 counter 设计单元。

  1. 载入 counter 设计单元并添加波形:

    • 在 QuestaSIM> 提示符下输入:
vsim -voptargs="+acc" counter
  • 在 Objects 窗口右键 count,选择 Add Wave。
  1. 导入 VCD 文件:

    • 确保 Wave 窗口是活动窗口,然后在菜单栏选择 File > Import > EVCD。
    • 双击 export.vcd

创建好的波形在 Wave 窗口里画了出来:

EVCD File Loaded in Wave Window

  • 点击 Run -All 图标。

仿真运行 1000 ns,sim:/counter/count 的波形被画了出来:

Simulation results with EVCD File

信号自动映射

导入 EVCD 文件时,如果信号名和位宽都匹配,信号映射会自动完成;不匹配就需要手动映射,详见 User’s Manual 中的 Signal Mapping and Importing EVCD Files。

收尾

本课到此结束,结束当前仿真即可:

  1. 在 VSIM> 提示符下输入 quit -sim;如果询问是否保存波形命令,点 No。

自测