modelsim仿真流程 (2)

  • 格式:doc
  • 大小:4.86 MB
  • 文档页数:13

ModelSim6.4仿真的操作流程

1. ModelSim简介

ModelSim是Mentor公司的产品。在业界,它被认为是最优秀的HDL语言仿真软件。它提供友好的仿真环境,是支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核。其个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。

其主要特点可概括如下:

RTL和门级优化,本地编译结构,编译仿真速度快,跨平台跨版本仿真;

VHDL和Verilog混合仿真;

源代码模版、项目管理;

集成了性能分析、波形比较、代码覆盖、数据流ChaseX、Signal Spy、虚拟对象(Virtual

Object)、Memory窗口、Assertion窗口、源码窗口显示信号值、信号条件断点等众多调试功能;

C和Tcl/Tk接口,C调试;

对SystemC的直接支持和HDL任意混合;

支持SystemVerilog的设计功能;

对系统级描述语言的最全面支持,SystemVerilog,SystemC,PSL;

ASIC Sign off。

ModelSim分几种不同的版本:它们分别是SE、PE、LE和OEM,其中SE(System Edition)是最高级的版本,PE是版本,LE是版本,而集成在 Actel、Atmel、Altera、Xilinx以及Lattice等FPGA厂商设计工具中的均是其OEM(Original Equipment Manufacture,原始设备生产商)版本。SE版和OEM版在功能和性能方面有较大差别,比如对于大家都关心的仿真速度问题,以Xilinx公司提供的OEM版本ModelSim XE为例,对于代码少于40000行的设计,ModelSim SE 比ModelSim XE要快10倍;对于代码超过40000行的设计,ModelSim SE要比ModelSim XE快近40倍。ModelSim SE支持PC、UNIX和LINUX混合平台;提供全面完善以及高性能的验证功能;全面支持业界广泛的标准;Mentor Graphics公司提供业界最好的技术支持与服务。

2仿真步骤 2.1 Modelsim的启动

启动modelsim一般有三个途径:其一是在windows的桌面双击Modelsim的图标;另一个是从windows的开始菜单找到Modelsim的图标,再双击之;其三是通过ISE去激活。前两种方法如图1所示

图1 通过图标启动Modelsim

本文不对前两种方法做进一步的介绍。只介绍后一种方法,即通过ISE去启动Modelsim。该方法一般说来要求设计者已经在ISE上完成了某个工程的建立以及对应的设计文件(HDL语言或电路图)的输入工作,如图2所示(本文所用的设计文件是《ISE的设计流程》中介绍的m10_counter)。但要启动Modelsim,还得在创建了testbench(即仿真文件)之后才可进行。

图2 ISE上的工程和对应的设计文件 2.2 在ISE上要做的预备工作

另外,为了将Modelsim与ISE关连起来,需先在工程属性(ProjectProperties)对话框中,将其上的仿真器(Simulator)一栏的下拉菜单打开,选择菜单中的Modelsim-SE Mixed,如图-3所示。(工程属性对话框可以通过双击ISE上Sources窗中的xc3s200a-5ft256图标打开)

图-3在工程属性对话框中选择仿真器

接下来,在仿真所用语言(Preferred Language)一栏的下拉菜单中选中VHDL,如图-4所示,之后点击OK,结束全部设置。(上述选择仿真器和仿真所用语言的过程,实际上可以在建立ISE的工程时就先期进行。请参阅《ISE的设计流程》中的相关部分)。

图-4 选择仿真所用的语言 2.3创建testbench

在ISE的Project下拉菜单中选中New Source并双击之,如图5所示。

图5 建新的源文件

在随后弹出的选择框中,按图6所示进行操作。需要注意的是仿真文件的名字不能与设计文件相同。为了加以区别,可以象本例一样,在名字的开头加一个t,表明是进行测试(test)的文件。(verilog的用户选Verilog Test Fixture)

图6 选择文件类型和键入文件名

在随后弹出的选择框中,如图7所示进行操作。

图7 选定仿真对象 如图8所示,在接下来弹出的提示框中点击Finish。

图8 结束仿真文件的设置

