ModelSim 仿真流程简要

1.    ModelSim简介

ModelSim分几种不同的版本:SE、PE和OEM,其中集成在 Actel(爱特公司)、Altera (阿尔特拉)、Xilinx(赛灵思)以及Lattice(莱迪思)等FPGA厂商设计工具中的均是其OEM版本,SE版本为最高级版本。ModelSim仿真分为功能仿真,门级仿真,时序仿真

◆  功能仿真(前仿真,代码仿真)

主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟,主要是验证电路与理想情况是否一致。可综合FPGA代码是用RTL级代码语言描述的,其输入为RTL级代码与Testbench.在设计的最初阶段发现问题,可节省大量的精力。

◆  门级仿真和时序列仿真  (后仿真)

使用综合软件综合后生成的门级网表进行仿真,不加入时延文件的仿真就是门级仿真.可以检验综合后的功能是否满足功能要求,其速度比功能仿真要慢,比时序仿真要快。

◆  在门级仿真的基础上加入时延文件(.sdf)的仿真就是时序仿真, 比较真实地反映了逻辑的时延与功能.综合考虑电路的路径延迟与门延迟的影响,验证电路能否在一定时序条件下满足设计构想的过程,是否存在时序违规。

2.    ModelSim仿真的基本步骤

首次运行modelsim时,先建立一个工作库,一般将这个工作库命名为work。后面建立的仿真工程(project)一般都是在这个work下面工作的。在用户界面模式下,点 File->New->Library,选择 a new library and a logical mapping to it,如下图所示(ModelSim SE 10),

1)建立工程,启动ModelSim,选择菜单“File New Poject”,会打开“Creat Project”对话框,在“Creat Projec”t对话框中填写“Project Name”为“Test”,然后在“Project Location”栏中选择Project文件的存储目录,保留“Default Library Name”的设置为work,在弹出的对话框中选择Add Existing File,添加已经写好的源文件及测试文件(如果没有,可选择Create New File 进行创建)。

2) 在工作区中的Project标签页中可以看到新加入的文件,单击右键,选取“Compile Compile All”命令对加入的文件进行编译

3) 文件编译完后,用鼠标点击“Library”标签栏。在标签栏中用鼠标点击work库前面的“+”,展开work库,就会看到编译好的设计单元,点击测试文件选择仿真。

4) 调出窗口(View -> Structure,View ->  object,View -> Wave),在object 窗口添加观察变量,运行仿真,在Wave中查看波形。

5) 在Run_Length中选择单步运行时间;鼠标在黄线不同端,按住Ctrl,移动滑轮可调整观察波形时间

3.    ModelSim断点仿真

1) 选择View > Files打开文件窗口,单击sim前的+,双击block.v打开源文件

2) 滑动到21行,在行标的右侧单击。一个红色的球出现在行标的右边表示已经设置了一个断点(此断点可进行使能或移除)。

3) 点击Run-All 运行,可见程序执行到断点处

4.    命令行执行

force指令

指令格式:force item_name value time,value time(item_name为端口信号或内部信号,支持通配符号,但只能匹配一个;value不能默认,time,可选项,支持时间单元)

force din 10#40000000    //从当前时刻起给din赋值10进制40000000;
force bus 10#F @100ns    //在100ns时刻给bus赋值10进制F;
force clr 0              //在当前仿真时间强制clr到0
force clr 1 100          //经历100个默认时间单元延迟后为clr赋值1;
force clr 1,0 100        //表示clr赋值1后,经历100个默认时间单元延迟后为clr赋值为0;

  force-repeat指令
    指令格式:force
开始时间 开始电平值,结束电平值 忽略时间(即0电平保持时间)
-repeat 周期

force clk 0 0,1 20 -repeat 100  //表示强制clk从0时间单元开始,起始电平为0,结束电平为1,0电平保持时间为20个默认时间单元,周期为100个默认时间单元,占空比为80%

  force-cancel指令
    指令格式:force-cancel
period(执行period周期时间后取消force命令)

