0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

仿真軟件ModelSim及其應(yīng)用,ModelSim的仿真流程

e9Zb_gh_8734352 ? 來源:lq ? 2018-12-29 11:35 ? 次閱讀

FPGA設(shè)計仿真驗證簡介

仿真是指使用設(shè)計軟件包對已實現(xiàn)的設(shè)計進行完整的測試,并模擬實際物理環(huán)境下的工作情況。FPGA設(shè)計驗證包括功能仿真、時序仿真和電路驗證,它們分別對應(yīng)整個開發(fā)流程的每一個步驟。

功能仿真是指僅對邏輯功能進行模擬測試,以了解其實現(xiàn)的功能是否滿足原設(shè)計的要求,仿真過程沒有加入時序信息,不涉及具體器件的硬件特性,如延時特性等,因此又叫前仿真,它是對HDL硬件描述語言的功能實現(xiàn)情況進行仿真,以確保HDL語言描述能夠滿足設(shè)計者的最初意圖。

時序仿真則是在HDL可以滿足設(shè)計者功能要求的基礎(chǔ)上,在布局布線后,提取有關(guān)的器件延遲、連線延時等時序參數(shù)信息,并在此基礎(chǔ)上進行的仿真,也成為后仿真,它是接近于器件真實運行狀態(tài)的一種仿真。

仿真軟件ModelSim及其應(yīng)用

HDL的仿真軟件有很多種,如VCS、VSS、NC-Verilog、NC-VHDL、ModelSim等,對于開發(fā)FPGA來說,一般是使用FPGA廠家提供的集成開發(fā)環(huán)境,他們都有自己的仿真器,如Xilinx公司的ISE,Altera公司的Quartus II等,但是這些廠家開發(fā)的仿真器的仿真功能往往比不上專業(yè)的EDA公司的仿真工具,如ModelSim AE(Altera Edition)、ModelSim XE(Xilinx Edition)等。Quartus II設(shè)有第三方仿真工具的接口,可以直接調(diào)用其他EDA公司的仿真工具,這極大地提高了EDA設(shè)計的水平和質(zhì)量。

ModelSim是Model Technology(Mentor Graphics的子公司)的HDL硬件描述語言的仿真軟件,該軟件可以用來實現(xiàn)對設(shè)計的VHDL、Verilog HDL或是兩種語言混合的程序進行仿真,同時也支持IEEE常見的各種硬件描述語言標準。

無論是從使用界面和調(diào)試環(huán)境,還是從仿真速度和效果上看,ModelSim都可以算的上是業(yè)界比較優(yōu)秀的HDL語言仿真軟件。它是唯一的單內(nèi)核支持VHDL和Verilog HDL混合仿真的仿真器,是做FPGA/ASIC設(shè)計的RTL級和門級電路仿真的好選擇,它采用直接優(yōu)化的編譯技術(shù),Tcl/Tk技術(shù)和單一內(nèi)核仿真技術(shù),具有仿真速度快,編譯的代碼與仿真平臺無關(guān),便于IP核的保護和加快錯誤程序定位等優(yōu)點。

ModelSim分幾種不同的版本:ModelSim SE、ModelSim PE、ModelSim LE和ModelSim OEM,其中的SE、PE、LE是其最高版本,編譯速度是所有版本中最快的,而OEM版本就是集成在FPGA廠家設(shè)計工具中的版本,它們專門和某個廠家的FPGA配套來使用,如后面使用到的ModelSim AE就是專門針對Altera公司QuartusII的配套的OEM產(chǎn)品。

ModelSim的仿真流程

ModelSim不僅可以用于數(shù)字電路系統(tǒng)設(shè)計的功能仿真,還可以應(yīng)用于數(shù)字電路系統(tǒng)設(shè)計的時序仿真。ModelSim的使用中,最基本的步驟包括創(chuàng)建工程、編寫源代碼、編譯、啟動仿真器和運行仿真五個步驟,仿真流程如圖1所示:

圖1 ModelSim仿真的基本流程(基于工程的)

這個是基于工程的流程,還有一種是基于庫文件的,和基于工程的相比,它需要自己創(chuàng)建工作庫,另外關(guān)閉ModelSim軟件后,下次還得自己手動打開設(shè)計文件,而基于工程的就不會這樣,工程是一直保持的狀態(tài),不用每次啟動軟件后再手工加載,除非我們自己關(guān)掉這個工程。

仿真測試文件程序的設(shè)計方法

