这一篇在干嘛?

上一篇我们是「裸奔」:手动建库、手动编译、手动记住参数。这一篇改用**工程(Project)**来管理一切——工程会自动建 work 库、帮你盯着每个文件的编译状态,还能把常用的仿真选项存成配置,双击就能加载。文件一多,工程的价值就体现出来了。

本课的设计文件

还是那个 8 位二进制加法计数器和它的 testbench,不过这次放在 projects 目录下:

  • Verilog:<install_dir>/examples/tutorials/projects/counter.vtcounter.v
  • VHDL:<install_dir>/examples/tutorials/vhdl/projects/counter.vhdtcounter.vhd

本课以 Verilog 文件 tcounter.v 和 counter.v 为例。VHDL license 的用户用 tcounter.vhd 和 counter.vhd。想深入了解,参考 User’s Manual 里的 Projects 一章。

工程是一个 .mpf 文件,里面存着 work 库和会话状态,还可以包含:HDL 源文件或源文件引用、README 之类的其他项目文档、本地库、全局库的引用。

建立新工程(Create a New Project)

先定义工程设置,正式开工。

操作步骤:

  1. 新建目录、拷贝设计文件。为本次练习单独建一个目录,把 counter.v 和 tcounter.v(VHDL 则是 counter.vhd 和 tcounter.vhd)从安装目录拷进去。
  2. 启动 QuestaSim(如果上一篇做完还开着就不用了)。在 UNIX shell 输入 vsim,或点 Windows 下的 Questa SIM 图标;然后选 File > Change Directory 切到刚建的目录。
  3. 创建新工程
    • 在 Main 窗口菜单栏选择 File > New > Project,弹出 Create Project 对话框(Figure 4-1)。这里要填 Project Name(工程名)、Project Location(工程目录)和 Default Library Name(默认库名,编译出来的设计单元就住在这里)。你还可以引用某个 .ini 文件里的库设置,或把它们直接拷进工程。
    • Project Name 栏输入 test
    • 点 Project Location 栏的 Browse 按钮,选一个存放工程文件的目录;
    • Default Library Name 保持 work 不动;
    • OK

Figure 4-1. Create Project Dialog Box - Project Lab

和上一篇对比一下

上一篇要先 vlib work 手动建库,这一步在工程流程里被自动完成了——这就是上一篇说的「工程流程的两个区别」之一:不用手动创建工作库。另一个区别(工程持久化,不关就一直跟着 QuestaSim 开)在本课结尾会再见到。

往工程里加东西(Add Objects to the Project)

点 OK 之后,一个空白的 Project 窗口和 Add items to the Project 对话框一起出现了。

Figure 4-2. Adding New Items to a Project

从这个对话框可以:新建设计文件、添加已有文件、为了整理而加文件夹、或创建仿真配置(后面会讲)。本课先加两个已有文件:

  1. Add Existing File,打开 Add file to Project 对话框(Figure 4-3)。在这里可以浏览文件、指定文件类型、指定把文件加进哪个文件夹,并选择文件留在原处还是拷贝到工程目录

Figure 4-3. Add file to Project Dialog Box

  1. 点 File Name 栏的 Browse 按钮,弹出「Select files to add to project」对话框,显示当前目录内容;
  2. Verilog 用户:选中 counter.v 和 tcounter.v,点 Open(VHDL 用户选 counter.vhd 和 tcounter.vhd)。所选文件出现在 Add file to Project 对话框里;
  3. OK 把文件加进工程;
  4. Close 关掉 Add items to the Project 对话框。

现在 Project 窗口里列出了两个文件(Figure 4-4)。注意 Status 列的问号图标:它表示文件还没编译过、或源文件在上次成功编译之后又改过了。其他列显示文件类型(Verilog 或 VHDL)、编译顺序和修改日期。

Figure 4-4. Newly Added Project Files Display a ’?’ for Status

NameStatusTypeOrderModified
tcounter.vVerilog110/15/08 09:58:50 PM
counter.vVerilog010/15/08 09:58:50 PM

调整编译顺序(VHDL)

默认情况下,QuestaSim 在用 vsim 命令加载设计时执行 VHDL 的默认绑定(default binding)。但你也可以选择在编译期做默认绑定——如果这么做,编译顺序就重要了。在工程里改编译顺序的步骤:

  1. 选择 Compile > Compile Order,打开 Compile Order 对话框;
  2. Auto Generate 按钮。QuestaSim 会对文件做多轮扫描来推断编译顺序:从头开始编,某个文件因为依赖编不过,就把它挪到最后、等其余文件编完再编它,如此循环,直到全部编过、或某文件因为依赖以外的原因彻底编不过为止;
  3. 也可以手动来:选中文件,用 Move Up / Move Down 按钮调整到正确顺序(Figure 4-5);
  4. OK 关闭对话框。