force clk 0 0,1 30 -repeat 60-cancel 1000  //强制clk从0时间单元开始,到1000时间单元结束;

  run指令
    指令格式:run
timesteps time_unit(timesteps时间步长,time_unit时间单元,可以是ps、ns等)

run 10          //表示运行10个默认时间单元;
run 200ns       //表示运行200ns;
run -all        //表示运行全过程;
run -continue   //表示继续运行

本例代码

 1 `timescale 1ns / 1ps
 2 module block(
 3     input clk_i,
 4     input rst_n_i,
 5     output reg [4:0]result_o
 6 );
 7     reg [3:0]A;
 8     reg [3:0]B;
 9     reg [4:0]C;
10
11     always @(posedge clk_i)
12         if(!rst_n_i)
13             begin
14             #2   A = 4‘d4;
15             #0.2 B = 4‘d12;
16             #0.2 C = 5‘d0;
17             #0.2 result_o = 5‘d0;
18             end
19         else
20             begin
21             #2   C = A + B;
22             #0.2 result_o = (C >> 1);
23             end
24 endmodule

block.v

 1 `timescale 1ns / 1ps  //仿真时间单位/时间精度
 2 module unblock
 3 (
 4     input clk_i,
 5     input rst_n_i,
 6     output reg [4:0]result_o
 7 );
 8     reg [3:0]A;
 9     reg [3:0]B;
10     reg [4:0]C;
11     always @(posedge clk_i )
12         if(!rst_n_i)
13             begin
14             #2
15             A <= 4‘d4;
16             B <= 4‘d12;
17             C <= 5‘d0;
18             result_o = 5‘d0;
19             end
20     else
21         begin
22         #2
23         C <= A + B;
24         result_o <= (C >> 1);
25         end
26 endmodule

unblock.v

 1 `timescale 1ns / 1ps
 2 module tb_test();
 3     reg clk_i;
 4     reg rst_n_i;
 5     wire[4:0]result1_o,result2_o;
 6     unblock unblcok_inst
 7     (
 8         .clk_i(clk_i),
 9         .rst_n_i(rst_n_i),
10         .result_o(result1_o)
11     );
12
13     block blcok_inst
14     (
15         .clk_i(clk_i),
16         .rst_n_i(rst_n_i),
17         .result_o(result2_o)
18     );
19
20     initial
21         begin
22         clk_i =0;
23         rst_n_i =0;
24         #22
25         rst_n_i =1;
26         end
27
28     always #5 clk_i = ~clk_i;
29 endmodule

tb_test.v

时间: 2024-10-06 00:12:24

ModelSim 仿真流程简要的相关文章

关于xilinx ise10.1与modelsim仿真库编译

关于xilinx ise10.1与modelsim仿真库编译(2011-08-21 01:00:39)转载▼标签:杂谈 分类: FPGA 首先介绍一下Xilinx几个主要的仿真库(路径:D:\Xilinx\11.1\ISE\verilog\src\) 1. Unsim文件夹:Library of Unified component simulation models.仅用来做功能仿真,包括了Xilinx公司全部的标准元件.每个元件使用一个独立的文件,这样是为了方便一些特殊的编译向导指令,如`us

ModelSim仿真入门 精讲

ModelSim仿真入门之一:软件介绍 编写这个教程之前,为了让不同水平阶段的人都能阅读,我尽量做到了零基础入门这个目标,所有的操作步骤都经过缜密的思考,做到了详细再详细的程度. 如果您是FPGA开发方面的初学者,那么这个教程一定能够帮助你在仿真技术上越过新人的台阶:如果您是FPGA开发的老手,这篇文档也并非对您没有帮助,您可以把教程发给其他刚入门的同事,免去您亲自上阵指导的麻烦,把主要的精力放在更有价值的地方. 一.FPGA设计仿真验证简介 严格来讲,FPGA设计验证包括功能仿真.时序仿真和电

88.modelsim仿真do文件相关技巧