隨著設(shè)計量和復(fù)雜度的不斷增加,數(shù)字驗證變得越來越難,所消耗的成本也越來越高,面對這種挑戰(zhàn),驗證工程師必須依靠相應(yīng)的驗證工具和方法。對于大型的設(shè)計,比如上百萬門的設(shè)計驗證,工程師必須使用一整套規(guī)范的驗證工具,而對于較小的設(shè)計,使用具有HDL Test Bench的仿真器是一個不錯的選擇。

一般來說,Test Bench使用工業(yè)標準VHDL或者Verilog HDL語言來描述,簡單的Test Bench通過調(diào)用用戶設(shè)計的功能模塊,然后進行仿真,較為復(fù)雜的Test Bench還包括一些其他的功能,比如包含特定的激勵向量或者進行實際輸出與期望的比較等。

在開始寫Test Bench之前,很重要的一點就是要設(shè)計實例化DUT(Design Under Test,即就是被測元件),還要詳細了解整個的測試計劃和測試案例。整個的測試Test Bench環(huán)境如圖2所示:

圖2 Test Bench的測試環(huán)境

從圖中可以看見,Test Bench和被測對象Counter構(gòu)成了一個封閉的循環(huán),Test Bench負責向被測元器件的輸入端口提供激勵(時鐘)和一些控制信號(復(fù)位和置位信號),另外Test Bench還監(jiān)測被測元器件的輸出端口所輸出的信號值是否和我們的設(shè)計預(yù)期相符,并把監(jiān)測的情況顯示給我們。

由于Test Bench程序和被測對象構(gòu)成了一個封閉的循環(huán),因此Test Bench的輸入端口需要與被測對象的輸出端口連接,Test Bench的輸出端口則要與被測對象的輸入端口相連接。所以在端口的定義上,Test Bench程序需要和被測對象相對應(yīng)。

被測元器件是一個已經(jīng)設(shè)計好的電路或系統(tǒng),Test Bench是用元件例化語句將其嵌入程序中。VerilogHDL測試平臺是一個設(shè)有輸入輸出端口的設(shè)計模塊,被測元器件的輸入端定義為reg(寄存器)型變量,在always塊或initial塊中賦值(產(chǎn)生測試條件),被測元器件的輸出端定義為wire(線網(wǎng))型變量,產(chǎn)生相應(yīng)輸入變化的輸出結(jié)果(波形)。

4.1

組合邏輯電路Test Bench的設(shè)計

組合邏輯的設(shè)計驗證,主要就是檢查設(shè)計結(jié)果是不是符合該電路的真值表功能,因此在編寫組合邏輯Test Bench時,用initial塊把被測電路的輸入按照真值表提供的數(shù)據(jù)變化作為測試條件,就能實現(xiàn)Test Bench的設(shè)計。

例1.編寫一位全加器的Test Bench程序

全加器的A和B兩個是1位二進制加數(shù)的輸入端,CI是低位來的進位輸入端,CO是向高位進位的輸出端,SO是全加器的本位和值。

用Verilog HDL語言編寫的全加器程序adder.v如下:

moduleadder1(

a ,

b ,

ci ,

so ,

co

);

// Portdeclarations

input a ;

input b ;

input ci;

output so;

output co;

//InternalVariables

wire a;

wire b;

wire ci;

wire so;

wire co;

//CodeStarts Here

assign {co, so} = a + b + ci;

endmodule

根據(jù)全加器的真值表寫的全加器的Test Bench程序test_adder1.v如下:

//test_adder1.v

