搭建Modelsim SE仿真环境-使用do文件仿真

本章咱们介绍仿真环境搭建是基于Modelsim SE的。Modelsim有不少版本,好比说Modelsim-Altera,可是笔者仍是建议你们使用Modelsim-SEModelsim-Altera实际是针对Altera OEM版本,它事先将Altera的一些IP核仿真库添加到了工具中,但功能上有一些缩减。而Modelsim-SE须要本身手动添加这些仿真库,可是功能更全,并且工做中,工程师更倾向用SE版本,由于从此的FPGA开发中咱们会接触更多其余厂商的FPGA,好比XilinxLattice的,遇到这些FPGA时,咱们一样须要将他们的IP核的仿真库添加到Modelsim 中。函数

1.1.1.仿真基本概念

FPGA的仿真实际就是一个验证设计的过程,验证在“模拟的输入”的状况下,设计文件的输出是否和咱们指望是一致的。这里的“模拟的输入”就是“测试激励”,设计文件就是待测设计,最终经过对输出结果的分析来验证设计的正确性。这就构成了仿真的三个基本组成部分:测试激励(Test_bench)、待测设计(DUT)和最终结果的输出验证。工具

       上面介绍可能仍是有些抽象,咱们经过一个简单的仿真例子来介绍仿真中的各个部分。你们打开咱们的例程《05_clk_div_even》。测试

       待测设计(DUT):首先看src文件夹下的clk_div_even.v就是咱们待测设计(DUT)。这个比较好理解,就是咱们设计的模块。这是一个偶数分频的例子,每次计数从0-4,计数5次,计数器clk_div_cnt会清零一次,同时输出分频信号o_clk_div翻转一次,这样每五个时钟周期,输出信号都会翻转一次,十个时钟周期后又恢复到初始状态,使得输出信号10分频。这里你们须要额外关注一下这个模块的输入和输出,输入未来是咱们激励信号进来的地方。优化

1.  module clk_div_evenspa

2.      (设计

3.          input                  i_clk        , //模块输入时钟 ,50mhz3d

4.          input                  i_rst_n      ,    //复位信号,低电平有效code

5.          outputreg             o_clk_div         //偶数分频输出orm

6.      );blog

7.      

8.      parameter        DIV_EVEN      =10  ;   //10分频,输入50MHz,输出频率为5Mhz

9.      reg    [3:0]clk_div_cnt           ;   //分频计数器

10.//-------------------------------------------------------------------

11.//  分频计数器,每次计数到N-1时归零

12.//-------------------------------------------------------------------

13.    always @ (posedge i_clk ornegedge i_rst_n)

14.    begin

15.        if(!i_rst_n)

16.            clk_div_cnt  <=4'd0;  

17.        else    if(clk_div_cnt  ==DIV_EVEN/2-1)

18.            clk_div_cnt  <=4'd0;  

19.        else  

20.            clk_div_cnt  <=clk_div_cnt   +   4'd1;                              

21.    end

22.//-------------------------------------------------------------------

23.//  分频计数器,每次计数N/2-1时,输出分频信号翻转

24.//-------------------------------------------------------------------    

25.    always @ (posedge i_clk ornegedge i_rst_n)

26.    begin

27.        if(!i_rst_n)

28.            o_clk_div  <=1'b0;  

29.        else    if(clk_div_cnt  ==DIV_EVEN/2-1)

30.            o_clk_div  <=~o_clk_div;

31.    end   

32.endmodule

测试激励(Testbench)TestbenchFPGA仿真的关键,Testbench能够理解为一个激励产生器。你们能够看到咱们的待测设计的输入是i_clki_rst_n,实际在开发板上,板子上的晶振输出50MHz激励时钟信号给FPGA,一样电路中的复位电路给FPGA提供了i_rst_n的激励信号。在仿真过程当中,Testbench就代替了实际的电路,经过Verilog模拟实现这些外部电路的激励信号,提供给DUT,从而经过输出验证设计。工程目录的sim文件夹下的tb_clk_div_even.v 就是咱们已经编写好的Testbench。以下就是一个基本Testbench的设计。

下面从上图所示5个部分介绍Testbench基本写法。