随后ISE会自动按前面的设置生在工作区成一个testbench模板,如图9所示。

图9 ISE自动生成的testbench模板(局部) 图10给出了testbench上用户描述输入信号的区域。

图10 描述输入信号的进程

接下来,在TestBench的模板中,按图11所示,在进程里描述好输入信号clk、rst和carry_in(verilog用户可参看后面附录中的灰色部分)。至此,一个完整的TestBench文档建立过程和输入信号的描述过程就完成了。

图11 描述输入信号 现在在ISE的源窗中,如图16所示,将源窗中“Sources for:”处的下拉菜单打开,把“Implementation”切换为“Behavioral Simulation”。之后testbench会自动出现在Sources窗中。

图12 将ISE切换成仿真模式

之后先在Source窗选中tm10_counter-behavior,随后可在Process窗找到Modelsim

Simulator,现在点击其左端的,展开它,如图13所示。

图13 展开Modelsim Simulator 2.4在ISE上启动ModelSim

展开后的Modelsim Simulator如图14所示,可以看到Modelsim的图标,双击该图标,Modelsim就被启动了。

图14 双击图标启动modelsim

图15是modelsim启动时的情形。图中modelsim的标志很快就会自动消失。

图15 modelsim的启动过程

图16是启动后的modelsim的界面。

图16 modelsim的界面 2.5 ModelSim各个窗口的介绍

图17介绍了ModelSim几个主要窗口的功能。

图17 ModelSim几个主要窗口的功能

2.6添加需要观察的信号

ModelSim初始的工作位置是指向tm10_counter的。这时,如图18所示,在波形窗内列出了clk、rst、carry_in、carry_out和count等5个信号。

图18 ModelSim自选的几个信号 实际上可以根据需要,如图19那样,添加一些未被初始界面列出的信号。

图19添加新信号

2.6运行仿真

在浮动出来的波形窗中,如图20所示,进行复位操作。

图20 对信号进行清零

复位后的界面,如图21所示,各个信号都将原有的波形清除了。现在按图中的提示就可以运行和停止仿真了。

图21 运行仿真

2.7波形窗的调整

在Modelsim的波形窗中,有一些为便于观察波形而设置的调整和测量工具,如图22所示,利用它们,可以将波形调整到最便于观察的状况。

图22波形窗内的工具简介

2.8观察波形

调整好的波形显示如图23所示。将所看到的输入、输出结果与设计预期进行比对(本实验的预期结果应该是这样的:当rst为低电平时,无论其他输入信号为何,都对寄存器复位,current_state=“0000”;当rst为高电平,carry_in为低电平时,计数器在每一个时钟的下降沿到来时加1,直到计到9,再来一个时钟时,计数器回到0,如此不断地循环下去。并且在计数器计到9时,carry_out会产生一个能保持一个时钟周期的负脉冲,上述现象可以通过图23(a)观察到;当rst为高电平,carry_in也为高电平时,计数器将把最后一次计到的数保持住,直到计数条件恢复后,计数才重新开始,见图23(b))。该过程可能会反复进行,直到将设计修改到满意为止。

图23 调整好的仿真信号

自此,一个完整的仿真过程就结束了。

附录(verilog test fixture)

`timescale 1ns / 1ps

module tm10_counter_v;

// Inputs

reg carry_in;

reg clk;

reg rst;

// Outputs

wire [3:0] bcd_code;

wire carry_out;

// Instantiate the Unit Under Test (UUT)

m10_counter uut (

.bcd_code(bcd_code),

.carry_out(carry_out),

.carry_in(carry_in),

.clk(clk),

.rst(rst)

);

initial begin

// Initialize Inputs

clk = 0;

rst = 0;

carry_in = 0;

// Wait 100 ns for global reset to finish

//#100;此处的#号代表时间单位,其大小视文件首行timescale后面的值而定,用户可以根据实际需要改变它的大小,例如,改为1us。

End

always

begin

clk=~clk; #50;

end

always

begin

rst=0; #113;

rst=1; #1111113 ;

end

always

begin

carry_in=0;#111117;

carry_in=1;#1111;

end

endmodule