这一篇在干嘛?
上一篇我们是「裸奔」:手动建库、手动编译、手动记住参数。这一篇改用**工程(Project)**来管理一切——工程会自动建 work 库、帮你盯着每个文件的编译状态,还能把常用的仿真选项存成配置,双击就能加载。文件一多,工程的价值就体现出来了。
本课的设计文件
还是那个 8 位二进制加法计数器和它的 testbench,不过这次放在 projects 目录下:
- Verilog:
<install_dir>/examples/tutorials/projects/counter.v和tcounter.v - VHDL:
<install_dir>/examples/tutorials/vhdl/projects/counter.vhd和tcounter.vhd
本课以 Verilog 文件 tcounter.v 和 counter.v 为例。VHDL license 的用户用 tcounter.vhd 和 counter.vhd。想深入了解,参考 User’s Manual 里的 Projects 一章。
工程是一个 .mpf 文件,里面存着 work 库和会话状态,还可以包含:HDL 源文件或源文件引用、README 之类的其他项目文档、本地库、全局库的引用。
建立新工程(Create a New Project)
先定义工程设置,正式开工。
操作步骤:
- 新建目录、拷贝设计文件。为本次练习单独建一个目录,把 counter.v 和 tcounter.v(VHDL 则是 counter.vhd 和 tcounter.vhd)从安装目录拷进去。
- 启动 QuestaSim(如果上一篇做完还开着就不用了)。在 UNIX shell 输入
vsim,或点 Windows 下的 Questa SIM 图标;然后选 File > Change Directory 切到刚建的目录。 - 创建新工程:
- 在 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

从这个对话框可以:新建设计文件、添加已有文件、为了整理而加文件夹、或创建仿真配置(后面会讲)。本课先加两个已有文件:
- 点 Add Existing File,打开 Add file to Project 对话框(Figure 4-3)。在这里可以浏览文件、指定文件类型、指定把文件加进哪个文件夹,并选择文件留在原处还是拷贝到工程目录。
Figure 4-3. Add file to Project Dialog Box

- 点 File Name 栏的 Browse 按钮,弹出「Select files to add to project」对话框,显示当前目录内容;
- Verilog 用户:选中 counter.v 和 tcounter.v,点 Open(VHDL 用户选 counter.vhd 和 tcounter.vhd)。所选文件出现在 Add file to Project 对话框里;
- 点 OK 把文件加进工程;
- 点 Close 关掉 Add items to the Project 对话框。
现在 Project 窗口里列出了两个文件(Figure 4-4)。注意 Status 列的问号图标:它表示文件还没编译过、或源文件在上次成功编译之后又改过了。其他列显示文件类型(Verilog 或 VHDL)、编译顺序和修改日期。
Figure 4-4. Newly Added Project Files Display a ’?’ for Status
| Name | Status | Type | Order | Modified |
| tcounter.v | Verilog | 1 | 10/15/08 09:58:50 PM | |
| counter.v | Verilog | 0 | 10/15/08 09:58:50 PM |
调整编译顺序(VHDL)
默认情况下,QuestaSim 在用 vsim 命令加载设计时执行 VHDL 的默认绑定(default binding)。但你也可以选择在编译期做默认绑定——如果这么做,编译顺序就重要了。在工程里改编译顺序的步骤:
- 选择 Compile > Compile Order,打开 Compile Order 对话框;
- 点 Auto Generate 按钮。QuestaSim 会对文件做多轮扫描来推断编译顺序:从头开始编,某个文件因为依赖编不过,就把它挪到最后、等其余文件编完再编它,如此循环,直到全部编过、或某文件因为依赖以外的原因彻底编不过为止;
- 也可以手动来:选中文件,用 Move Up / Move Down 按钮调整到正确顺序(Figure 4-5);
- 点 OK 关闭对话框。
Figure 4-5. Compile Order Dialog Box