网上的关于DO文件的编写好像资料不多,比较杂,所以本人总结一下常用的简单语法,方便大家查看.其实本人也刚接触DO文件没多久,有纰漏很正常,欢迎指正批评,互相学习.PS:写得有点乱   还有一个值得注意的是 我在看到这篇文章的时候我正在仿真一个verilog文件,文件中调用了一个ROM , 但是我怎么仿真 rom的输出文件都有问题, 经过一个QQ好友的指点,我发现竟然是我 QUARTUS 下考过来的库文件 有问题, 自此提醒遇到过此问题 但还没有解决的同学.. 一.DO文件的简介和工作方式 DO文

基于modelsim-SE的简单仿真流程—上

基于modelsim-SE的简单仿真流程 编写RTL功能代码 要进行功能仿真,首先得用需要仿真的模块,也就是RTL功能代码,简称待测试的模块,该模块也就是在设计下载到FPGA的电路.一个电路模块想要有输出,就得有输出,数字电路也是一样的,时钟和复位信号是必不可少的测试激励信号之一,同时可能还包括控制信号.数据信号.这里总结一下,一般系统中包括的测试激励信号主要为四大类: 系统信号(时钟.时钟使能信号.复位信号等): 控制信号(使能信号.片选信号.握手信号,状态机控制信号等): 数据信号(并行接口

基于modelsim-SE的简单仿真流程—下

基于modelsim-SE的简单仿真流程—下 编译 在 WorkSpace 窗口的 counter_tst.v上点击右键,如果选择Compile selected 则编译选中的文件,Compile All是编译所有文件,这里选择 Compile->Compile All,如下图所示: 在脚本窗口中将出现绿色字体: # Compile of counter.v was successful. # Compile of counter_tst.v was successful.,说明文件编译成功,在

调用altera IP核的仿真流程—上

调用altera IP核的仿真流程—上 在学习本节内容之后,请详细阅读<基于modelsim-SE的简单仿真流程>,因为本节是基于<基于modelsim-SE的简单仿真流程>的基础上进行设计的,关于设计仿真流程的过程所涉及到的重复内容将不再详述,将会一笔带过,如果深入学习了<基于modelsim-SE的简单仿真流程>这一小节,则下面的内容将会非常的简单. 编写RTL功能代码 本小节通过调用altera的ROM宏功能模块,FPGA的ROM模块主要用于存储数据,可以在上电的

基于modelsim-SE的专业进阶仿真流程

基于modelsim-SE的专业进阶仿真流程 通过<基于modelsim-SE的简单仿真流程>和<调用altera IP核的仿真流程>是否感受到仿真流程中的繁琐步骤,特别是在modelsim创建工程之后的步骤:编译.添加仿真信号.开始仿真.这三个步骤涉及到一大堆的鼠标操作,涉及到一大堆的窗口操作,由于RTL仿真过程是一个反复迭代的过程,同时要求覆盖到100%的功能测试,由此也要覆盖到所有状态机和条件判断的所有情况,由此,RTL的功能仿真功能需要不断的修改RTL代码,每次修改RTL代

modelsim仿真脚本化环境

刚开始学习modelsim仿真的时候,基本上都是按照图形界面的流程,建立工程-->添加设计代码-->编译-->打开仿真波形界面.但是,每次重复这些操作会感到很繁琐,而且,对于大的工程,动辄几十上百个设计文件,一个一个添加,费时费力又容易遗漏,所以想提高效率,脚本化环境是最佳的选择. 以下是自己在参考了网上一些资料和教程之后,整理的modelsim仿真脚本,供大家参考,也希望能有高人多多指教. 脚本的功能: 自动搜索源代码并生产filelist文件 自动编译并根据需要是否打开图形界面,并自

Quartus和Modelsim仿真ROM模块

新建一个工程 选择工程保存路径,为工程取一个名字 Page 2 of 5 直接点击next ? ? Page 4 of 5 直接点击next ? 下面为工程添加文件 ? 需要注意模块名和模块所在文件的文件名要一致,下面的代码保存在Wave.v这个文件中 module Wave( input i_clk, input i_rst_n, output reg[7:0] led ); ? parameter Delay500MS = 10; ? reg clk_led; reg[24:0] cnt;