1、实验五 Modelsim仿真 教案实验五 ModelSim仿真【实验内容】1仔细阅读ModelSim软件简要使用说明(下文)。(“实例代码”压缩包用于ModelSim软件学习用)2Testbench写法简要介绍。(可以参考“Testbench模版”)3用ModelSim完成10位全加器的功能仿真。ModelSim软件简要使用说明ModelSim是对VHDL,Verilog,SystemC以及混合语言编写的设计文件进行仿真和调试的工具软件。1仿真流程在ModelSim中对一个设计进行仿真的基本步骤如下图所示:2仿真具体步骤Create a new project选择“File New Proje
2、ct”,会弹出对话框,如图所示:其中:“Project Name”项:填写要创建的工程的名字。“Project Location”项:确定创建的工程所要存放的位置。请在E盘下建文件夹!“Default Library Name”项:填写工程的工作库的名字。注:在用ModelSim进行仿真之前,必须要对设计文件进行编译,生成与设计文件逻辑功能相对应的设计单元。由于ModelSim是用库文件来进行仿真的,所以编译后的设计单元需要存放在库文件里。这个库文件叫作“工作库”。926以上三项填写完毕后,点击“OK”按钮,会在指定的位置处创建工程及工作库,如图所示:在工作库文件夹内,有一个名为“_info”
3、的特殊格式文件,如图所示:这个文件指定了此文件夹为ModelSim的工作库文件夹。在编译步骤内生成的所有设计单元都会被添加到工作库文件夹内。Adding objects to the project在上一步点击OK后,ModelSim会弹出一个对话框,如图所示:其中:“Create New File”项:在工程中创建新的设计文件。“Add Existing File”项:把已经存在的设计文件加入到工程中。“Create Simulation”项:在工程中创建仿真配置文件。“Create New Folder”项:在工程中创建新的文件夹。(1)创建文件夹。(此步骤也可以不要,不过推荐采用此步骤,
4、便于文件管理)选择“Create New Folder”项,在弹出的对话框中输入要创建的文件夹的名字,如图所示:点击“OK”按钮,会在“Workspace”列表里显示出新创建的文件夹。如图所示:(2)将设计文件加入到文件夹内。选择“Add Existing File”项,会弹出对话框,如图所示:其中:“File Name”项:指定设计文件所在位置。“Reference from location”项:表示只将设计文件与工程关联起来。“Copy to project directory”项:表示将设计文件复制一份到工程目录下。存放的具体位置由“Folder”项指定。指定设计文件的具体位置后,选择
5、“Copy to project directory”项,并通过“Folder”项,将存放位置改成“HDL”,如图所示:点击“OK”按钮,会在工程文件夹内多出两个设计文件,如图所示:这两个设计文件就是从指定的路径下将源文件复制过来的。点击“OK”按钮后,会在“Workspace”列表的“HDL”文件夹里新加入两个设计文件。如图所示:Compiling your design将设计文件加入到工程中以后,就可以编译设计文件了,编译器会将编译生成的设计单元添加进你所创建的工作库中。编译的步骤如下:(1)编译设计文件。在“Workspace”列表的“Project”栏内,点击右键,在弹出的列表中选择“
6、Compile Compile All”,如图所示:如果设计文件编译无误,每个设计文件后面的“Status”栏会有绿色的对勾,否则会有红色的错叉出现。当有错叉出现时,需要根据ModelSim的“Transcript”栏内的提示信息修改设计文件,并重新编译,直到编译通过为止。编译通过后,由设计文件编译成的设计单元会被加入到工作库中,如图所示:(2)查看编译后的设计单元。点击“Workspace”列表里的“Library”栏,展开“WorkLIB”库,会看到编译后加入到库中的设计单元。如图所示:Loading the design into the simulator编译后生成的设计单元需要加入到
7、仿真器中才能进行仿真。由于测试文件(testbench)例化了要仿真的模块,所以只需要将测试文件生成的设计单元加载到仿真器中。双击“Workspace”列表内工作库下测试文件生成的设计单元,就可以将其加载到仿真器中。也可以选择“Simulate Start Simulation”,会弹出一个对话框,展开“WorkLIB”工作库,选中测试文件生成的设计单元,如图所示:点击“OK”按钮即可将测试文件生成的设计单元加载到仿真器中。设计单元成功加载到仿真器后,ModelSim会自动弹出仿真器,并将“Workspace”列表切换成“sim”栏,如图所示:Running the simulation运行仿
8、真器进行仿真的步骤如下:(1)将信号加入到波形窗口中。在“Workspace”列表内,选择“sim”栏。右键点击测试文件生成的设计单元,在弹出的列表里选择“Add Add to Wave”,如图所示:加入信号后的波形窗口如图所示:也可以在“Objects”列表里选择感兴趣的信号加入到波形窗口里。方法是选中信号,右键单击此信号,在弹出的列表里选择“Add to Wave”,会弹出三个选项,如图所示:其中:“Selected Signals”项:表示加入到波形窗口中的信号是被选中的信号,即图中“Objects”列表里的“count”信号。“Signals in Region”项:表示加入到波形窗口
9、中的信号是“Objects”列表里的所有信号,即图中“Objects”列表里的“clk”、“reset”和“count”信号。“Signals in Design”项:表示加入到波形窗口中的信号是测试文件生成的设计单元里的所有信号,即图中“Workspace”列表里的“test_counter”下面展开的所有设计单元的信号。其中“Signals in Design”的效果与上一种方法效果是一样的。(2)运行仿真器,开始仿真。点击“run”按钮,就可以进行仿真了,如图所示:需要注意的是,“run”按钮每次只能仿真100ns,如果要一直仿真下去的话,点击“run all”按钮可以实现。如图所示:如
10、果要停止仿真,可以按“break”按钮,如图所示:如果要重新仿真,可以按“restart”按钮,如图所示:Debugging your results对仿真波形进行分析,确定逻辑是否正确。如果没有得到你要的仿真结果,则需要修改设计文件,并重新编译,加载到仿真器中进行仿真。注:ModelSim的编译器在对设计文件进行编译时,并不会对设计文件进行综合,即将设计文件与硬件对应,这点从上面的仿真步骤也可以看出,仿真步骤中并没有选择器件型号的步骤。因此编译时生成的设计单元并没有包含硬件信息,即不会存在器件延时,所以只用ModelSim作的仿真是一种功能仿真,有时也称为“前仿真”。如果想用ModelSim
11、作仿真时加入器件的延时信息,模拟硬件来仿真,则需要Quartus的配合才能完成。加入器件延时信息的仿真称为“后仿真”,仿真结果接近真实器件的运行结果。关于ModelSim作“后仿真”,有兴趣的读者可查阅相关资料自学,我们这里只介绍“前仿真”。Testbench写法简要介绍描述测试信号的变化和测试过程的模块叫做测试平台(Testbench),它可以对电路模块进行动态的测试。通过观测被测试模块的输出信号是否符合要求,可以调试和验证逻辑系统的设计和结构是否正确,便于发现问题并修改。Testbench用于测试模块的示意图如图所示: 由示意图可知,Testbench要对被测模块进行测试,需要产生被测模块
12、所需的激励信号(比如时钟信号,复位信号等),这个就像我们用Quartus波形仿真时拖波形一样,只是Testbench里需要我们用代码来实现波形的变化。产生的激励信号需要与被测模块对口(比如产生的时钟信号要送入时钟输入口,产生的复位信号要送入复位输入口等),如何实现对口,这就需要对被测试模块的例化来实现。例化的写法如下:被测模块名 例化进Testbench后的模块名(被测模块输入口 Testbench产生的激励信号,被测模块输出口 Testbench里用来显示输出的信号);上面的示意图对应的例化写法为:被测模块名 例化进Testbench后的模块名( .Input_1 (In_1), .Inpu
13、t_2 (In_2), .Input_3 (In_3), .Output_1 (Out_1), .Output_2 (Out_2), .Output_3 (Out_3);更具体的写法请参考Testbench模版。10位全加器的功能仿真实验要求【输入端口】 【输出端口】clk, / 模块时钟 dout9:0, / 和数rst, / 模块复位 cout / 高位进位din_19:0, / 加数1din_29:0, / 加数2cin / 低位进位以抓图的方式给出仿真波形图,并对结果作适当分析。补充说明timescale 10ns/1ns时钟clk的产生写法:Initial Clk = 0;alway
14、s #50 clk = clk; / 表示从仿真开始算起,每隔50个时间单位,将clk翻转一次复位rst的产生写法:Initial / 下面的写法使rst=1持续的时间为120个时间单位 begin #0 rst = 1b0; / 仿真开始时,rst置0 #5 rst = 1b1; / 仿真开始后5个时间单位时,rst置1 #125 rst = 1b0; / 仿真开始后125个时间单位时,rst置0 end加数的产生写法:always ( negedge clk ) / 时钟下降沿将加数改变 begin din_1 = $random%1024; / 随机数除以1024后取余数给加数,加数在0,1023/ 之间。din_2 = $random%1024; / $random调用了一个能产生随机数的系统任务。 cin = $random%2; end仿真时间的写法:initial #5000 $stop; / $stop调用了一个使仿真器停止仿真的系统任务。仿真时间为 / 2000个时间单位。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1