这一篇在干嘛?
实际项目里,你经常会拿到第三方提供的仿真模型——不是源码,而是已经编译好的「资源库」。这一篇带你完整走一遍多库工作流:先把计数器设计编译成资源库 parts_lib,再在另一个目录建工程编译 testbench,最后通过 Search Libraries 把两者链接起来跑通仿真。
FPGA 语境
这和 FPGA 开发里的厂商库是一个道理:比如在安路 TD 里做行为级仿真时,器件原语的仿真模型就是以预编译库形式提供的,你只需要「链接」它,而不必重新编译。第三方 IP 的仿真模型通常也是这么交付的。
本课的设计文件
样例设计是一个简单的 8 位二进制加法计数器,配套一个 testbench。路径如下:
- Verilog:
<install_dir>/examples/tutorials/verilog/libraries/counter.v和tcounter.v - VHDL:
<install_dir>/examples/tutorials/vhdl/libraries/counter.vhd和tcounter.vhd
本课示例使用 Verilog 版本的 tcounter.v 和 counter.v。如果你有 VHDL license,请改用 tcounter.vhd 和 counter.vhd。更多信息参阅 User’s Manual 中的 Design Libraries 一节。
动手前的检查项
创建资源库之前,先确认安装目录下的 modelsim.ini 属性是「只读」。这可以防止资源库被永久映射进主 modelsim.ini 文件。更多信息参见本篇末尾的「永久映射 VHDL 资源库」一节。
为什么 modelsim.ini 要保持只读?
创建新库时,QuestaSim 会把库的映射信息写入 modelsim.ini。如果安装目录下的主配置文件不是只读的,本次实验产生的临时映射就会被永久写进全局配置,日积月累会污染你的仿真环境。保持只读,映射只作用于当前工作目录,实验做完也好清理。
第一步:准备两个目录
本课要建两个目录:resource_library 存放资源库相关文件,testbench 存放 testbench 和工程文件。
-
创建资源库目录:新建一个名为
resource_library的目录,把<install_dir>/examples/tutorials/verilog/libraries下的counter.v复制进去。 -
创建 testbench 目录:新建一个名为
testbench的目录,把<install_dir>/examples/tutorials/verilog/libraries下的tcounter.v复制进去。
为什么要拆成两个目录?这是在模拟真实场景——资源库是第三方交给你的,通常和你的工程不在同一个地方。后面我们会把第一个目录里的资源库链接进第二个目录的工程。
-
启动 QuestaSim 并切换到
resource_library目录:- 在 UNIX shell 输入
vsim,或在 Windows 下双击 QuestaSIM 图标。如果弹出 Welcome to Questa SIM 对话框,点击 Close。 - 选择 File > Change Directory,切换到第 1 步创建的
resource_library目录。
- 在 UNIX shell 输入
第二步:创建资源库 parts_lib
- 选择 File > New > Library。
- 在 Library Name 一栏输入
parts_lib,Library Physical Name 一栏会自动填写。对话框中选择默认项(新建一个库并建立到它的逻辑映射),如下图所示:

- 点击 OK。
点击 OK 之后,QuestaSim 会为这个库创建一个目录、把它列进 Library 窗口,并修改 modelsim.ini 文件把这个新库记录下来,供以后使用。
第三步:把 counter 编译进资源库
- 点击 Main 窗口工具栏上的 Compile 图标:

- 在 Library 列表里选中
parts_lib库:

