分享

modelsim和quartus 联合调试

 guitarhua 2014-09-26

        下面是基于在Altera Quartus II 下如何调用M odelS im  进行仿真的一个实例。 本来想和上一张 modesin 破解应用一起讲解,但是我在写的时候发现太多了,为了清楚明了,我就单独出了一篇。
        Quartus II 9.1,modesim 版本为modesim 6.5a,Quartus无法像ISE 那样方便的直接调用ModelSim,而
是需要额外的做一些工作。这确实给我们的仿真调试带来了一些不便。我也是在摸索了好久以后才彻底搞定这个问题,下面分享下,力求明白易懂,让大家少走一些弯路。

 

1、首先我们写一个代码如下的文件,保存为.v,因为我们采用的是verilog语言,代码意思为DIV 输出一个2分频的一个时钟,我们这里为什么要用到时钟呢,因为在我们不用到时钟的modesim 仿真中,要简单很多,使用到时钟的modesim 仿真,要全面一点,因此,我们这里主要讲解这个。

module clkdiv    //clkdiv 这个名一定要跟文件名相同

      (

           clk,

           rst_n,

           div

      );

      input clk; //系统时钟

      input rst_n; //复位信号,低有效

      output div;  // 2  分频信号

      reg div;

     

      always  @  (posedge  clk or  negedge rst_n ) 

           if( !rst_n )

                 div <=  1'b0;

           else

                 div <= ~div;

endmodule

2、然后我们新建工程,新建工程与普通的新建工程是没区别的,最后一步的时候要注意,如下图

 

选择我们要使用的仿真软件和仿真语言,

3、然后我们编译一下这段代码,在文件夹下面就会多一个(工程目录)\simulation\modelsim 。这个下面生成的是仿真所需要的文件,其中.vo 文件就是我们的代码布局布线信息。

4、打开processing下的start目录下的start test bench template writer自动创建后

缀为vt的文件。

 

5、接下来我们打开  工程目录\simulation\modelsim\clkdiv.vt   进行编辑,其中默认生成的文件如下:

 

`timescale 1 ps/ 1 ps

module clkdiv_vlg_tst();

// constants                                          

// general purpose registers

reg eachvec;

// test vector input registers

reg clk;

reg rst_n;

// wires                                              

wire div;

 

// assign statements (if any)                          

clkdiv i1 (

// port map - connection between master ports and signals/registers  

      .clk(clk),

      .div(div),

      .rst_n(rst_n)

);

 

initial                                               

begin                                                 

// code that executes only once                       

// insert code here --> begin                         

                                                      

// --> end                                            

$display("Running testbench");                       

end                                                   

always                                                

// optional sensitivity list                          

// @(event1 or event2 or .... eventn)                 

begin                                                  

// code executes for every event on sensitivity list  

// insert code here --> begin                         

                                                      

@eachvec;                                              

// --> end                                            

end                                                   

endmodule

我们要注意到,默认的模块名字是  clkdiv_vlg_tst ,把我们所写的clkdiv.v文件封装成了  clkdiv i1 的文件名,通过write 连接。

因此我们需要修改下面的initial 文件,

 

`timescale 1 ps/ 1 ps

module clkdiv_vlg_tst();

// constants                                          

// general purpose registers

reg eachvec;

// test vector input registers

reg clk;

reg rst_n;

// wires                                              

wire div;

 

// assign statements (if any)                         

clkdiv i1 (

// port map - connection between master ports and signals/registers  

      .clk(clk),

      .div(div),

      .rst_n(rst_n)

);

 

initial begin

clk = 0;

forever

#10 clk = ~clk; 

end

initial begin

rst_n = 0;

#1000 rst_n =  1;

#1000;

$stop;

end

endmodule

 

修改完后的test bench 文件如上面代码。我们进行保存意思为:

上电后1us 复位信号

运行时间为 1us,(当然我们可以一直运行,这个我们可以自行设定)。

 

 

6、下面我们设置仿真选项,打开   Assignments --->  EDA Tool Settings 

 

其中在N ativeLink settings 选择 c ompile test bench test bench 进行设置非常关键

参考如下:按“test benches…”进入设定如下

选择NEW

进入下面页面设置

test bench name 填写的是:simulation/modelsim 目录下的 clkdiv.vt 文件名 clkdiv 

Top level module  in test bench 填写的是:打开clkdiv.vt 文件内的module  名字。

Design  inst ance  name in  test  bench:   默认i1 . 

 

这里的文件名字,我们在修改test bench 已经讲过了。

 

完成以上3 步填写,在Test bench files 下面添加test bench files->clkdiv.vt点击OK

完成设置。

7、设置完成以后,在进行编译。

8、在quartus 调用 modesim

 

9、由于我们设置了仿真时间,默认就已经运行完了,得到如下波形

1us 后复位,然后运行1us 2分频,

10、如果我们需要一点一点的看,那么我们在下面的命令行中输入命令

 

首先我们结束当前仿真    quit –sim  回车。

 

然后在 library 中找到 work 下面的工作文件

为什么要选择clkdiv_vlg_tst 文件仿真呢?在前面我们就说了,因为我们把clkdiv  封装成了一个文件,让clkdiv_vlg_tst 去调用,因此我们只需要仿真clkdiv_vlg_tst OK

 

添加仿真网络

假设我们先运行100ps,那么我们如数  run 100

得到如下波形

如果我们要运行 1ms ,那么出现如下:

 

其中波形为

 

这里提示为:

# Break in Module clkdiv_vlg_tst at F:/modelsim/san/simulation/modelsim/clkdiv.vt line 77

意思我们仿真超过了所设定的值。

 

到这里我们的仿真和modesim 基本应用就讲完咯!!  886

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多