xiaobaibai

modelsim总结

1
阅读(3186)

Modelsim的基本仿真流程大致分以下几个步骤:建库、编译工程、前后仿真、调试等。Modelsim仿真既可以在modelsim界面操作,也可以用do文件实现, 这里结合学习的教程、网上看到的资料,和实际遇到的一些问题,分别做一整理小结。

 

  1. 建库

建库包括Altera库和Xilinx库,同时都包括Verilog和VHDL。这里只建了Verilog库,VHDL和Verilog步骤相同。

对于Altera库主要包括lpm元件库、Mega_Function库atera_mf、altera原语库altera_primitive和各器件系列模型库。前三种是调用altera模块的必备库,第四种是进行综合后功能仿真和布线后时序仿真需要的库,和器件系列有关,只选对应系列即可。

 

Altera库创建和编译步骤如下:

  1. 在Modelsim安装目录下新建文件夹,命名altera_lib,以存放编译后的库文件,可以在altera_lib下新建Verilog和VHDL两个子文件夹,分别存放Verilog和VHDL库。

  2. 打开Modelsim,新建Library,file ->new->library ..

  3. 如下图,创建lpm库,路径E:\modeltech_10.1a\altera_lib\Verilog\lpm

 

  1. 添加库文件,并编译,compile -> compile …  ,出现compile source files窗口,library 指定到lpm下,查找范围,选quartus安装目录下… eda\sim_lib目录里的仿真原型文件:220model.v , 点compile ,点done

    到此,lpm库建立完毕。

  1. 同理,建立altera_mf库添加 altera_mf.v ,建立primitive库添加altera_primitive.v

建立各系列的模型库,命名可用系列名加_ver“xxx_ver”,也可随意吧,添加各系列的xxx_atoms.v

 

这里,也可以把以上库放在一个文件夹,这样做简单,一次就搞定,分开也就是条理清楚,没人去看,所以没必要。

 

  1. 修改modelsim.ini文件,为的是让modelsim能自动map到已经编译的这些库上。先去掉只读属性,在[Library]和[vcom]之间加上:库名=库路径[绝对路径或者相对路径],相对路径是相对于modelsim安装路径, modelsim安装路径用$MODEL_TECH表示。

 

这里所有库都放在E:\modeltech_10.1a\altera_lib下,库名是altera_lib,这里只添加一句:

altera_lib = E:\modeltech_10.1a\altera_lib

 

  1. 保存退出,改回modelsim.ini只读属性,防止乱改。至此altera库建立完毕。

 

 

Xlinx库创建和编译步骤如下:

         相比altera,xilinx建库很方便。xilinx有批处理命令,直接在console命令窗口,输入compxlib命令,调出编译库的窗口,先改掉modelsim安装目录下modelsim.ini只读属性。设置如下图:

    

         Next,选择语言

 

         Next,选择需要编译的器件:

 

Netx  ->  next,选择输出路径,launch compile process,等待编译完成。完成后改回modelsim.ini只读属性。至此xilinx库建立完毕。

 

 

  1. 编译工程

 

编译工程主要包括:code、testbench、建立工程、建立工程库、映射、编译等。Code主要有code思想和风格,在Verilog部分涉及。Testbench,下边给出一个公用模板,基于这个方便修改,可以根据自己的习惯建一个temp_tb.v。

 

 

 

Modelsim界面编译工程:

  1. 新建工程:打开modelsim,file -> new -> project .. ,指定工程名、路径、工程库。

  2. Add existing file

  3. Add testbench file ….

  4. 编译,compile –> complie all

  5. 编译语法查错,直到编译通过。至此编译完毕。

 

  1. 功能和时序仿真

 

仿真是在编译的基础上,进行的功能调试,包括综合前功能仿真、综合后功能仿真和布局布线后时序仿真。

 

Modelsim界面综合前仿真:

        

  1. 指定顶层,开始仿真;simulation -> start simulation … ,在work 库中,指定testbench,ok,开始仿真。

 

  1. 查看仿真结果,打开wave

 

                  信号,加入wave

 

  1. 运行,查看波形。Run -> run all ….

 

 

         至此,简单的modelsim界面综合前仿真介绍完毕。

 

Modelsim界面综合后仿真:

         综合后仿真需要quartus综合后的网表文件(以altera为例),

  1. 综合后的网表的生成: quartus工程名右键 -> setting –> EDA Tool Setting, 双击Simulation ,选择EDA软件modelsim选择输出网表路径,如图

 

  1. More settings …. 将 Generate netlist for functional simulation only 设置为ON

  2. 保存,全编译。

  3.  检查一下/modelsim/Psyth/source 里面,可以发现,已经生成了一个*.vo 文件。

