zoukankan      html  css  js  c++  java
  • [转载] 如何使用ModelSim作前仿真与后仿真? (SOC) (Quartus II) (ModelSim)

    (转贴) 如何使用ModelSim作前仿真与后仿真? (SOC) (Quartus II) (ModelSim)

    来源:http://hi.baidu.com/davinzhan/blog/item/5ad9e21660aa4659f2de3278.html

    类似的,还有http://wenku.baidu.com/view/d1d6da2de2bd960590c6773e.html

    这里面的方法,我在写《Sobel边缘检测的 FPGA应用.doc》中用到.讲得比较详细。

    可以解决问题“为什么quartusII调用modelsim怎么每次都要编译库” 

    Abstract
    本文介绍使用ModelSim做前仿真,并搭配Quartus II与ModelSim作后仿真。

    Introduction
    使用环境:Quartus II 8.1 + ModelSim-Altera 6.3g

    由于FPGA可重复编程,所以不少开发人员就不写testbench,直接使用Quartus II的programmer烧进开发板看结果,或者使用Quartus II自带的Waveform Editor进行仿真,这种方式虽然可行,但仅适用于小project,若project越写越大,Quartus II光做fitter就很耗时间,一整天下来都在作Quartus II编译。

    比较建议的方式,还是学ASIC那招:『写testbench先对每个module作前仿真,再对每个module作后仿真,最后再烧入FPGA测试。』

    这种方式的优点是:

    1.testbench比waveform editor可更灵活的描述电路规格。

    2.testbench可使用Verilog的系统函数,如$display()、$fwrite()...等。

    但要使用testbench作仿真,单独Qaurtus II并无法做到,就得使用ModelSim了,这又牵涉到『前仿真』与『后仿真』。

    所谓的『前仿真』,就是Quartus II的Functional Simulation,不考虑电路的门延迟与线延迟,重点在观察电路在理想环境下的行为与设计构想是否一致[1]。由于没经过fitter阶段,所以仿真速度很快。前仿真结果正确,并不表示将来结果结果正确,但若前仿真结果不正确,则将来结果一定不正确

    所谓的『后仿真』,就是Quartus II的Timing Simulation,考虑了电路的门延迟与线延迟,由于经过fitter阶段,所以模拟结果最为精准。但fitter在Quartus II编译需耗费很多时间,所以建议『前仿真』正确后,再考虑『后仿真』

    使用Quartus II的waveform editor作前仿真与后仿真,我就不再多谈,本文主要是谈如何使用ModelSim-Altera作前仿与后仿。

    1.使用GUI的方式在ModelSim-Altera作前仿真。

    2.使用DO macro在ModelSim-Altera作前仿真。

    3.使用Quartus II + ModelSim-Altera作后仿真。

    Counter.v / Verilog

    1 /*
    2 (C) OOMusou 2008 http://oomusou.cnblogs.com
    3
    4 Filename    : Counter.v
    5 Compiler    : Quartus II 8.1 / ModelSim-Altera 6.3g
    6 Description : simple counter
    7 Release     : 01/30/2009 1.0
    8 */
    9
    10 `timescale 1ns/100ps
    11
    12 module Counter (
    13 input        CLK,
    14 input        RST_N,
    15 output [3:0] CNT
    16 );
    17
    18 reg [3:0] cnt;
    19 assign CNT = cnt;
    20
    21 always@(posedge CLK, negedge RST_N) begin
    22 if (!RST_N)
    23     cnt <= #5 4'h0;
    24 else
    25     cnt <= #5 cnt + 1'b1;
    26 end
    27
    28 endmodule


    一个很简单的counter,从0数到15重复数。由于要使用ModelSim作前仿,所以在reg做了delay,不过这在Quartus II作合成时会自动忽略, 因为delay并非可合成的Verilog。

    一般写给FPGA的RTL,都不会去设定timescale,不过由于要用ModelSim作前仿,所以要加上timescale。

    Counter_tb.v / Verilog

    1 /*
    2 (C) OOMusou 2008 http://oomusou.cnblogs.com
    3
    4 Filename    : Counter_tb.v
    5 Compiler    : Quartus II 8.1 / ModelSim-Altera 6.3g
    6 Description : simple counter testbench
    7 Release     : 01/30/2009 1.0
    8 */
    9
    10 `timescale 1ns/100ps
    11
    12 module Counter_tb;
    13
    14 reg        clk;
    15 reg        rst_n;
    16 wire [3:0] cnt;
    17
    18 parameter PERIOD = 20;
    19
    20 Counter counter (
    21 .CLK(clk),
    22 .RST_N(rst_n),
    23 .CNT(cnt)
    24 );
    25
    26 initial begin
    27 #0 clk   = 1'b0;
    28      rst_n = 1'b0;
    29 #5 rst_n = 1'b1;
    30 end
    31
    32 // 50MHz
    33 always #(PERIOD/2) clk = ~clk;
    34
    35 endmodule


    一个很典型的testbench,唯一要注意的是第28行。

       rst_n = 1'b0;
    #5 rst_n = 1'b1;


    之所以一开始要将rst_n为0,是因为ModelSim与Quartus II对reg初始值看法不一样,Quartus II认为reg初始值为0,但ModelSim认为reg初始值为x,所以需要rst_n=1'b0将reg归0,这样用ModelSim前仿才会正确,但ModelSim后仿可以不这样做,因为Quartus II会先做处理。

    不过为了前仿与后仿都使用同一个testbench,建议加上rst_n = 1'b0设定reg初始值为0。

    有了RTL与testbench之后,来看看如何使用ModelSim作前仿与后仿。

    1.使用GUI的方式在ModelSim-Altera作前仿真
    ModelSim提供了全GUI的方式,只要使用操作的方式,就能做前仿。

    Step 1
    File -> New Project

     

    Step 2
    Add Existing File

     

    将Counter.v与Counter_tb.v加入

     

    Step 3
    Compile All

    选择Counter.v或者Counter_tb.v,按鼠标右键,选择Compile->Compile All,编译所有Verilog code。

     

    编译成功。

     

    Step 4
    Simulate

    在Library tab选择Counter_tb,按鼠标右键,选Simulate。

     

    Simulate成功。

     

    Step 5
    Add Signal to Wave

    将欲观察的信号从Objects加入Wave,加入clk,rst_n与cnt。

     

    最后结果。

     

    Step 6
    Run 300ns

     

    最后前仿结果。

     

    2.使用DO macro在ModelSim-Altera作前仿真
    ModelSim也提供macro的方式,以上所有的GUI操作,都可以使用TCL script描述。

    Step 1与Step 2与之前一样。

    Step 3
    Execute Macro

     

    Counter_wave.do / ModelSim Macro

    1 #compile
    2 vlog Counter.v
    3 vlog Counter_tb.v
    4
    5 #simulate
    6 vsim Counter_tb
    7
    8 #probe signals
    9 add wave *
    10
    11 #300 ns
    12 run 300 ns


    最后前仿结果。

     

    3.使用Quartus II + ModelSim-Altera作后仿真

    Step 1
    设定Quartus II使用ModelSim-Altera作后仿真

    Assignments -> Settings -> Category :EDA Tool Settings -> Simulation:Tool name:ModelSim-Altera
    选取Run gate-level simulation automatically after compilation
    Format for output netlist:Verilog
    Time scale:1 ns

     

    Step 2
    设定testbench

    在同一页的NativeLink settings选择Compile test bench,按下TestBenches..加入Counter_tb.v。比较诡异的是,Test bench name、Top level module in test bench与Design instance name in test bench无法自己抓到,必须自己填。

     

     

    Step 3
    编译与模拟

    Processing -> Start Compilation

     

    完整程序代码下载
    Counter.7z

    Conclusion
    本文介绍了使用ModelSim作前仿真与后仿真,善用ModelSim,将可加快FPGA与SOPC的开发。

  • 相关阅读:
    Linux下使用curl查看http请求各阶段耗时
    yum list查看版本
    【k8s】XX 修改ipvs模式
    域名访问时间 测试脚本
    关闭WINDOWS自动检测互联网络
    win10专业版安装VMware workstation pro 16时提示“setup failed to generate the ssl keys necessary to run vmware”笔记
    手动启动MegaRAID Storage Manager v17.05.02.01 for Linux
    Java基于POI实现excel任意多级联动下拉列表——支持从数据库查询出多级数据后直接生成【附源码】
    C# 后台POST数据及API接收简记
    Linux 安装pycharm,清除缓存,scp传输文件
  • 原文地址:https://www.cnblogs.com/zlh840/p/1964206.html
Copyright © 2011-2022 走看看