Verilog 用户可以跳过这节吗
这节标题就标了 VHDL——Verilog 的依赖关系靠 `include 等机制,对编译顺序没这么敏感。但如果你以后要仿真 Verilog + VHDL 混合设计,理解「依赖文件先编译」的原则依然有用。
编译设计
工程设置好了、文件也加进来了,开始编译。
- 编译文件:在 Project 窗口里右键 counter.v 或 tcounter.v 任一文件,从弹出菜单选 Compile > Compile All。
QuestaSim 会把两个文件都编一遍,并把 Status 列的图标变成绿色对勾——对勾表示编译成功。编译失败则是红色 X,同时 Transcript 窗口给出错误信息。
- 查看设计单元:
- 点 Library 标签(Figure 4-6);
- 点 work 库旁的
+号。
能看到两个编译好的设计单元、它们的类型(这里是 modules)和源文件路径——和上一篇手动编译后看到的一样,只是这次编译状态由工程替你盯着。
Figure 4-6. Library Window with Expanded Library
| Library | |||
| Name | Type | Path | |
| work | Library | C:/tutorials/verilog/projects/work | |
| counter | Module | C:/tutorials/verilog/projects/counter.v | |
| test_counter | Module | C:/tutorials/verilog/projects/tcounter.v | |
| floatfixlib | Library | $MODEL_TECH/../floatfixlib | |
| mtiAvm | Library | $MODEL_TECH/../avm | |
| mtiOvm | Library | $MODEL_TECH/../ovm-2.0 | |
| mtiUPF | Library | $MODEL_TECH/../upf_lib | |
| sv_std | Library | $MODEL_TECH/../sv_std | |
| vital2000 | Library | $MODEL_TECH/../vital2000 | |
| ieee | Library | $MODEL_TECH/../ieee | |
| modelsim_lib | Library | $MODEL_TECH/../modelsim_lib | |
优化设计(保持可见性)
优化有助于缩短仿真时间。在 Transcript 窗口的 QuestaSim> 提示符后输入:
vopt +acc test_counter -o testcounter_opt+acc:为调试保留对设计的可见性;-o:指定优化后设计文件的名字(testcounter_opt)。
优化文件名必须指定
使用 vopt 命令时必须给优化后的设计文件起名字。另外别忘了
+acc——不加它,后面调试时想看内部信号会被优化藏起来。
加载设计
- 加载 test_counter 设计单元。用优化后的设计名执行:
vsim testcounter_opt加载后 Structure (sim) 窗口会出现在 Library、Project 窗口所在的标签组里(Figure 4-7)。
Figure 4-7. Structure(sim) window for a Loaded Design

到这里,通常就该像上一篇那样跑仿真、分析调试了。但本课我们继续研究工程本身。先结束刚才加载 test_counter 时启动的仿真:
- 结束仿真:选择 Simulate > End Simulation,点 Yes。
用文件夹整理工程
要往工程里加很多文件时,最好用文件夹归类。文件夹可以在加文件之前建(加文件时直接在 Folder 字段指定去处,见 Figure 4-3),也可以在加文件之后建(编辑文件属性挪进去)。
加文件夹
Add items to the Project 对话框里有加文件夹的选项;如果已经关掉了它,用菜单命令也可以:
- 加一个新文件夹:
- 在 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

- 加一个子文件夹:
- 在 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 | |||||
| Name | Status | Type | Order | Modified | |
| counter.v | √ | Verilog 0 | 10/15/08 09:58:50 PM | ||
| tcounter.v | √ | Verilog 1 | 10/15/08 09:58:50 PM | ||
| Design Files | Folder | ||||
| HDL | Folder | ||||
把文件挪进文件夹
如果加文件时没放进文件夹,可以用 Project Compiler Settings 对话框补挪。本课把 tcounter.v 和 counter.v 挪进 HDL 文件夹:
- 在 Project 窗口同时选中 counter.v 和 tcounter.v;
- 右键任一文件,选 Properties,打开 Project Compiler Settings 对话框(Figure 4-12),这里可以设置设计文件的多种选项;
- 点 Place In Folder 下拉箭头,选 HDL;
- 点 OK。两个文件被挪进 HDL 文件夹,点 HDL 文件夹旁的
+号查看。
注意:挪动之后文件在 Status 列重新变成 ?——因为文件位置变了,工程无法确定之前的编译结果还有没有效。
Figure 4-12. Changing File Location

状态图标是工程的「账本」
?= 未编译或源码/位置变动过、√= 编译通过、红X= 编译失败。挪了文件、改了代码之后看到?不要慌,重新 Compile All 即可。养成扫一眼 Status 列的习惯,很多「怎么仿真结果怪怪的」问题根源是改了代码忘了重编。
使用仿真配置(Simulation Configuration)
仿真配置把「设计单元 + 它的仿真选项」绑在一起。举个例子:假设你每次加载 tcounter.v 都想把仿真分辨率设成皮秒(ps),并开启事件顺序冒险检查(hazard checking)。常规做法是每次加载都手动指定这些选项;有了仿真配置,把这些选项和设计存成一个「配置」,以后双击配置就能带着所有选项加载设计。
创建仿真配置
- 在 Project 窗口右键,从弹出菜单选 Add to Project > Simulation Configuration,打开 Add Simulation Configuration 对话框(Figure 4-13)。对话框里的各个标签页提供多种仿真选项,可以都点开看看;每个选项的具体含义可查 Questa SIM User’s Manual;
- Simulation Configuration Name 栏输入
counter; - Place in Folder 下拉选 HDL;
- 点 work 库旁的
+号,选中 test_counter; - 点 Resolution 下拉,选 ps;
- 取消勾选 Enable optimization;
- Verilog 用户:点 Verilog 标签,勾选 Enable hazard checking (-hazards);
- 点 Save。
Figure 4-13. Simulation Configuration Dialog Box

保存后,tcounter.v 和 counter.v 在 Status 列显示问号图标——因为它们自上次编译后位置变了,需要重新编译:
- 选中 tcounter.v 或 counter.v 任一文件;
- 选择 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 | |||||
| Name | Status | Type | Order | Modified | |
| Design Files | Folder | ||||
| HDL | Folder | ||||
| tcounter.v | √ | Verilog | 1 | 10/15/08 09:58:50 PM | |
| counter.v | √ | Verilog | 0 | 10/15/08 09:58:50 PM | |
| counter | Simulation | ||||
加载仿真配置
在 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 回显,命令行参数照抄就行——不用去翻几百页手册。
收尾:结束仿真、关闭工程
课程结束,把当前仿真结束掉、工程也关上:
- 选择 Simulate > End Simulation,点 Yes;
- 在 Project 窗口右键,选 Close Project。
如果不关工程,下次启动 QuestaSim 时它会自动打开——还记得吗,工程是持久的。
下一篇我们练习多库仿真:把 counter 设计单元放进一个资源库,testbench 编译进工程,然后链接资源库跑仿真。多库能用来组织设计、访问第三方 IP、或在多个仿真之间共享公共部件。
自测
自测
- 创建新工程需要填写哪三项基本设置?默认库名的作用是什么?
- Project 窗口 Status 列的问号、绿色对勾、红色 X 分别代表什么?
- Compile Order 对话框的 Auto Generate 按钮是怎么推断编译顺序的?
- 把已编译的文件挪进另一个文件夹后,Status 列为什么会重新变成问号?
- 仿真配置解决了什么问题?双击 counter 配置后,Transcript 回显的完整 vsim 命令是什么?