这一篇在干嘛?

实际项目里,你经常会拿到第三方提供的仿真模型——不是源码,而是已经编译好的「资源库」。这一篇带你完整走一遍多库工作流:先把计数器设计编译成资源库 parts_lib,再在另一个目录建工程编译 testbench,最后通过 Search Libraries 把两者链接起来跑通仿真。

FPGA 语境

这和 FPGA 开发里的厂商库是一个道理:比如在安路 TD 里做行为级仿真时,器件原语的仿真模型就是以预编译库形式提供的,你只需要「链接」它,而不必重新编译。第三方 IP 的仿真模型通常也是这么交付的。

本课的设计文件

样例设计是一个简单的 8 位二进制加法计数器,配套一个 testbench。路径如下:

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

本课示例使用 Verilog 版本的 tcounter.vcounter.v。如果你有 VHDL license,请改用 tcounter.vhdcounter.vhd。更多信息参阅 User’s Manual 中的 Design Libraries 一节。

动手前的检查项

创建资源库之前,先确认安装目录下的 modelsim.ini 属性是「只读」。这可以防止资源库被永久映射进主 modelsim.ini 文件。更多信息参见本篇末尾的「永久映射 VHDL 资源库」一节。

为什么 modelsim.ini 要保持只读?

创建新库时,QuestaSim 会把库的映射信息写入 modelsim.ini。如果安装目录下的主配置文件不是只读的,本次实验产生的临时映射就会被永久写进全局配置,日积月累会污染你的仿真环境。保持只读,映射只作用于当前工作目录,实验做完也好清理。

第一步:准备两个目录

本课要建两个目录:resource_library 存放资源库相关文件,testbench 存放 testbench 和工程文件。

  1. 创建资源库目录:新建一个名为 resource_library 的目录,把 <install_dir>/examples/tutorials/verilog/libraries 下的 counter.v 复制进去。

  2. 创建 testbench 目录:新建一个名为 testbench 的目录,把 <install_dir>/examples/tutorials/verilog/libraries 下的 tcounter.v 复制进去。

为什么要拆成两个目录?这是在模拟真实场景——资源库是第三方交给你的,通常和你的工程不在同一个地方。后面我们会把第一个目录里的资源库链接进第二个目录的工程。

  1. 启动 QuestaSim 并切换到 resource_library 目录:

    • 在 UNIX shell 输入 vsim,或在 Windows 下双击 QuestaSIM 图标。如果弹出 Welcome to Questa SIM 对话框,点击 Close。
    • 选择 File > Change Directory,切换到第 1 步创建的 resource_library 目录。

第二步:创建资源库 parts_lib

  1. 选择 File > New > Library。
  2. 在 Library Name 一栏输入 parts_lib,Library Physical Name 一栏会自动填写。对话框中选择默认项(新建一个库并建立到它的逻辑映射),如下图所示:

Creating New Resource Library

  1. 点击 OK。

点击 OK 之后,QuestaSim 会为这个库创建一个目录、把它列进 Library 窗口,并修改 modelsim.ini 文件把这个新库记录下来,供以后使用。

第三步:把 counter 编译进资源库

  1. 点击 Main 窗口工具栏上的 Compile 图标:

Compile 图标

  1. 在 Library 列表里选中 parts_lib 库:

Compiling into the Resource Library

  1. 双击 counter.v 进行编译。
  2. 点击 Done。

到这里,你就有了一个包含 counter 设计单元编译产物的资源库。

第四步:建工程编译 testbench

接下来创建一个包含 testbench tcounter.v 的工程。先把工作目录切回去:选择 File > Change Directory,切换到第一步创建的 testbench 目录。

创建工程

  1. 选择 File > New > Project。
  2. 在 Project Name 一栏输入 counter
  3. Project Location 和 Default Library Name 两栏保持默认(默认库名是 work)。
  4. 确认勾选了「Copy Library Mappings」,这样工程会使用默认的 modelsim.ini 文件。
  5. 点击 OK。

添加 testbench 文件

  1. 在 Add items to the Project 对话框里点击 Add Existing File。
  2. 点击 Browse 按钮,在「Select files to add to project」对话框里选中 tcounter.v
  3. 点击 Open,再点击 OK。
  4. 点击 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 里出现找不到的模块时,仿真器会到搜索库里去找。操作步骤如下:

  1. 点击 Main 窗口工具栏上的 Simulate 图标。
  2. 点击 work 库旁边的「+」图标,选中 test_counter
  3. 取消勾选 Enable optimization 选项。
  4. 点击 Libraries 选项卡。
  5. 点击 Search Libraries 一栏旁的 Add 按钮,浏览到本课前面创建的 resource_library 目录下的 parts_lib
  6. 点击 OK。此时对话框的 Search Libraries 一栏应该列出了 parts_lib

Specifying a Search Library in the Simulate Dialog Box

  1. 再次点击 OK。

这一次设计装载不再报错——仿真器通过 Search Libraries 找到了 counter 模块。

原理小结

Verilog 的编译是「按单元」进行的:testbench 编译时只要求自己的端口和引用合法,被实例化的模块可以在装载阶段才从搜索库中解析。这就是「先各自编译、再链接」的多库工作流能够成立的原因。

进阶:永久映射 VHDL 资源库

如果每个 VHDL 工程或仿真都要引用同一批 VHDL 资源库,你可以把它们永久映射进安装目录的主 modelsim.ini 文件。本教程并不实际练习这一步,但编辑文件的步骤如下:

  1. 在 QuestaSIM 安装目录找到 modelsim.ini(<install_dir>/questasim/modelsim.ini)。
  2. 重要:先给这个文件做一个备份。
  3. 修改 modelsim.ini 的文件属性,取消「只读」。
  4. 打开文件,在 [Library] 一节中写入你的库映射,例如:
parts_lib = C:/libraries/parts_lib
  1. 保存文件。
  2. 再把文件属性改回「只读」。

别忘了备份

主 modelsim.ini 影响所有工程。修改前务必备份;改完记得恢复只读属性,避免后续实验意外写入。

收尾

本课到此结束。继续下一课之前,需要结束当前仿真并关闭工程:

  1. 选择 Simulate > End Simulate。
  2. 点击 Yes。
  3. 点击 Project 窗口使其成为活动窗口。
  4. 选择 File > Close Project,点击 OK。

自测