`timescale1ns/1ns

moduletest_adder1;

wire so;

wire co;

reg a;

reg b;

reg ci ;

adder1 U(

.a(a),

.b(b),

.ci(ci),

.so(so),

.co(co)

);

initial

begin

#20 a = 0; b = 0; c = 0;

#20 a = 0; b = 0; c = 1;

#20 a = 0; b = 1; c = 0;

#20 a = 0; b = 1; c = 1;

#20 a = 1; b = 0; c = 0;

#20 a = 1; b = 0; c = 1;

#20 a = 1; b = 1; c = 0;

#20 a = 1; b = 1; c = 1;

#200 $stop;

end

endmodule

下面我們就以ModelSim為EDA平臺,仿真上面的程序。這一講先暫時不講仿真測試的方法,留到下一講再來詳述,這一講主要講述的內(nèi)容是Test Bench程序的編寫方法,故現(xiàn)在僅僅給出仿真的波形圖,全加器的仿真波形如圖3所示:

圖3一位全加器的仿真波形圖

現(xiàn)在對著這個圖,我們返回來再來看看我們編寫的test_adder1.v這個Test Bench程序究竟完成了哪些工作,是不是按照我們的要求來工作的:

01

首先看程序第二行的`timescale1ns/1ns這句代碼,這個是時間尺度指令,它是用來定義模塊的仿真時間單位和時間精度的,其使用格式為:`timescale仿真時間單位/時間精度,用于說明仿真時間單位和時間精度的數(shù)字只能是1、10或100,不能為其它的數(shù)字,單位可以是s、ms、us、ns、ps和fs。仿真時間單位是指的模塊仿真時間和延時的基準單位,也就是說只有定義了仿真時間單位,程序中的延時符號"#"才有意義,如程序中的一行#20 a = 0; b = 0; c = 0;前面的#20就是延時20個時間基準單位,按照程序中的1ns這個基準,就延時了20個ns。需要說明的是該行程序的下一行#20 a =0; b = 0; c = 1;前面的延時20個ns是相對于前一個的延時來說的,也就是第二行在第一行完了之后延時20ns執(zhí)行。這時候再看看仿真的波形圖就不難理解最開始的線為什么是紅色而不是正常的綠色的原因了,因為我們在程序中begin的下一行就是#20 a =0; b = 0; c = 0;它前面的延時20個ns是相對于begin的延時,也就是說程序開始的時候是什么都不做的,輸出為不確定的值,過了20個ns才將全0賦給了a、b和ci,這個時候才是最開始的綠線的部分。

02

在Test Bench程序中,把全加器的輸入a、b和ci定義為了reg型變量,把輸出so和co定義為了wire型變量,這個和被測元件的定義情況剛好是反的,這樣也說明了TestBench程序和被測元件是封閉的一個循環(huán)。用元件例化語句adder1U( .a(a), .b(b), .ci(ci), .so(so), .co(co) ) ;把全加器設(shè)計電路嵌入到Test Bench程序中。

03

程序的后面有一句#200 $stop;這個是一個系統(tǒng)任務(wù),用來暫停仿真過程的,將控制權(quán)交還給用戶,用戶在取得控制權(quán)以后可以輸入其它的控制命令或者查看仿真結(jié)果等,之后可以從暫停的地方恢復(fù)仿真過程。$stop有兩種表達形式,帶參數(shù)的和不帶參數(shù)的:

$stop;

$stop(n); //n可以取0、1或2

不帶參數(shù)的$stop等同于$stop(0),在暫停時不輸出任何信息;$stop(1)在暫停時輸出當前仿真時刻和暫停處在程序中的位置;$stop(2)不僅有$stop(1)的作用,還能輸出仿真時占用內(nèi)存大小和CPU時間。

而用于退出仿真過程的系統(tǒng)任務(wù)是$finish,我們在點擊Run(開始運行)的時候,系統(tǒng)會詢問我們是否要結(jié)束仿真,假如我們選"是",這個系統(tǒng)任務(wù)會把ModelSim軟件在完成仿真后關(guān)閉,假如我們選"否",則可以繼續(xù)留在仿真界面。

和一位全加器的真值表進行全部的對比后發(fā)現(xiàn)和該仿真波形完全一致,仿真結(jié)束。

4.2

時序邏輯電路Test Bench的設(shè)計

時序邏輯電路Test Bench的設(shè)計要求和組合邏輯電路基本相同,主要區(qū)別在于時序邏輯電路Test Bench軟件中,需要用always塊語句生成時鐘信號。

例2所編寫的程序,就是在下一講當中的實例,利用這個實例來講解軟件的全部操作流程和使用方法,這一講先來分析這個程序以及和它相配套的Test Bench程序,看看它們是否能夠按照我們設(shè)計期望的那樣輸出仿真結(jié)果。

例2.編寫8位加法器的Test Bench程序

第一個文件,源程序:

modulecounter8(

clk ,

aclr ,

load,

load_din ,

dout

);

// Portdeclarations

input clk;

input aclr;

input load;

input [7:0] load_din;

output [7:0] dout;

//InternalVariables

wire clk;

wire aclr;

wire load;

wire [7:0] load_din;

wire [7:0] dout;

reg [7:0] counter = 0 ;

//CodeStarts Here

always @(posedge clk or negedge aclr)

if(!aclr)

counter <= 0;

else if(load == 1)

counter <= load_din;

else

counter <= counter + 1;

assigndout = counter;

endmodule

第二個文件,Test Bench仿真測試程序:

`timescale1ns/1ns //注意最前面的符號是數(shù)字鍵"1"左邊的那個符號,不是單引號

//test_counter8.v