- 双击
counter.v进行编译。 - 点击 Done。
到这里,你就有了一个包含 counter 设计单元编译产物的资源库。
第四步:建工程编译 testbench
接下来创建一个包含 testbench tcounter.v 的工程。先把工作目录切回去:选择 File > Change Directory,切换到第一步创建的 testbench 目录。
创建工程
- 选择 File > New > Project。
- 在 Project Name 一栏输入
counter。 - Project Location 和 Default Library Name 两栏保持默认(默认库名是
work)。 - 确认勾选了「Copy Library Mappings」,这样工程会使用默认的 modelsim.ini 文件。
- 点击 OK。
添加 testbench 文件
- 在 Add items to the Project 对话框里点击 Add Existing File。
- 点击 Browse 按钮,在「Select files to add to project」对话框里选中
tcounter.v。 - 点击 Open,再点击 OK。
- 点击 Close 关掉 Add items to the Project 对话框。
此时 tcounter.v 会出现在 Project 窗口的文件列表里。
编译 testbench
在 Project 窗口里右键 tcounter.v,选择 Compile > Compile Selected。
testbench 编译进了 work 库。注意:counter 模块本身并没有编译进 work——它只存在于 parts_lib 里。接下来就看你能不能把它「找回来」。
不链接资源库会发生什么?
在正式链接 parts_lib 之前,先故意不链接、直接优化 testbench,看看会发生什么。QuestaSim 对 Verilog 和 VHDL 的反应方式略有不同。
优化设计可以提升仿真吞吐量。这里用 vopt 命令做全调试可见性的优化:
Verilog 版本
在 Transcript 窗口的 QuestaSim> 提示符下输入:
vopt +acc test_counter -o testcounter_opt+acc开关让设计在优化后仍保留调试可见性;-o开关用来给优化后的设计起名字(这里是testcounter_opt)。
-o后面必须给名字使用
vopt命令时必须为优化后的设计文件提供一个名字,否则命令无法执行。
由于 counter 模块没有被定义,Main 窗口的 Transcript 会报告装载错误:
# Analyzing design...
# -- Loading module test counter
# ** Error: C:/Tutorial/examples/tutorials/verilog/libraries/test bench/tcounter.v(16): Module 'counter' is not defined.
# Optimization failed
# C:/questasim_main/win32/vopt failed.
QuestaSim>错误信息说得很直白:testbench 里实例化的 counter 模块在当前可见的库里找不到。
VHDL 版本
VHDL 用户执行同样的命令:
vopt +acc test_counter -o testcounter_opt两个开关的含义与 Verilog 版本相同:+acc 提供调试可见性,-o 指定优化设计文件名 testcounter_opt。同样,vopt 命令必须提供优化设计文件名。
链接资源库:指定 Search Library
链接资源库的关键,是在启动仿真器时指定一个「搜索库」(search library)。当 testbench 里出现找不到的模块时,仿真器会到搜索库里去找。操作步骤如下:
- 点击 Main 窗口工具栏上的 Simulate 图标。
- 点击
work库旁边的「+」图标,选中test_counter。 - 取消勾选 Enable optimization 选项。
- 点击 Libraries 选项卡。
- 点击 Search Libraries 一栏旁的 Add 按钮,浏览到本课前面创建的
resource_library目录下的parts_lib。 - 点击 OK。此时对话框的 Search Libraries 一栏应该列出了
parts_lib:

- 再次点击 OK。
这一次设计装载不再报错——仿真器通过 Search Libraries 找到了 counter 模块。
原理小结
Verilog 的编译是「按单元」进行的:testbench 编译时只要求自己的端口和引用合法,被实例化的模块可以在装载阶段才从搜索库中解析。这就是「先各自编译、再链接」的多库工作流能够成立的原因。
进阶:永久映射 VHDL 资源库
如果每个 VHDL 工程或仿真都要引用同一批 VHDL 资源库,你可以把它们永久映射进安装目录的主 modelsim.ini 文件。本教程并不实际练习这一步,但编辑文件的步骤如下:
- 在 QuestaSIM 安装目录找到 modelsim.ini(
<install_dir>/questasim/modelsim.ini)。 - 重要:先给这个文件做一个备份。
- 修改 modelsim.ini 的文件属性,取消「只读」。
- 打开文件,在
[Library]一节中写入你的库映射,例如:
parts_lib = C:/libraries/parts_lib- 保存文件。
- 再把文件属性改回「只读」。
别忘了备份
主 modelsim.ini 影响所有工程。修改前务必备份;改完记得恢复只读属性,避免后续实验意外写入。
收尾
本课到此结束。继续下一课之前,需要结束当前仿真并关闭工程:
- 选择 Simulate > End Simulate。
- 点击 Yes。
- 点击 Project 窗口使其成为活动窗口。
- 选择 File > Close Project,点击 OK。
自测
自测
- 创建资源库前,为什么要求安装目录下的 modelsim.ini 保持「只读」属性?
- 在 File > New > Library 对话框中输入库名 parts_lib 后,Library Physical Name 一栏需要手动填写吗?点击 OK 后 QuestaSim 做了哪三件事?
- 执行
vopt +acc test_counter -o testcounter_opt时报错 Module ‘counter’ is not defined,原因是什么?+acc和-o两个开关分别起什么作用?- 在 Start/Simulate 对话框中,链接资源库要在哪个选项卡的哪个字段里添加库?
- 永久映射 VHDL 资源库需要编辑哪个文件?修改前后分别要注意什么?