注意仿真脚本中的数据类型,我们利用TestBench模块和Verilog模块进行数据通信,TestBench模块中的输出信号就是Verilog代码中的输入信号,TestBench模块中的输入信号就是Verilog代码中的输出信号。所以,Verilog代码中的 reg LED1,在TestBench模块中变为wire LED1;Verilog代码中的wire CLK_50M,在TestBench模块中变为 reg CLK_50M。

1、前仿真与后仿真

前仿真,就是纯粹的功能仿真,主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟。
后仿真,就是时序仿真,是指电路已经映射到特定的工艺环境下,综合考虑电路的路径延迟与门延迟的影响,验证电路在一定时序条件下是否满足设计构想的过程。
2、ModelSim的自动仿真
所谓自动仿真,就是在Quartus II 中调用ModelSim软件来进行仿真。在调用过程中,Quartus II 会帮我们完成ModelSim中的所有操作,我们只需要分析最后的仿真结果。
下面我们以《Hello FPGA! Quartus II 软件的使用——新建工程与下载程序》中新建的工程为例,进行仿真。

1)检查EDA路径:【Tools】——【Options...】



2)选择EDA工具:【Assignments】——【Settings...】,进去之后点击“EDA Tool Settings”



3)生成仿真脚本模板:【Processing】——【Start】——【Start Test Bench Template Writer】


4)打开仿真脚本模板:【File】——【Open...】,进入...\Verilog_First\simulation\modelsim目录下


第26行,表示仿真的单位时间为1ps,精度为1ps。第30行,reg eachvec是一个多余的信号,没有任何作用,可以删除。

注意仿真脚本中的数据类型,我们利用TestBench模块和Verilog模块进行数据通信,TestBench模块中的输出信号就是Verilog代码中的输入信号,TestBench模块中的输入信号就是Verilog代码中的输出信号。所以,Verilog代码中的 reg LED1,在TestBench模块中变为wire LED1;Verilog代码中的wire CLK_50M,在TestBench模块中变为 reg CLK_50M。
5)编写仿真脚本

第17行到第23行,是信号的初始化;第25行到28行,是时钟信号的生成。#10000,表示延迟10000ps,即10ns。
记住,这个TestBench的模块名是Verilog_First_vlg_tst,会在下一步中用到。
6)配置仿真功能:【Assignments】——【Settings...】,进去之后点击“Simulation”





7)开始功能仿真:【Tools】——【Run Simulation Tool】——【RTL Simulation】

在原本的程序中,我们是设置了1秒钟LED闪烁一次,时间太长了,要知道仿真单位是ps的,所以修改为200ns。点击编译,再进行功能仿真。



这里需要注意,我们修改Verilog程序代码和仿真文件代码(前提是不修改端口信号),我们是可以不需要重新编译工程的,我们只需要关闭ModelSim仿真文件,再一次点击开始仿真即可。如果我们修改了端口的输入和输出,那么这里最好重新全编译一次,并且需要重新生成仿真文件进行修改。
如果选中RTL Simulation之后,出现以下错误:

再次进入以下页面,将【D:\altera\13.1\modelsim_ase\win32aloem】修改为【D:\altera\13.1\modelsim_ase\win32aloem\】,或者【D:/altera/13.1/modelsim_ase/win32aloem】。

8)时序仿真:【Tools】——【Run Simulation Tool】——【Gate Level Simulation...】
编译完工程之后,打开工程下的simulation\modelsim

可以看到很多文件,有我们功能仿真生成的文件,还有我们时序仿真要用到的.vo文件(网表文件)和.sdo文件(时延文件),有了这些文件,我们才能进行时序仿真。如果打开并没有找到.vo和.sdo文件,那么你需要重新创建工程,在选择EDA工具时,选择ModelSim-Altera,Verilog,创建完成后重新编译工程。

可以看到有三种模式,我们使用默认的即可,点击【Run】



LED1和CLK_50M这两个信号,它们并不是同时发生变化的,它们之间是有延迟的。