`timescale1ns/1ns //注意最前面的符號是數(shù)字鍵"1"左邊的那個符號,不是單引號

moduletest_counter8;

reg clk;

reg aclr;

reg load;

reg [7:0] load_din;

wire [7:0] dout;

initial

begin

clk = 0;

aclr = 1;

load = 0;

load_din = 0;

#120 aclr = 0;

#40 aclr = 1;

#20 load = 1;

load_din = 100;

#20 load = 0;

#100 $stop;

end

always#10 clk = ~clk;

counter8U(

.clk(clk),

.aclr(aclr),

.load(load),

.load_din(load_din),

.dout(dout)

);

endmodule

圖4 八位加法器仿真波形圖

現(xiàn)在就對著這個圖,來看看我們編寫的test_counter8.v文件是不是按照我們的設(shè)計要求的那樣來工作的:

01

和組合邏輯的設(shè)計一樣,我們要在test_counter8 .v中例化被測元件counter8,把八位加法器元件嵌入到test_counter8.v這個Test Bench中來。

02

和組合邏輯不同的是,我們要利用always #10 clk = ~clk;這個語句來產(chǎn)生周期為20個時間基準單位(1ns)的時鐘(方波),即就是20ns的時鐘信號。注意:時鐘只能用always塊才能生成,但要在initial塊中賦給時鐘的初始值(如clk=0或clk=1),如果不設(shè)置時鐘初始值,則在仿真的時鐘輸出端是一個未知x(不變,就是例1中的那段紅線了)。

03

在initial塊中生成復(fù)位信號和加載信號,注意:一定要給復(fù)位信號和加載信號賦給初始值,否則和不設(shè)置時鐘初始值一樣會出現(xiàn)問題的。

04

在initial塊的begin語句一開始就設(shè)置相關(guān)的初始值是一個好習慣。

和test_counter8.v進行全部的對比后發(fā)現(xiàn)和該仿真波形完全一致,仿真結(jié)束。

至此,第一講全部內(nèi)容結(jié)束,主要是講了Test Bench程序的編寫方法,下一講我們將介紹ModelSim軟件的使用方法。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1643

    文章

    21950

    瀏覽量

    613739
  • 仿真器
    +關(guān)注

    關(guān)注

    14

    文章

    1033

    瀏覽量

    84900
  • PCB設(shè)計
    +關(guān)注

    關(guān)注

    396

    文章

    4775

    瀏覽量

    89072
  • ModelSim
    +關(guān)注

    關(guān)注

    5

    文章

    174

    瀏覽量

    47897
  • 可制造性設(shè)計
    +關(guān)注

    關(guān)注

    10

    文章

    2065

    瀏覽量

    15972
  • 華秋DFM
    +關(guān)注

    關(guān)注

    20

    文章

    3501

    瀏覽量

    5216

原文標題:ModelSim仿真軟件介紹(一)

文章出處:【微信號:gh_873435264fd4,微信公眾號:FPGA技術(shù)聯(lián)盟】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    FPGA開發(fā):modelsim仿真流程及波形

    對于FPGA開發(fā)而言,仿真是開發(fā)流程中必不可少的一步,也是非常重要的一步,仿真是將RTL代碼模擬運行,得到module中信號波形,再進行功能分析的過程。強大的功能與速度兼具的modelsim
    的頭像 發(fā)表于 09-30 13:52 ?1.1w次閱讀
    FPGA開發(fā):<b class='flag-5'>modelsim</b><b class='flag-5'>仿真</b><b class='flag-5'>流程</b>及波形

    怎樣單獨使用modelsim仿真xilinx呢?

    直接在modelsim軟件內(nèi)執(zhí)行.do文件進行仿真,不通過vivado調(diào)用modelsim,vivado僅用于生成IP核。
    的頭像 發(fā)表于 12-04 18:26 ?2031次閱讀
    怎樣單獨使用<b class='flag-5'>modelsim</b><b class='flag-5'>仿真</b>xilinx呢?

    ModelSim,synplify,ISE后仿真流程

    我把我用到的軟件說明一下。如果你發(fā)現(xiàn)根據(jù)我的操作,你還是解決不了ModelSim仿真的問題,那就可能是軟件版本的問題。
    發(fā)表于 07-22 15:46 ?0次下載

    Altera ModelSim 6.5仿真入門教程

    Altera ModelSim 6.5仿真入門教程,需要的可自行下載。 平臺 軟件ModelSim-Altera 6.5e (Quartus II 10.0) Starter Edi
    發(fā)表于 08-15 15:40 ?256次下載
    Altera <b class='flag-5'>ModelSim</b> 6.5<b class='flag-5'>仿真</b>入門教程

    MODELSIM仿真(適合xilinx ISE)

    基于Xilinx ISE的modelsim仿真教程
    發(fā)表于 11-30 15:52 ?9次下載

    使用 ModelSim 進行設(shè)計仿真詳解

    本章為ModelSim的初級教程,讀者讀完本章可以較為熟練的使用ModelSim進行設(shè)計仿真,本章沒有也不可能涉及ModelSim的各個方面,要想全面的掌握
    發(fā)表于 12-24 18:29 ?0次下載

    Modelsim軟件如何仿真,怎么能添加輸入信號?

     Modelsim是Mentor公司開發(fā)的專業(yè)仿真軟件,支持VHDL、VerilogHDL和混合仿真的全系列流程。作為目前最流行的
    發(fā)表于 11-24 11:54 ?2.8w次閱讀
    <b class='flag-5'>Modelsim</b><b class='flag-5'>軟件</b>如何<b class='flag-5'>仿真</b>,怎么能添加輸入信號?

    modelsim仿真詳細過程(功能仿真與時序仿真

    modelsim仿真詳細過程(功能仿真與時序仿真).ModelSim不僅可以用于數(shù)字電路系統(tǒng)設(shè)計的功能仿
    發(fā)表于 12-19 11:14 ?6.9w次閱讀
    <b class='flag-5'>modelsim</b><b class='flag-5'>仿真</b>詳細過程(功能<b class='flag-5'>仿真</b>與時序<b class='flag-5'>仿真</b>)

    Modelsim仿真教程Modelsim的基礎(chǔ)入門基礎(chǔ)教程免費下載

    筆者一直以來都在糾結(jié),自己是否要為仿真編輯相關(guān)的教程呢?一般而言,Modelsim等價仿真已經(jīng)成為大眾的常識,但是學習仿真是否學習Modelsim
    發(fā)表于 04-30 18:24 ?24次下載
    <b class='flag-5'>Modelsim</b><b class='flag-5'>仿真</b>教程<b class='flag-5'>Modelsim</b>的基礎(chǔ)入門基礎(chǔ)教程免費下載

    基于ModelSim使用二聯(lián)合Quarus自動仿真教程

    3 ModelSim工程實戰(zhàn)之自動仿真說完了 ModelSim 的使用流程,接下來我們將會對每個流程進行詳細的操作演示,一步步、手把手帶領(lǐng)大
    的頭像 發(fā)表于 07-23 10:51 ?2305次閱讀
    基于<b class='flag-5'>ModelSim</b>使用二聯(lián)合Quarus自動<b class='flag-5'>仿真</b>教程

    基于ModelSim使用四ModelSim手動仿真教程

    4.1 新建仿真工程 在開始動手仿真之前,首先,我們需要創(chuàng)建一個文件夾用來放置我們的 ModelSim 仿真工程文件,這里我們就在之前創(chuàng)建的 Quartus 工程目錄下的 simula
    的頭像 發(fā)表于 07-23 11:10 ?4374次閱讀

    如何夾帶modelsim仿真波形白底黑線

    Modelsim使用技巧—波形白底黑線設(shè)置 在發(fā)表期刊或者論文時,我們需要夾帶modelsim仿真波形在我們的論文里,在modelsim默認模式下的波形一般是黑底綠線白字,如圖1所示
    的頭像 發(fā)表于 08-26 11:23 ?4193次閱讀

    ModelSim手動仿真教程

    在開始動手仿真之前,首先,我們需要創(chuàng)建一個文件夾用來放置我們的 ModelSim 仿真工程文件,這里我們就在之前創(chuàng)建的 Quartus 工程目錄下的 simulation 文件夾中創(chuàng)建一個
    的頭像 發(fā)表于 07-11 10:58 ?5521次閱讀

    芯片設(shè)計之Modelsim仿真工具

    Modelsim仿真將設(shè)計以樹狀表示,設(shè)計中的每一個實體,每一個module、每一個進程(always塊、initial塊等)在Modelsim仿真中以對象的形式展現(xiàn)。
    的頭像 發(fā)表于 08-12 15:04 ?2881次閱讀

    Vivado調(diào)用Modelsim仿真

    Modelsim是十分常用的外部仿真工具,在Vivado中也可以調(diào)用Modelsim進行仿真,下面將介紹如何對vivado進行配置并調(diào)用Models
    的頭像 發(fā)表于 07-24 09:04 ?4443次閱讀
    Vivado調(diào)用<b class='flag-5'>Modelsim</b><b class='flag-5'>仿真</b>

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品