这个就是需要的网表文件。(VHDL 的输出网表是*.vho 后缀名的)

e)      将vo文件添加到工程,指定TestBench 文件top_tb.v同前边一样进行仿真。

  1. 得到的仿真结果

 

Modelsim界面布局布线后仿真:

         布局布线后仿真需要综合网表文件和添延时文件*.sdo(Verilog)或*_vhd.sdo(VHDL);

 

  1. QuartusII 里面设置重新把Generate netlist for functional simulation only 设置成OFF

  2. 指定延时文件

         这里region要为顶层文件在tb里的例化名

  1. 运行,查看波形,波形带有延时

 

  1. 用tcl文件.do 进行modelsim仿真

在modelsim中使用do文件是非常方便的进行仿真的一种方法,的项目比较大,特别是几个人分开做的时候,前后模块的联合仿真比较重要,查看的信号比较多,使用了do文件可以自动仿真,省去很多体力活。

         下面是编写do文件的一般步骤:

a).    quit -sim : 首先退出原来仿真的工程。

b).    cd     : 设置工作目录的路径,就是你所要建立的工作目录work要放在哪里。

c).     vlib work  : 在工作目录下建立一个work目录,请注意不要用操作系统直接新建一 个work的文件夹,因为用操作系统建立的work文件夹并没有modelsim SE自动生成的_info文件。还有个问题是,当你的软件工程里需要用到软核时,可能会需要一些库,但这些库ISE软件中是没有的,此时就需要我们自己新建库了,并映射到当前目录下。我们只自己新建的库一般放在work库前面建立。

d).    vmap work : 将新建的work库映射到当前工作目录下(当前目录就是第一步中的目录了)。其他新建的库也要这样的方法映射。

