zoukankan      html  css  js  c++  java
  • 如何使用ModelSim作前仿真與後仿真? (真oo无双前辈)

    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

    modelsim00

    Step 2:
    Add Existing File

    modelsim01

    將Counter.v與Counter_tb.v加入

    modelsim02

    Step 3:
    Compile All

    選擇Counter.v或者Counter_tb.v,按滑鼠右鍵,選擇Compile->Compile All,編譯所有Verilog code。

    modelsim03

    編譯成功。

    modelsim05

    Step 4:
    Simulate

    在Library tab選擇Counter_tb,按滑鼠右鍵,選Simulate。

    modelsim06

    Simulate成功。

    modelsim07 

    Step 5:
    Add Signal to Wave

    將欲觀察的信號從Objects加入Wave,加入clk,rst_n與cnt。

    modelsim08

    最後結果。

    modelsim09

    Step 6:
    Run 300ns

    modelsim10

    最後前仿結果。

    modelsim11

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

    Step 1與Step 2與之前一樣。

    Step 3:
    Execute Macro

    modelsim12

    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


    最後前仿結果。

    modelsim11

    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

    modelsim13

    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無法自己抓到,必須自己填。

    modelsim14

    modelsim15

    Step 3:
    編譯與模擬

    Processing -> Start Compilation

    modelsim16

    完整程式碼下載
    Counter.7z

    Conclusion
    本文介紹了使用ModelSim作前仿真與後仿真,善用ModelSim,將可加快FPGA與SOPC的開發。

    See Also
    (原創) 如何使用ModelSim-Altera作電路模擬? (SOC) (Quartus II) (ModelSim)
    (原創) 如何解決在Quartus II無法使用ModelSim-Altera模擬的問題? (SOC) (Quartus II) (ModelSim)
    (原創) 如何做functional simulation? (SOC) (Quartus II) (ModelSim) 
    (原創) 如何使用ModelSim對Megafunction或LPM作仿真? (SOC) (MegaCore) (ModelSim)

    Reference
    [1] EDA先鋒工作室,Altera FPGA/CPLA設計(基礎篇),人民電郵出版社

  • 相关阅读:
    linux socat创建简单的tun隧道
    【k8s】sc-nfs-pod
    c#中equals和==
    数据结构之哈希表
    数据结构之红黑树
    数据结构之2-3查找树
    数据结构之二叉查找树
    数据结构之递归与栈
    数据结构之二分查找法(折半查找)
    数据结构之基于无序链表的集合和映射
  • 原文地址:https://www.cnblogs.com/lanlingshan/p/2371431.html
Copyright © 2011-2022 走看看