Figure 4-5. Compile Order Dialog Box

Verilog 用户可以跳过这节吗

这节标题就标了 VHDL——Verilog 的依赖关系靠 `include 等机制,对编译顺序没这么敏感。但如果你以后要仿真 Verilog + VHDL 混合设计,理解「依赖文件先编译」的原则依然有用。

编译设计

工程设置好了、文件也加进来了,开始编译。

  1. 编译文件:在 Project 窗口里右键 counter.v 或 tcounter.v 任一文件,从弹出菜单选 Compile > Compile All

QuestaSim 会把两个文件都编一遍,并把 Status 列的图标变成绿色对勾——对勾表示编译成功。编译失败则是红色 X,同时 Transcript 窗口给出错误信息。

  1. 查看设计单元
    • Library 标签(Figure 4-6);
    • 点 work 库旁的 + 号。

能看到两个编译好的设计单元、它们的类型(这里是 modules)和源文件路径——和上一篇手动编译后看到的一样,只是这次编译状态由工程替你盯着。

Figure 4-6. Library Window with Expanded Library

Library
NameTypePath
workLibraryC:/tutorials/verilog/projects/work
counterModuleC:/tutorials/verilog/projects/counter.v
test_counterModuleC:/tutorials/verilog/projects/tcounter.v
floatfixlibLibrary$MODEL_TECH/../floatfixlib
mtiAvmLibrary$MODEL_TECH/../avm
mtiOvmLibrary$MODEL_TECH/../ovm-2.0
mtiUPFLibrary$MODEL_TECH/../upf_lib
sv_stdLibrary$MODEL_TECH/../sv_std
vital2000Library$MODEL_TECH/../vital2000
ieeeLibrary$MODEL_TECH/../ieee
modelsim_libLibrary$MODEL_TECH/../modelsim_lib

优化设计(保持可见性)

优化有助于缩短仿真时间。在 Transcript 窗口的 QuestaSim> 提示符后输入:

vopt +acc test_counter -o testcounter_opt
  • +acc:为调试保留对设计的可见性;
  • -o:指定优化后设计文件的名字(testcounter_opt)。

优化文件名必须指定

使用 vopt 命令时必须给优化后的设计文件起名字。另外别忘了 +acc——不加它,后面调试时想看内部信号会被优化藏起来。

加载设计

  1. 加载 test_counter 设计单元。用优化后的设计名执行:
vsim testcounter_opt

加载后 Structure (sim) 窗口会出现在 Library、Project 窗口所在的标签组里(Figure 4-7)。

Figure 4-7. Structure(sim) window for a Loaded Design

到这里,通常就该像上一篇那样跑仿真、分析调试了。但本课我们继续研究工程本身。先结束刚才加载 test_counter 时启动的仿真:

  1. 结束仿真:选择 Simulate > End Simulation,点 Yes

用文件夹整理工程

要往工程里加很多文件时,最好用文件夹归类。文件夹可以在加文件之前建(加文件时直接在 Folder 字段指定去处,见 Figure 4-3),也可以在加文件之后建(编辑文件属性挪进去)。

加文件夹

Add items to the Project 对话框里有加文件夹的选项;如果已经关掉了它,用菜单命令也可以:

  1. 加一个新文件夹
    • 在 Project 窗口右键,选 Add to Project > Folder
    • Folder Name 栏输入 Design Files(Figure 4-8);
    • OK。新的 Design Files 文件夹出现在 Project 窗口(Figure 4-9)。

Figure 4-8. Adding New Folder to Project

Figure 4-9. A Folder Within a Project

  1. 加一个子文件夹
    • 在 Project 窗口任意位置右键,选 Add to Project > Folder
    • Folder Name 栏输入 HDL(Figure 4-10);
    • 点 Folder Location 下拉箭头,选 Design Files
    • OK。Project 窗口里 Design Files 文件夹旁出现 + 号(Figure 4-11);
    • + 号展开,能看到 HDL 子文件夹。

Figure 4-10. Creating Subfolder

Figure 4-11. A folder with a Sub-folder

Project - C:/tutorials/verilog/projects/test
NameStatusTypeOrderModified
counter.vVerilog 010/15/08 09:58:50 PM
tcounter.vVerilog 110/15/08 09:58:50 PM
Design FilesFolder
HDLFolder

把文件挪进文件夹

如果加文件时没放进文件夹,可以用 Project Compiler Settings 对话框补挪。本课把 tcounter.v 和 counter.v 挪进 HDL 文件夹:

  1. 在 Project 窗口同时选中 counter.v 和 tcounter.v;
  2. 右键任一文件,选 Properties,打开 Project Compiler Settings 对话框(Figure 4-12),这里可以设置设计文件的多种选项;
  3. 点 Place In Folder 下拉箭头,选 HDL
  4. OK。两个文件被挪进 HDL 文件夹,点 HDL 文件夹旁的 + 号查看。

注意:挪动之后文件在 Status 列重新变成 ?——因为文件位置变了,工程无法确定之前的编译结果还有没有效

Figure 4-12. Changing File Location

状态图标是工程的「账本」

? = 未编译或源码/位置变动过、 = 编译通过、红 X = 编译失败。挪了文件、改了代码之后看到 ? 不要慌,重新 Compile All 即可。养成扫一眼 Status 列的习惯,很多「怎么仿真结果怪怪的」问题根源是改了代码忘了重编。

使用仿真配置(Simulation Configuration)

仿真配置把「设计单元 + 它的仿真选项」绑在一起。举个例子:假设你每次加载 tcounter.v 都想把仿真分辨率设成皮秒(ps),并开启事件顺序冒险检查(hazard checking)。常规做法是每次加载都手动指定这些选项;有了仿真配置,把这些选项和设计存成一个「配置」,以后双击配置就能带着所有选项加载设计。

创建仿真配置

  1. 在 Project 窗口右键,从弹出菜单选 Add to Project > Simulation Configuration,打开 Add Simulation Configuration 对话框(Figure 4-13)。对话框里的各个标签页提供多种仿真选项,可以都点开看看;每个选项的具体含义可查 Questa SIM User’s Manual;
  2. Simulation Configuration Name 栏输入 counter
  3. Place in Folder 下拉选 HDL
  4. 点 work 库旁的 + 号,选中 test_counter
  5. 点 Resolution 下拉,选 ps
  6. 取消勾选 Enable optimization
  7. Verilog 用户:点 Verilog 标签,勾选 Enable hazard checking (-hazards)
  8. Save

Figure 4-13. Simulation Configuration Dialog Box

保存后,tcounter.v 和 counter.v 在 Status 列显示问号图标——因为它们自上次编译后位置变了,需要重新编译:

  1. 选中 tcounter.v 或 counter.v 任一文件;
  2. 选择 Compile > Compile All

现在 Project 窗口的 HDL 文件夹里多了一个名为 counter 的 Simulation 配置(Figure 4-14)。

Figure 4-14. A Simulation Configuration in the Project window

Project - C:/tutorials/verilog/projects/test
NameStatusTypeOrderModified
Design FilesFolder
HDLFolder
tcounter.vVerilog110/15/08 09:58:50 PM
counter.vVerilog010/15/08 09:58:50 PM
counterSimulation

加载仿真配置

在 Project 窗口里双击 counter 这个 Simulation Configuration。

Main 窗口的 Transcript 里,vsim(QuestaSim 仿真器)的调用命令会显示出 -hazards-t ps 开关(Figure 4-15)——这正是你在对话框里勾选的那些选项的命令行等价形式:

Figure 4-15. Transcript Shows Options for Simulation Configurations

Transcript
vsim -hazards -t ps -novopt work.test_counter
# vsim -hazards -t ps -novopt work.test_counter
# Loading work.test_counter
# Loading work.counter Command Line
VSIM 14>]
Command Line
Switches
Project : test Now: 0 ps

仿真配置是 GUI 和脚本之间的桥

注意回显里的 -novopt:勾掉了 Enable optimization,vsim 就带上了这个开关。以后你想把某套仿真设置写进批处理脚本时,看一眼配置加载时的 Transcript 回显,命令行参数照抄就行——不用去翻几百页手册。

收尾:结束仿真、关闭工程

课程结束,把当前仿真结束掉、工程也关上:

  1. 选择 Simulate > End Simulation,点 Yes
  2. 在 Project 窗口右键,选 Close Project

如果不关工程,下次启动 QuestaSim 时它会自动打开——还记得吗,工程是持久的。

下一篇我们练习多库仿真:把 counter 设计单元放进一个资源库,testbench 编译进工程,然后链接资源库跑仿真。多库能用来组织设计、访问第三方 IP、或在多个仿真之间共享公共部件。

自测