e).    vlog  +acc –work work “file_path/*.v : 编译“file_path”目录下所有.v文件,并将 其添加进工作库(work)中,包括IP生成的V文件也要编译的。或者vlog -f top_tb.f ,top_tb.f是.v的列表文件。编译时可以分开单独编译,但是一定要注意顺序,先编译被调用的文件。在综合后仿真和布局布线后仿真的时候,这里添加综合后网表和tb即可。VHDL 用vcom编译。

对于xilinx工程在仿真的时候还需要用到一个文件,那就是glbl.v这个库文件。它是存放在xilinx安装目录下,我们直接编译它并添加时工作库(work)就可以了。特别需要说明的是,在仿真软核的时候,在XPS软件里点击simulation -> generate simulation hdl files会在工程目录中生成一个simulaton文件夹,这个文件夹里的东西就是软核仿真时所需要的仿真文件了。所以我们需把simulaton里所以的v文件都编译一次,这样才能仿真软核。

f).    vsim  -L altera_lib  -novopt  work.top_tb  : 这是没有调用IP Core时的仿真命令,注意后面的参数top_tb必须为Testbench中的模块名。 布局布线后仿真是这里要指定延时文件,vsim  -L altera_lib  -novopt -sdfmax /top_tb/top=top_v.sdo work.top_tb

g).  do vawe.do 运行添加wave tcl,这里可以给信号分组,添加颜色,设置波形属性等。

h).  run –all  设定运行时间,run 1000ms等。

         i).      在do里可以用file copy/file delete 来对临时文件进行操作。

 

         至此,modelsim仿真总结完毕。这里仅为了简单记录仿真方法和流程,旨在简单明了,对更深入的和更详细的有待进一步补充。

 

 

 

 

 

附件 一  testbench 模板

 

////////////////////////////////////////////////////////////////////////////////

// Company:

// Engineer:

//

// Create Date:

// Design Name:

// Module Name:

// Target Device:

// Tool versions:

// Description:

//   

// Dependencies:

//   

// Revision:

//   

// Additional Comments:

//   

////////////////////////////////////////////////////////////////////////////////

 

`timescale 1ns / 1ps

module top_tb;

 

//*************************Parameter Declarations******************************

parameter    CLK_PERIOD = 20  ;     //clk = 50Mhz

 

//************************Internal Declarations***********************

//************************** Register Declarations ****************************       

reg             clk ;

reg             reset;       

 

//********************************Wire Declarations**************************

 

 

//******************************Main Body of Code***************************

//--------------------------------- initial reg data ---------------------------------

initial

         begin

 

         end

//---------- Generate Reference Clock input to tb ----------------

 

initial

         begin

                   clk = 1'b1;

         end

 

always 

         #(CLK_PERIOD/2) clk = !clk;

 

//--------------------------------- Resets ---------------------------------

   

    initial

        begin

                                               rst_n = 1'b1;

            #(10*CLK_PERIOD)         rst_n = 1'b0;

            #(100*CLK_PERIOD) rst_n = 1'b1;

        end

   

//----------------------------- Data Transfer---------------------------------

 

initial

begin

 

         #(10*CLK_PERIOD);

         @(negedge data)

         begin

 

         end

end

    

          

    //----------------------------- simulation end ---------------------------------     

initial

begin

         #(10*CLK_PERIOD);

         if (     )    //end sign

                   begin

                            $display("------- TEST PASSED -------");

                   end

         else

         begin

                   $display("####### ERROR: TEST FAILED ! #######");

         end

         $stop;

end

        

    //------------------------ Instantiate TOP module  ------------------------

 

top #

(

         .parameter1   (1),        //

         .parameter2   (0)         //

)

top_inst

(

         .a (a),

 

);

 

Endmodule

////////////////////////////////////////////////////////////////////////////////

 

 

附件二  do 模板

 

 

////////////////////////////////////////////////////////////////////////////////

#!/bin/bash

#this bash shell document is used to verilog project simulation

#author:iyoyoo

 

echo "***************** end pre-project  ********************************"

quit -sim

 

echo "***************** go to work dir  ********************************"

#cd /

#cd D:/quartus/EP4CE15F/lcd/simulation 

 

echo "***************** start to  setup work lib************************"

vlib work

 

echo "***************** start to  compile ******************************"

vlog -f top_tb.f

 

echo "***************** set up reference library ***********************"

vmap altera_lib  E:/modeltech_10.1a/altera_lib

 

 

echo "***************** delet pre-temp files  *************************"

#file delete ../simulation/pika_ani.mif

#file delete ../simulation/modelsim/top_v.sdo

 

echo "***************** copy temp file *********************************"

#file copy ../source/pika_ani.mif ../simulation/

#file copy ../simulation/modelsim/top_v.sdo ../simulation/

 

 

echo "***************** start to  simulation  **************************"

#-pli novas.dll   --- for debussy

#-sdfmax /top_tb/top=top_v.sdo   -----for post synthesis sim

 

vsim  -L altera_lib  -novopt  work.top_tb

 

echo "***************** add signal to  vawe  **************************"

do vawe.do

 

echo "***************** start to  run        ******************************"

run -all

 

echo "***************** delete temp files  ***************************"

#file delete ../simulation/pika_ani.mif

#file delete ../simulation/modelsim/top_v.sdo

////////////////////////////////////////////////////////////////////////////////

 

 

附件三  file.f模板

 

 

////////////////////////////////////////////////////////////////////////////////

+licq_all+

+access+r

 

//../simulation/modelsim/top.vo   -for post synthesis simulation

 

../source/top.v

 

../simulation/top_tb.v

 

 

+libext+vmd+.v

-y      $QUARTUS_ROOTDIR/eda/sim_lib

////////////////////////////////////////////////////////////////////////////////

 

 

附件三 、 wave.do模板

 

 

////////////////////////////////////////////////////////////////////////////////

 

view signals stucture wave

onerror {resume}

quietly WaveActivateNextPane {} 0

 

#-color Green for all signal is green

#-color Green Blue Yellow Pink Orchid Red Salmon Orange

 

# top_tb group

add wave -itemcolor Blue -noupdate -expand -group top_tb -format Logic -radix hexadecimal /top_tb/*

 

# sub group

add wave -itemcolor Green -noupdate -expand -group sub -format Logic -radix hexadecimal /top_tb/sub/*

 

TreeUpdate [SetDefaultTree]

WaveRestoreCursors {{Cursor 1} {10000 ns} 0}

configure wave -namecolwidth 364

configure wave -valuecolwidth 100

configure wave -justifyvalue left

configure wave -signalnamewidth 0

configure wave -snapdistance 10

configure wave -datasetprefix 0

configure wave -rowmargin 4

configure wave -childrowmargin 2

configure wave -gridoffset 0

configure wave -gridperiod 1

configure wave -griddelta 40

configure wave -timeline 0

configure wave -timelineunits ps

update

WaveRestoreZoom {10000 ns} {10000 ns}

 

////////////////////////////////////////////////////////////////////////////////

 

//转