目录
- 1. 为什么你一定要学会 ModelSim 仿真?
- 2. ModelSim 是什么?它能做什么?
- 3. 环境准备:安装与配置详解
- 3.1 获取安装包
- 3.2 安装步骤
- 3.3 环境变量配置
- 4. 第一个仿真工程:从创建到运行
- 4.1 创建工程目录与源文件
- 4.2 在 ModelSim 中创建工程
- 4.3 编译设计文件
- 4.4 启动仿真
- 4.5 添加波形并运行
- 4.6 实战例程:带使能的可逆计数器
- 4.7 两种计数器例程对比
- 5. 深入理解 ModelSim 的仿真流程
- 5.1 编译(Compile)阶段
- 5.2 仿真(Simulate)阶段
- 5.3 波形查看与调试
- 6. 使用 Tcl 脚本实现自动化仿真
- 7. 常见问题与解决方案
- 7.1 编译报错速查
- 8. 进阶技巧:让仿真效率翻倍
- 8.1 使用 Do 文件管理复杂流程
- 8.2 利用断点调试
- 8.3 批量回归测试
- 9. 总结与学习建议
- 9.1 SystemVerilog 断言(SVA)入门
- 参考资料
前言
本教程专为 FPGA 初学者和数字电路相关专业的学生编写,旨在帮助你从零开始系统掌握 ModelSim 这一业界主流 HDL 仿真工具。阅读本文前,建议你已熟悉 Verilog 基础语法,了解模块、信号与 always 块等基本概念。学完本文后,你将能够独立完成 ModelSim 的安装配置、工程创建、编译仿真与波形调试,并掌握使用 Tcl 脚本实现自动化仿真的能力,为后续深入学习 SystemVerilog 断言与功能覆盖率打下坚实基础。
TL;DR 速览
- ModelSim:业界主流 HDL 仿真器。
- 安装:免费版随 Quartus 提供。
- 流程:编译、仿真、波形调试。
- 自动化:Tcl 脚本一键执行。
- 排障:常见问题有对应方案。
1. 为什么你一定要学会 ModelSim 仿真?
在数字电路与 FPGA 开发领域,仿真验证是保证设计正确性的第一道也是最重要的一道关卡。ModelSim 作为业界最成熟的 HDL 仿真工具之一,凭借其强大的调试能力、灵活的脚本支持和广泛的器件库兼容性,长期占据 FPGA 开发者工具链的核心位置。无论你是刚接触 Verilog/VHDL 的学生,还是正在从事复杂 SoC 验证的工程师,掌握 ModelSim 都能显著提升你的开发效率和设计可靠性。
本教程将带你从零开始,系统性地掌握 ModelSim 的完整使用流程。内容涵盖环境搭建、工程创建、仿真执行、波形调试、脚本自动化等核心环节,每一步都配有可复现的操作说明和代码示例,确保你能够边学边练、快速上手。
2. ModelSim 是什么?它能做什么?
ModelSim 是由 Mentor Graphics(现属 Siemens EDA)开发的 HDL 仿真器,支持 Verilog、SystemVerilog 和 VHDL 语言的编译、仿真与调试。它可以在代码编写阶段就发现逻辑错误、时序冲突和功能缺陷,避免将问题带到后续的综合与布局布线阶段,从而大幅降低开发成本和返工风险。
ModelSim 的核心能力包括:
- 多语言支持:同时支持 Verilog、SystemVerilog、VHDL 以及混合语言仿真。
- 波形调试:提供直观的波形窗口,可查看信号随时间变化的详细过程。
- 脚本自动化:通过 Tcl 脚本实现编译、仿真、波形输出的全流程自动化。
- 覆盖率分析:支持代码覆盖率与功能覆盖率统计,帮助评估验证完整性。
- 性能优化:支持编译优化、增量编译和并行仿真,提升大型设计的仿真速度。
3. 环境准备:安装与配置详解
在开始仿真之前,你需要先完成 ModelSim 的安装与基础配置。以下是完整的操作步骤。
3.1 获取安装包
ModelSim 的官方发行版本分为 ModelSim SE(商业版)和 ModelSim Intel FPGA Starter Edition(免费版,随 Quartus Prime Lite 一起提供)。对于个人学习和中小规模项目,免费版已经足够使用。你可以从 Intel 官网下载 Quartus Prime Lite,安装时勾选 ModelSim 组件即可。
3.2 安装步骤
3.3 环境变量配置
为了方便在命令行中调用 ModelSim 命令,建议将 ModelSim 的 bin 目录添加到系统 PATH 环境变量中。以 Windows 系统为例:
4. 第一个仿真工程:从创建到运行
下面我们通过一个最简单的计数器示例,完整走一遍 ModelSim 的仿真流程。这个示例虽然简单,但涵盖了工程创建、编译、仿真、波形查看的全部核心步骤。
4.1 创建工程目录与源文件
首先在本地磁盘新建一个文件夹,例如 counter_demo,并在其中创建两个文件:counter.v(设计文件)和 counter_tb.v(测试文件)。
counter.v 的代码如下:
module counter (
input wire clk,
input wire rst_n,
output reg [3:0] count
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
count <= 4'b0000;
else
count <= count + 1'b1;
end
endmodule
counter_tb.v 的测试代码如下:
`timescale 1ns / 1ps
module counter_tb;
reg clk;
reg rst_n;
wire [3:0] count;
counter uut (
.clk(clk),
.rst_n(rst_n),
.count(count)
);
initial begin
clk = 0;
rst_n = 0;
#100;
rst_n = 1;
#500;
$finish;
end
always #10 clk = ~clk;
endmodule
4.2 在 ModelSim 中创建工程
4.3 编译设计文件
4.4 启动仿真
4.5 添加波形并运行
运行仿真后,Wave 窗口中的波形大致如下图所示(此处以文字描述替代实际截图):

下面结合上图,逐一对 clk、rst_n、count 三个信号的变化规律进行说明:
- clk(时钟信号):由测试文件中的 always #10 clk = ~clk; 语句驱动,周期为 20ns,占空比 50%。波形上表现为高低电平交替的方波,每个上升沿触发计数器递增一次。
- rst_n(异步复位信号):仿真开始后的前 100ns 内保持低电平(复位有效),此时 count 被清零为 0。第 100ns 时 rst_n 拉高,复位释放,计数器开始正常工作。
- count(计数输出):在 rst_n 为低电平期间保持 4'b0000;rst_n 拉高后,每个 clk 上升沿 count 加 1,依次变为 1、2、3……直到仿真结束。由于仿真运行 1us,而 clk 周期为 20ns,共产生 50 个时钟上升沿,count 会从 0 递增到 15 后循环回 0,再继续递增。
通过观察这段波形,可以直观验证计数器的两个核心功能:一是复位信号有效时输出被清零,二是复位释放后每个时钟上升沿计数递增。这正是 4.1 节中 counter.v 设计代码所描述的行为,波形与代码逻辑完全吻合。
4.6 实战例程:带使能的可逆计数器
为了进一步巩固 ModelSim 的使用流程,下面再给出一个带使能控制的可逆计数器例程。该例程在原有计数器基础上增加了方向控制信号 up_down 和使能信号 en,当 en 为高电平时,计数器根据 up_down 的值递增或递减。
counter_updown.v 的设计代码如下:
module counter_updown (
input wire clk,
input wire rst_n,
input wire en,
input wire up_down,
output reg [3:0] count
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
count <= 4'b0000;
else if (en) begin
if (up_down)
count <= count + 1'b1;
else
count <= count – 1'b1;
end
end
endmodule
counter_updown_tb.v 的测试代码如下:
`timescale 1ns / 1ps
module counter_updown_tb;
reg clk;
reg rst_n;
reg en;
reg up_down;
wire [3:0] count;
counter_updown uut (
.clk(clk),
.rst_n(rst_n),
.en(en),
.up_down(up_down),
.count(count)
);
initial begin
clk = 0;
rst_n = 0;
en = 0;
up_down = 1;
#100;
rst_n = 1;
#20;
en = 1;
#200;
up_down = 0;
#200;
$finish;
end
always #10 clk = ~clk;
endmodule
仿真步骤与 4.2 至 4.5 完全一致:创建工程、添加上述两个文件、编译、启动仿真、添加波形并运行。运行后可以观察到 count 信号先递增到 4,再递减回 0,从而验证可逆计数功能正确。
4.7 两种计数器例程对比
下表对比了基础计数器与可逆计数器两个例程在设计要点、测试激励和仿真观察点上的差异,帮助你理解不同场景下如何选择与扩展。
| 功能描述 | 每个时钟上升沿递增 1,复位后清零。 | 使能有效时,根据 up_down 信号递增或递减。 |
| 控制信号 | 仅 clk 和 rst_n。 | 额外增加 en 使能信号和 up_down 方向信号。 |
| 测试激励重点 | 验证复位清零和连续递增行为。 | 验证使能关闭时保持、递增与递减切换行为。 |
| 波形观察要点 | 观察 count 从 0 到 15 循环递增。 | 观察 en 为高时 count 递增,up_down 拉低后 count 递减。 |
| 适用场景 | 分频、定时、简单计数。 | 加减法运算、方向控制、可逆计数应用。 |
5. 深入理解 ModelSim 的仿真流程
上面的示例虽然简单,但背后涉及 ModelSim 的核心工作流程。理解这些底层机制,能帮助你在面对复杂设计时更加从容。
5.1 编译(Compile)阶段
编译阶段将 HDL 源代码转换为仿真器可识别的中间表示。ModelSim 的编译器会检查语法错误、类型错误和模块引用关系。编译产物存放在库(Library)中,默认库名为 work。
5.2 仿真(Simulate)阶段
仿真阶段由仿真内核执行编译后的设计。仿真器按照时间轴推进,在每个时间点计算信号值的变化,并触发相应的 always 块或 process 语句。仿真时间由 timescale 指令控制,例如 `timescale 1ns / 1ps 表示时间单位 1ns,精度 1ps。
5.3 波形查看与调试
Wave 窗口是 ModelSim 最常用的调试界面。你可以通过以下操作提升调试效率:
- 缩放波形:使用工具栏的放大/缩小按钮,或按住 Ctrl 键滚动鼠标滚轮。
- 添加光标:在波形上点击即可添加光标,用于测量信号变化的时间点。
- 信号分组:将相关信号拖入同一个 Group,便于观察总线信号。
- 保存波形配置:通过 File → Save Format 保存当前波形窗口配置,下次仿真可直接加载。
6. 使用 Tcl 脚本实现自动化仿真
对于需要反复执行的仿真任务,手动点击操作效率太低。ModelSim 提供了强大的 Tcl 脚本接口,可以将编译、仿真、波形输出等步骤固化为脚本,实现一键执行。
下面是一个完整的自动化仿真脚本示例(sim.do 文件):
# 清理旧工程:退出当前仿真会话
# 作用:结束上一次仿真进程,释放内存和文件句柄,避免残留进程干扰本次仿真。
# 注意:如果当前没有正在运行的仿真,该命令会提示错误,但不会影响后续执行。
quit -sim
# 检查 work 库目录是否存在
# 作用:判断当前目录下是否已有 work 工作库(ModelSim 编译产物的存放目录)。
# 语法:if {[file exists work]} 是 Tcl 的条件判断语句,[file exists work] 返回 1(存在)或 0(不存在)。
if {[file exists work]} {
# 删除 work 库中的所有编译产物,确保干净环境
# 作用:彻底清空 work 库中的旧编译结果,防止旧版本模块残留导致仿真结果异常。
# 注意:vdel -all 会删除 work 库内所有已编译的设计单元,执行后需要重新编译全部源文件。
vdel -all
}
# 创建库并编译:vlib 创建名为 work 的工作库
# 作用:新建一个名为 work 的库目录,用于存放后续编译生成的中间文件。
# 说明:如果 work 库已存在,vlib 会报错,因此通常配合上面的删除逻辑一起使用。
vlib work
# vlog 编译 Verilog 源文件 counter.v 和测试文件 counter_tb.v
# 作用:将 Verilog 设计文件(counter.v)和测试文件(counter_tb.v)编译进 work 库。
# 说明:编译顺序很重要——必须先编译设计模块(counter.v),再编译测试模块(counter_tb.v),
# 因为测试文件中的实例化需要引用设计模块。若文件较多,可逐个列出或用通配符。
vlog counter.v counter_tb.v
# 启动仿真:vsim 加载 work 库中的 counter_tb 测试模块,-voptargs=+acc 保留信号访问权限
# 作用:启动仿真器,加载 work 库中编译好的 counter_tb 测试模块(顶层模块)。
# 参数说明:
# -voptargs=+acc:关闭优化对信号访问的限制,允许在仿真过程中读取/写入所有内部信号,
# 便于后续 add wave 添加波形和调试。若省略该参数,部分内部信号可能无法访问。
# work.counter_tb:指定要仿真的顶层模块,格式为 "库名.模块名"。
vsim -voptargs=+acc work.counter_tb
# 添加波形:add wave 将 clk 信号以十六进制格式添加到波形窗口
# 作用:把顶层模块中的 clk 时钟信号添加到 Wave 波形窗口,便于观察其电平变化。
# 参数说明:
# -hex:以十六进制格式显示信号值(对单 bit 信号影响不大,但对多 bit 总线信号很有用)。
# /counter_tb/clk:信号路径,格式为 "/顶层模块/信号名",必须以 / 开头。
add wave -hex /counter_tb/clk
# 添加波形:将 rst_n 复位信号以十六进制格式添加到波形窗口
# 作用:把异步复位信号 rst_n 添加到波形窗口,用于观察复位时序是否正确。
# 说明:rst_n 是低电平有效的复位信号,波形中低电平段表示复位有效。
add wave -hex /counter_tb/rst_n
# 添加波形:将 count 计数输出信号以十六进制格式添加到波形窗口
# 作用:把 4 位计数输出信号 count 添加到波形窗口,这是验证计数器功能的核心信号。
# 说明:count 是 [3:0] 总线信号,使用 -hex 可直观显示 0~F 的十六进制计数值。
add wave -hex /counter_tb/count
# 运行仿真:run 1us 表示仿真运行 1 微秒的仿真时间
# 作用:让仿真器向前推进 1 微秒的仿真时间,期间所有信号按设计逻辑变化。
# 修改仿真时间的方法:直接修改本行的数值即可,例如:
# run 10us —— 延长到 10 微秒,可观察计数器多次循环(count 从 0 到 15 再回 0)。
# run 500ns —— 缩短到 500 纳秒,快速验证复位和初始计数行为。
# 提示:也可在脚本开头用 set sim_time 1us 定义变量,再写 run $sim_time 引用,便于统一管理。
run 1us
# 保存波形:wave write 将波形数据以 WLF 格式导出到指定文件
# 作用:把当前 Wave 窗口中的波形数据保存到磁盘,供后续查看或对比。
# 参数说明:
# -format wlf:指定输出格式为 WLF(Wave Log Format),这是 ModelSim 的原生波形格式,
# 文件体积小、加载速度快,可用 ModelSim 直接打开回放。
# -output counter_wave.wlf:指定输出文件名。修改文件名即可改变保存路径或名称,
# 例如 -output ./result/my_wave.wlf 可保存到子目录。
wave write -format wlf -output counter_wave.wlf
脚本中的仿真时间由 run 1us 这一行控制,其中 1us 表示仿真运行 1 微秒。你可以通过修改这个时间变量来适应不同的测试场景:例如,将 run 1us 改为 run 10us 可以延长仿真时间,观察计数器在更长时间内的循环行为;改为 run 500ns 则可以缩短仿真时间,快速验证复位和初始计数功能。此外,你也可以在脚本开头使用 set sim_time 1us 定义变量,然后通过 run $sim_time 引用它,这样只需修改一处变量即可调整整个脚本的仿真时长,便于在不同测试场景间快速切换。
在 ModelSim 命令行中执行 do sim.do 即可运行整个流程。脚本中的每条命令都有明确含义:vlib 创建库,vlog 编译源文件,vsim 启动仿真,add wave 添加波形,run 执行仿真,wave write 保存波形文件。
7. 常见问题与解决方案
在使用 ModelSim 的过程中,你可能会遇到一些常见问题。这里整理了高频问题及其解决方法,帮助你快速排障。下表汇总了各类问题的可能原因、解决方法和预防建议。
| 编译报错:无法打开文件 | 文件路径包含中文或空格,文件名含特殊字符。 | 将工程目录改为纯英文路径,并确保文件名不含特殊字符。 | 创建工程时统一使用英文目录和文件名,避免中文路径和特殊字符。 |
| 仿真无波形输出 | 测试文件中没有正确初始化信号、仿真时间不够长、信号未添加到 Wave 窗口。 | 检查测试文件的 initial 块,并适当延长 run 的时间。 | 编写测试文件时先初始化所有信号,仿真前确认信号已添加到 Wave 窗口。 |
| 时序仿真与功能仿真结果不一致 | 功能仿真不考虑门延迟和布线延迟,时序仿真会加入这些延迟信息;设计中存在竞争冒险或时序约束不完整。 | 检查代码中的组合逻辑路径,并完善时序约束。 | 在设计阶段就关注时序约束,避免组合逻辑中的竞争冒险。 |
| 仿真速度过慢 | 大型设计未做优化,波形记录过多,未使用编译优化选项。 | 使用增量编译、关闭不必要的波形记录、使用 -O3 优化选项、将仿真拆分为多个阶段并行执行。 | 对大型设计提前规划仿真策略,合理使用编译优化和并行仿真。 |
| 编译警告 | 代码中存在未使用的信号、隐式声明、位宽不匹配或时序敏感列表不完整等问题。 | 查看 Transcript 窗口中的警告信息,定位到对应代码行,修复未使用信号、补齐敏感列表、显式声明信号类型。 | 编译后养成查看警告的习惯,及时修复潜在问题,避免警告累积成隐患。 |
| 仿真结果与预期不符 | 测试激励错误(如 initial 块中信号初始化或时序设置不当)、时序竞争(多个 always 块同时驱动同一信号)、未初始化信号(reg 变量未赋初值导致 X 态传播)。 | 检查测试文件的 initial 块,确认激励时序正确;在源码窗口设置断点,逐步检查中间状态;查看 Wave 波形,定位信号异常变化的时刻。 | 编写测试文件时先初始化所有信号,避免多个 always 块驱动同一信号,仿真前确认信号已添加到 Wave 窗口。 |
7.1 编译报错速查
编译阶段是 ModelSim 使用中最容易出错的环节。下面整理了 3 个最常见的编译错误,每个错误都给出错误信息示例、原因分析和修复代码片段,帮助你快速定位并解决问题。
错误一:vlog 无法打开文件
错误信息示例:
# ** Error: (vlog-19) Failed to open design unit file "counter.v" in read mode.
# No such file or directory. (errno = ENOENT)
原因分析:该错误通常由以下原因引起:文件路径包含中文或空格、文件名拼写错误、文件不在当前工作目录下,或者编译时使用了错误的相对路径。
修复代码片段:确保文件路径正确且为纯英文,并在编译前切换到文件所在目录:
# 切换到源文件所在目录
cd C:/fpga_projects/counter_demo
# 确认文件存在
ls counter.v
# 重新编译
vlog counter.v
错误二:端口连接不匹配
错误信息示例:
# ** Error: (vlog-2110) Illegal reference to net "count".
# ** Error: (vlog-13069) Port 'count' (output) of 'counter' has illegal connection.
原因分析:该错误通常发生在测试文件中实例化模块时,端口连接的数量、顺序或类型与设计模块的端口定义不一致。例如,将 output 端口连接到 reg 类型变量,或者端口顺序写错。
修复代码片段:使用显式端口连接(按名称连接),并确保端口类型匹配:
// 错误:端口顺序和类型不匹配
// counter uut (clk, rst_n, count); // count 是 wire,但这里可能误用
// 正确:使用显式端口连接,count 声明为 wire
module counter_tb;
reg clk;
reg rst_n;
wire [3:0] count; // 输出端口必须用 wire 接收
counter uut (
.clk(clk),
.rst_n(rst_n),
.count(count)
);
endmodule
错误三:未声明信号
错误信息示例:
# ** Error: (vlog-2163) Signal 'data_out' is not declared.
# ** Error: (vlog-2163) Signal 'clk_tb' is not declared.
原因分析:该错误通常是因为在代码中使用了未声明的信号,可能是拼写错误、遗漏了 reg/wire 声明,或者信号名与模块端口名不一致。
修复代码片段:在模块或测试文件中显式声明所有信号:
module counter_tb;
reg clk; // 声明时钟信号
reg rst_n; // 声明复位信号
wire [3:0] count; // 声明计数输出信号
// 其他信号在使用前必须声明
// reg data_out; // 如果用到 data_out,必须先声明
counter uut (
.clk(clk),
.rst_n(rst_n),
.count(count)
);
endmodule
8. 进阶技巧:让仿真效率翻倍
当你掌握了基础操作后,以下进阶技巧能进一步提升你的仿真效率。
8.1 使用 Do 文件管理复杂流程
将常用的编译、仿真、波形操作写入 Do 文件,配合参数传递,可以实现不同测试场景的快速切换。例如,通过变量控制仿真时间:
set sim_time 2us
run $sim_time
8.2 利用断点调试
在 ModelSim 中,你可以在源码窗口设置断点,仿真运行到断点处会暂停,方便你检查中间状态。这对于定位复杂逻辑错误非常有帮助。
8.3 批量回归测试
对于需要验证多个测试用例的场景,可以编写脚本循环执行不同测试向量,并自动比对输出结果,实现回归测试的自动化。
9. 总结与学习建议
ModelSim 是数字电路验证的基石工具,掌握它不仅能提升你的开发效率,更能帮助你建立严谨的验证思维。本教程从环境搭建到脚本自动化,覆盖了 ModelSim 的核心使用场景。建议你按照教程中的示例亲手操作一遍,再尝试修改代码、增加测试用例,逐步加深理解。
后续你可以进一步学习 SystemVerilog 断言、功能覆盖率建模、以及 ModelSim 与 Quartus 的联合仿真流程,这些都是在实际项目中非常实用的进阶技能。希望这份教程能成为你 FPGA 开发之路上的有力助手。
9.1 SystemVerilog 断言(SVA)入门
SystemVerilog 断言(SVA)是验证数字设计行为的重要工具,它允许你在仿真过程中自动检查信号之间的时序关系。在 ModelSim 中启用 SystemVerilog 语法非常简单,只需在编译时加上 -sv 选项即可。例如,在命令行中执行:
vlog -sv counter.v counter_tb.sv
下面以第 4 节中的 counter 模块为例,编写一个简单的断言,检查复位释放后 count 在每个时钟上升沿递增 1。首先,将测试文件保存为 counter_tb.sv,并在其中添加断言代码:
`timescale 1ns / 1ps
module counter_tb;
reg clk;
reg rst_n;
wire [3:0] count;
counter uut (
.clk(clk),
.rst_n(rst_n),
.count(count)
);
// 断言:复位释放后,每个时钟上升沿 count 递增 1
property count_increment;
@(posedge clk) disable iff (!rst_n)
count == $past(count) + 1;
endproperty
assert property (count_increment)
else $error("断言失败:count 未按预期递增!");
initial begin
clk = 0;
rst_n = 0;
#100;
rst_n = 1;
#500;
$finish;
end
always #10 clk = ~clk;
endmodule
上述断言使用 assert property 语句,在时钟上升沿检查 count 是否等于上一个时钟周期的 count 加 1。其中 disable iff (!rst_n) 表示复位有效时禁用该断言,避免在复位期间误报。当断言失败时,$error 会在 Transcript 窗口中输出错误信息。
在 ModelSim 中查看断言报告的方法如下:
- 编译并仿真:使用 vlog -sv counter.v counter_tb.sv 编译,然后 vsim work.counter_tb 启动仿真。
- 运行仿真:在命令行输入 run 1us 执行仿真。
- 查看断言结果:仿真结束后,在 Transcript 窗口中可以看到断言通过或失败的报告。若断言通过,通常不会输出额外信息;若断言失败,会显示 Error: 断言失败:count 未按预期递增! 以及对应的仿真时间。
- 使用断言窗口:在 ModelSim 菜单栏选择 View → Assertions,可以打开断言窗口,查看所有断言的通过/失败状态、触发次数等详细信息。
通过上述方法,你可以在 ModelSim 中轻松启用 SystemVerilog 断言,并利用断言报告快速定位设计中的功能缺陷,提升验证效率。
参考资料
以下整理了与 ModelSim 仿真、Verilog 设计以及 SystemVerilog 断言相关的官方文档、书籍和高质量教程,供你在学习过程中按需查阅。
- ModelSim User's Manual(官方用户手册):Siemens EDA 官方发布的完整参考手册,涵盖编译、仿真、波形调试、Tcl 脚本等全部功能,适合作为日常查证的工具书。访问官方手册
- Intel Quartus Prime 与 ModelSim 联合仿真指南:Intel 官方文档,介绍如何在 Quartus Prime 中配置并调用 ModelSim 进行 RTL 仿真,适合需要与 Quartus 联动的 FPGA 开发者。访问官方指南
- IEEE 1800-2017 SystemVerilog 标准:SystemVerilog 语言的权威规范,其中包含断言(SVA)的完整语法与语义定义,适合需要深入理解断言机制的验证工程师。访问 IEEE 标准
- Verilog HDL: A Guide to Digital Design and Synthesis(书籍):Samir Palnitkar 所著的 Verilog 入门经典,系统讲解语法、建模与仿真方法,适合刚接触 Verilog 的初学者。查看书籍信息
- SystemVerilog Assertions and Functional Coverage(书籍):Ashok Mehta 撰写的 SVA 与功能覆盖率专著,结合大量实例讲解断言编写与覆盖率建模,适合希望系统提升验证能力的工程师。查看书籍信息
- ModelSim Tcl 脚本自动化教程:社区整理的 Tcl 脚本入门教程,通过可复现的示例讲解 do 文件编写、变量控制与批量回归,适合希望用脚本提升仿真效率的开发者。访问教程
- Verilog 与 SystemVerilog 在线参考手册:提供 Verilog 与 SystemVerilog 语法速查、常用系统任务与断言示例的在线资源,适合编写代码时快速查阅。访问在线手册
网硕互联帮助中心




评论前必须登录!
注册