1`timescale 1ns/1ps 决定整个仿真中的时间单位信息,在文件中任何关于时间的信息都是基于此的,1ns表示仿真中的基本时间单位,1ps则表示仿真精度能够达到1ps。例如 #10.005表示的就是延时10.005ns。实际仿真中,精度是能够控制到0.005ns的,即5ps

2tb_clk_div_even() 是实际testbench的名称,一样用module定义,可是注意testbenc是没有端口描述的,这与咱们待测文件DUT是不同的。

3、激励信号和输出信号的定义,细心的同窗应该能够看出,激励信号就是咱们DUT文件的输入,输出信号也就是咱们DUT文件的输出。不一样的是在Testbench中,咱们将激励信号定义为reg类型,输出信号定义为了wire类型。

4、第四部分就是产生激励信号,具体详细实现咱们就不介绍了,你们能够阅读咱们的文档《Testbench经常使用语法及技巧》,阅读以后这个地方就很容易理解了。

5、最后一部分是待测设计的实例化,在FPGA设计中,模块的实例化就相似C语言中的函数调用,咱们在其余模块中调用当前模块时,就须要以实例化的方式来实现。不一样的是,Verilog文件模块实例化时,咱们须要标明每个端口信号。在咱们设计的Testbench中,经过模块实例化,将咱们的激励信号最终传递给了待测设计文件。

输出验证:下图是咱们仿真的最终输出的波形文件,能够看出输出信号o_clk_div是输入信号i_clk10分频。

最后咱们总结整个仿真过程当中,各个部分之间的关系,以下图。

1.1.2.  创建Modelsim仿真工程

本节咱们介绍如何创建Modelsim仿真工程,了解Modelsim仿真工具的使用。

第一步:打开Modelsim SE,点击菜单栏“File>New>Project”,准备新建工程。

第二步:弹出“Create Project”对话框,按下图填写仿真工程名称,以及工程的存储路径,以及默认库的的名称,这里默认库名为“work”,咱们一般叫做工做库。设置好后点击OK

这里介绍一下库的概念,即library。库是Modelsim仿真的载体,Modelsim会将仿真工程中的设计文件(DUT)和激励文件(Testbench)的编译(Compile)结果存放在work库中,在咱们新建工程的时候就会带着生成一个work库,以下图在Modelsim工做区,选择Library选项卡,咱们能够看到生成的work库,此时work库是空的,由于咱们尚未添加并仿真设计文件和激励文件。

第三步:新建或添加设计文件,这里咱们已经写好的testbench和待测模块,因此选择直接添加已存在文件便可。

第四步:依次添加testbench和待测模块文件。

第五步:编译咱们的DUTTestbench文件,以下图在工做区域选择Project选项卡,右键选择Compile>Compile All,编译全部。

 

第六步:切回到Library,此时再看work库就不是空的了,work库里的clk_div_eventb_clk_div_even分别是tb_clk_div_even.vTestbench)和clk_div_even.vDUT)的编译结果。选中Testbench仿真结果tb_clk_div_even,右键—>Simulate without Optimization,启动无优化仿真。

第七步:弹出仿真波形窗口(wave窗口),可是窗口内没有任何信号波形,工做区域多了一个sim选项卡,进入sim选项页,能够看到仿真实例clk_div_eventb_clk_div_even。选择相应的实例,右键—>add wave,添加信号到wave窗口。

第八步:切到wave 窗口,以下图,设置仿真运行时间为100us,这个时间根据具体设计所需时间来决定,再点击旁边的,运行仿真。这样咱们就能够看到输出的波形信号了,从而验证设计的正确性。

1.1.3.  使用do文件进行Modelsim仿真

上一节咱们介绍了经过Modelsim创建仿真工程的方法,可是这种方法咱们须要使用界面操做,这样会很费时很麻烦。这里咱们介绍一种快捷的方法,经过do文件快速搭建仿真环境,只须要双击批处理文件modelsim_run.bat,就能够自动调用Modelsim,并自动完成对Testbench和待验证设计文件的编译和仿真,而且能够自动将要观察的信号添加到wave窗口。

首先打开“02_Project_Examples\05_clk_div_even\sim”文件夹,能够看到以下文件。

咱们主要介绍一下前两个文件,最后一个是咱们的testbench

modelsim_run.bat文件:这是一个批处理文件,里面就一行“modelsim -do sim.do”,这是一条DOS命令,意思就是调用Modelsim工具,并在Modelsim工具中执行sim.do这个文件。

sim.dodo文件是由tcl脚本语言编写的,这个参考例程中的do文件是最基本的tcl脚本语言。下面介绍一下关键脚本语言的用法。如下是do文件的内容。

1.  vlib work       

2.  vlog  ../sim/*.v

3.  vlog  ../src/*.v

4.  vsim-t ns -novopt +notimingchecks  work.tb_clk_div_even 

5.  radix hex

6.  addwave -position insertpoint sim:/tb_clk_div_even/clk_div_even_inst/*

7.  run -all

vlib work:创建work库,至关于在上一节中新建工程时所生成的work库,后期咱们编译的结果信息存放到work库中。

vlog ../sim/*.vvlog至关于modelsim工具中的compile,“../sim/*.v ”表示编译05_clk_div_even\sim路径下全部的verilog文件。vlog ../src/*.v表示编译05_clk_div_even /src/路径下的全部verilog文件。

vsim -t  ns  -novopt  +notimingchecks  work.tb_clk_div_even:编译完成全部verilog文件后,就要启动仿真了,vsim就是启动仿真功能,vsim后面有许多关键词,这里简单说明一下,-t表示仿真时间单位为ns-novopt表示仿真时无优化,+notimingchecks表示无时序检查,work.tb_clk_div_even表示对work库中的tb_clk_div_even进行仿真,实际至关于在界面操做时,展开work库,右键—>Simulate without Optimization,启动仿真。

radix hex :表示要添加wave窗口的信号,以16进制的显示。

add wave–position  insertpoint  sim:/tb_clk_div_even/clk_div_even_inst/*:表示将clk_div_even_inst中的全部信号添加到wave窗口中去,执行这句之后,咱们每次仿真时,就不用每次都手动去添加仿真波形了。可是这句话实际是Modelsim生成的,不须要咱们本身编写。最开始咱们写的do文件是不包含这条语句的,当咱们运行到以下图状态时,选择要添加的信号,右键—>add wave后,下面的脚本窗口会弹出相应操做的tcl脚本语句。这样咱们把这条语句赋值到咱们的do文件中便可。第二次再调用sim.do文件时,就不用再手动添加波形了。

run –all :  运行全过程。固然也能够运行一段时间。run 10us 表示运行10us

掌握这些最基本的tcl脚本,使用do文件仿真会为咱们节省不少时间。后续的教程里咱们都会默认以这种方式进行仿真。固然这里只是介绍了最基本的仿真脚本语言,从此咱们仿真时可能还会有第三方的IP核文件,如alteraPLLFIFORAM等须要添加到仿真用例中,这些咱们后面在介绍IP核使用时会给你们介绍如何利用do文件仿真含有IP核的设计。

如今咱们能够体验一下do文件仿真所用的时间,双击“modelsim_run.bat”,便可运行仿真。



相关文章
相关标签/搜索