一
仿真是指使用設(shè)計(jì)軟件包對(duì)已實(shí)現(xiàn)的設(shè)計(jì)進(jìn)行完整的測(cè)試,并模擬實(shí)際物理環(huán)境下的工作情況。FPGA設(shè)計(jì)驗(yàn)證包括功能仿真、時(shí)序仿真和電路驗(yàn)證,它們分別對(duì)應(yīng)整個(gè)開發(fā)流程的每一個(gè)步驟。
功能仿真是指僅對(duì)邏輯功能進(jìn)行模擬測(cè)試,以了解其實(shí)現(xiàn)的功能是否滿足原設(shè)計(jì)的要求,仿真過程沒有加入時(shí)序信息,不涉及具體器件的硬件特性,如延時(shí)特性等,因此又叫前仿真,它是對(duì)HDL硬件描述語言的功能實(shí)現(xiàn)情況進(jìn)行仿真,以確保HDL語言描述能夠滿足設(shè)計(jì)者的最初意圖。
時(shí)序仿真則是在HDL可以滿足設(shè)計(jì)者功能要求的基礎(chǔ)上,在布局布線后,提取有關(guān)的器件延遲、連線延時(shí)等時(shí)序參數(shù)信息,并在此基礎(chǔ)上進(jìn)行的仿真,也成為后仿真,它是接近于器件真實(shí)運(yùn)行狀態(tài)的一種仿真。
二
仿真軟件ModelSim及其應(yīng)用
HDL的仿真軟件有很多種,如VCS、VSS、NC-Verilog、NC-VHDL、ModelSim等,對(duì)于開發(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è)計(jì)的水平和質(zhì)量。
ModelSim是Model Technology(Mentor Graphics的子公司)的HDL硬件描述語言的仿真軟件,該軟件可以用來實(shí)現(xiàn)對(duì)設(shè)計(jì)的VHDL、Verilog HDL或是兩種語言混合的程序進(jìn)行仿真,同時(shí)也支持IEEE常見的各種硬件描述語言標(biāo)準(zhǔn)。
無論是從使用界面和調(diào)試環(huán)境,還是從仿真速度和效果上看,ModelSim都可以算的上是業(yè)界比較優(yōu)秀的HDL語言仿真軟件。它是唯一的單內(nèi)核支持VHDL和Verilog HDL混合仿真的仿真器,是做FPGA/ASIC設(shè)計(jì)的RTL級(jí)和門級(jí)電路仿真的好選擇,它采用直接優(yōu)化的編譯技術(shù),Tcl/Tk技術(shù)和單一內(nèi)核仿真技術(shù),具有仿真速度快,編譯的代碼與仿真平臺(tái)無關(guān),便于IP核的保護(hù)和加快錯(cuò)誤程序定位等優(yōu)點(diǎn)。
ModelSim分幾種不同的版本:ModelSim SE、ModelSim PE、ModelSim LE和ModelSim OEM,其中的SE、PE、LE是其最高版本,編譯速度是所有版本中最快的,而OEM版本就是集成在FPGA廠家設(shè)計(jì)工具中的版本,它們專門和某個(gè)廠家的FPGA配套來使用,如后面使用到的ModelSim AE就是專門針對(duì)Altera公司QuartusII的配套的OEM產(chǎn)品。
三
ModelSim的仿真流程
ModelSim不僅可以用于數(shù)字電路系統(tǒng)設(shè)計(jì)的功能仿真,還可以應(yīng)用于數(shù)字電路系統(tǒng)設(shè)計(jì)的時(shí)序仿真。ModelSim的使用中,最基本的步驟包括創(chuàng)建工程、編寫源代碼、編譯、啟動(dòng)仿真器和運(yùn)行仿真五個(gè)步驟,仿真流程如圖1所示:
圖1 ModelSim仿真的基本流程(基于工程的)
這個(gè)是基于工程的流程,還有一種是基于庫文件的,和基于工程的相比,它需要自己創(chuàng)建工作庫,另外關(guān)閉ModelSim軟件后,下次還得自己手動(dòng)打開設(shè)計(jì)文件,而基于工程的就不會(huì)這樣,工程是一直保持的狀態(tài),不用每次啟動(dòng)軟件后再手工加載,除非我們自己關(guān)掉這個(gè)工程。
四
仿真測(cè)試文件程序的設(shè)計(jì)方法
隨著設(shè)計(jì)量和復(fù)雜度的不斷增加,數(shù)字驗(yàn)證變得越來越難,所消耗的成本也越來越高,面對(duì)這種挑戰(zhàn),驗(yàn)證工程師必須依靠相應(yīng)的驗(yàn)證工具和方法。對(duì)于大型的設(shè)計(jì),比如上百萬門的設(shè)計(jì)驗(yàn)證,工程師必須使用一整套規(guī)范的驗(yàn)證工具,而對(duì)于較小的設(shè)計(jì),使用具有HDL Test Bench的仿真器是一個(gè)不錯(cuò)的選擇。
一般來說,Test Bench使用工業(yè)標(biāo)準(zhǔn)VHDL或者Verilog HDL語言來描述,簡單的Test Bench通過調(diào)用用戶設(shè)計(jì)的功能模塊,然后進(jìn)行仿真,較為復(fù)雜的Test Bench還包括一些其他的功能,比如包含特定的激勵(lì)向量或者進(jìn)行實(shí)際輸出與期望的比較等。
在開始寫Test Bench之前,很重要的一點(diǎn)就是要設(shè)計(jì)實(shí)例化DUT(Design Under Test,即就是被測(cè)元件),還要詳細(xì)了解整個(gè)的測(cè)試計(jì)劃和測(cè)試案例。整個(gè)的測(cè)試Test Bench環(huán)境如圖2所示:
圖2 Test Bench的測(cè)試環(huán)境
從圖中可以看見,Test Bench和被測(cè)對(duì)象Counter構(gòu)成了一個(gè)封閉的循環(huán),Test Bench負(fù)責(zé)向被測(cè)元器件的輸入端口提供激勵(lì)(時(shí)鐘)和一些控制信號(hào)(復(fù)位和置位信號(hào)),另外Test Bench還監(jiān)測(cè)被測(cè)元器件的輸出端口所輸出的信號(hào)值是否和我們的設(shè)計(jì)預(yù)期相符,并把監(jiān)測(cè)的情況顯示給我們。
由于Test Bench程序和被測(cè)對(duì)象構(gòu)成了一個(gè)封閉的循環(huán),因此Test Bench的輸入端口需要與被測(cè)對(duì)象的輸出端口連接,Test Bench的輸出端口則要與被測(cè)對(duì)象的輸入端口相連接。所以在端口的定義上,Test Bench程序需要和被測(cè)對(duì)象相對(duì)應(yīng)。
被測(cè)元器件是一個(gè)已經(jīng)設(shè)計(jì)好的電路或系統(tǒng),Test Bench是用元件例化語句將其嵌入程序中。VerilogHDL測(cè)試平臺(tái)是一個(gè)設(shè)有輸入輸出端口的設(shè)計(jì)模塊,被測(cè)元器件的輸入端定義為reg(寄存器)型變量,在always塊或initial塊中賦值(產(chǎn)生測(cè)試條件),被測(cè)元器件的輸出端定義為wire(線網(wǎng))型變量,產(chǎn)生相應(yīng)輸入變化的輸出結(jié)果(波形)。
4.1
組合邏輯電路Test Bench的設(shè)計(jì)
組合邏輯的設(shè)計(jì)驗(yàn)證,主要就是檢查設(shè)計(jì)結(jié)果是不是符合該電路的真值表功能,因此在編寫組合邏輯Test Bench時(shí),用initial塊把被測(cè)電路的輸入按照真值表提供的數(shù)據(jù)變化作為測(cè)試條件,就能實(shí)現(xiàn)Test Bench的設(shè)計(jì)。
例1.編寫一位全加器的Test Bench程序
全加器的A和B兩個(gè)是1位二進(jìn)制加數(shù)的輸入端,CI是低位來的進(jìn)位輸入端,CO是向高位進(jìn)位的輸出端,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平臺(tái),仿真上面的程序。這一講先暫時(shí)不講仿真測(cè)試的方法,留到下一講再來詳述,這一講主要講述的內(nèi)容是Test Bench程序的編寫方法,故現(xiàn)在僅僅給出仿真的波形圖,全加器的仿真波形如圖3所示:
圖3一位全加器的仿真波形圖
現(xiàn)在對(duì)著這個(gè)圖,我們返回來再來看看我們編寫的test_adder1.v這個(gè)Test Bench程序究竟完成了哪些工作,是不是按照我們的要求來工作的:
01
首先看程序第二行的`timescale1ns/1ns這句代碼,這個(gè)是時(shí)間尺度指令,它是用來定義模塊的仿真時(shí)間單位和時(shí)間精度的,其使用格式為:`timescale仿真時(shí)間單位/時(shí)間精度,用于說明仿真時(shí)間單位和時(shí)間精度的數(shù)字只能是1、10或100,不能為其它的數(shù)字,單位可以是s、ms、us、ns、ps和fs。仿真時(shí)間單位是指的模塊仿真時(shí)間和延時(shí)的基準(zhǔn)單位,也就是說只有定義了仿真時(shí)間單位,程序中的延時(shí)符號(hào)"#"才有意義,如程序中的一行#20 a = 0; b = 0; c = 0;前面的#20就是延時(shí)20個(gè)時(shí)間基準(zhǔn)單位,按照程序中的1ns這個(gè)基準(zhǔn),就延時(shí)了20個(gè)ns。需要說明的是該行程序的下一行#20 a =0; b = 0; c = 1;前面的延時(shí)20個(gè)ns是相對(duì)于前一個(gè)的延時(shí)來說的,也就是第二行在第一行完了之后延時(shí)20ns執(zhí)行。這時(shí)候再看看仿真的波形圖就不難理解最開始的線為什么是紅色而不是正常的綠色的原因了,因?yàn)槲覀冊(cè)诔绦蛑衎egin的下一行就是#20 a =0; b = 0; c = 0;它前面的延時(shí)20個(gè)ns是相對(duì)于begin的延時(shí),也就是說程序開始的時(shí)候是什么都不做的,輸出為不確定的值,過了20個(gè)ns才將全0賦給了a、b和ci,這個(gè)時(shí)候才是最開始的綠線的部分。
02
在Test Bench程序中,把全加器的輸入a、b和ci定義為了reg型變量,把輸出so和co定義為了wire型變量,這個(gè)和被測(cè)元件的定義情況剛好是反的,這樣也說明了TestBench程序和被測(cè)元件是封閉的一個(gè)循環(huán)。用元件例化語句adder1U( .a(a), .b(b), .ci(ci), .so(so), .co(co) ) ;把全加器設(shè)計(jì)電路嵌入到Test Bench程序中。
03
程序的后面有一句#200 $stop;這個(gè)是一個(gè)系統(tǒng)任務(wù),用來暫停仿真過程的,將控制權(quán)交還給用戶,用戶在取得控制權(quán)以后可以輸入其它的控制命令或者查看仿真結(jié)果等,之后可以從暫停的地方恢復(fù)仿真過程。$stop有兩種表達(dá)形式,帶參數(shù)的和不帶參數(shù)的:
$stop;
$stop(n); //n可以取0、1或2
不帶參數(shù)的$stop等同于$stop(0),在暫停時(shí)不輸出任何信息;$stop(1)在暫停時(shí)輸出當(dāng)前仿真時(shí)刻和暫停處在程序中的位置;$stop(2)不僅有$stop(1)的作用,還能輸出仿真時(shí)占用內(nèi)存大小和CPU時(shí)間。
而用于退出仿真過程的系統(tǒng)任務(wù)是$finish,我們?cè)邳c(diǎn)擊Run(開始運(yùn)行)的時(shí)候,系統(tǒng)會(huì)詢問我們是否要結(jié)束仿真,假如我們選"是",這個(gè)系統(tǒng)任務(wù)會(huì)把ModelSim軟件在完成仿真后關(guān)閉,假如我們選"否",則可以繼續(xù)留在仿真界面。
和一位全加器的真值表進(jìn)行全部的對(duì)比后發(fā)現(xiàn)和該仿真波形完全一致,仿真結(jié)束。
4.2
時(shí)序邏輯電路Test Bench的設(shè)計(jì)
時(shí)序邏輯電路Test Bench的設(shè)計(jì)要求和組合邏輯電路基本相同,主要區(qū)別在于時(shí)序邏輯電路Test Bench軟件中,需要用always塊語句生成時(shí)鐘信號(hào)。
例2所編寫的程序,就是在下一講當(dāng)中的實(shí)例,利用這個(gè)實(shí)例來講解軟件的全部操作流程和使用方法,這一講先來分析這個(gè)程序以及和它相配套的Test Bench程序,看看它們是否能夠按照我們?cè)O(shè)計(jì)期望的那樣輸出仿真結(jié)果。
例2.編寫8位加法器的Test Bench程序
第一個(gè)文件,源程序:
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
第二個(gè)文件,Test Bench仿真測(cè)試程序:
`timescale1ns/1ns //注意最前面的符號(hào)是數(shù)字鍵"1"左邊的那個(gè)符號(hào),不是單引號(hào)
//test_counter8.v
`timescale1ns/1ns //注意最前面的符號(hào)是數(shù)字鍵"1"左邊的那個(gè)符號(hào),不是單引號(hào)
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)在就對(duì)著這個(gè)圖,來看看我們編寫的test_counter8.v文件是不是按照我們的設(shè)計(jì)要求的那樣來工作的:
01
和組合邏輯的設(shè)計(jì)一樣,我們要在test_counter8 .v中例化被測(cè)元件counter8,把八位加法器元件嵌入到test_counter8.v這個(gè)Test Bench中來。
02
和組合邏輯不同的是,我們要利用always #10 clk = ~clk;這個(gè)語句來產(chǎn)生周期為20個(gè)時(shí)間基準(zhǔn)單位(1ns)的時(shí)鐘(方波),即就是20ns的時(shí)鐘信號(hào)。注意:時(shí)鐘只能用always塊才能生成,但要在initial塊中賦給時(shí)鐘的初始值(如clk=0或clk=1),如果不設(shè)置時(shí)鐘初始值,則在仿真的時(shí)鐘輸出端是一個(gè)未知x(不變,就是例1中的那段紅線了)。
03
在initial塊中生成復(fù)位信號(hào)和加載信號(hào),注意:一定要給復(fù)位信號(hào)和加載信號(hào)賦給初始值,否則和不設(shè)置時(shí)鐘初始值一樣會(huì)出現(xiàn)問題的。
04
在initial塊的begin語句一開始就設(shè)置相關(guān)的初始值是一個(gè)好習(xí)慣。
和test_counter8.v進(jìn)行全部的對(duì)比后發(fā)現(xiàn)和該仿真波形完全一致,仿真結(jié)束。
至此,第一講全部內(nèi)容結(jié)束,主要是講了Test Bench程序的編寫方法,下一講我們將介紹ModelSim軟件的使用方法。
-
FPGA
+關(guān)注
關(guān)注
1643文章
21956瀏覽量
614006 -
仿真器
+關(guān)注
關(guān)注
14文章
1033瀏覽量
84939 -
PCB設(shè)計(jì)
+關(guān)注
關(guān)注
396文章
4775瀏覽量
89170 -
ModelSim
+關(guān)注
關(guān)注
5文章
174瀏覽量
47916 -
可制造性設(shè)計(jì)
+關(guān)注
關(guān)注
10文章
2065瀏覽量
15982 -
華秋DFM
+關(guān)注
關(guān)注
20文章
3501瀏覽量
5236
原文標(biāo)題:ModelSim仿真軟件介紹(一)
文章出處:【微信號(hào):gh_873435264fd4,微信公眾號(hào):FPGA技術(shù)聯(lián)盟】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
FPGA開發(fā):modelsim仿真流程及波形

怎樣單獨(dú)使用modelsim仿真xilinx呢?

ModelSim,synplify,ISE后仿真流程
Altera ModelSim 6.5仿真入門教程

使用 ModelSim 進(jìn)行設(shè)計(jì)仿真詳解
Modelsim軟件如何仿真,怎么能添加輸入信號(hào)?

modelsim仿真詳細(xì)過程(功能仿真與時(shí)序仿真)

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

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

基于ModelSim使用四ModelSim手動(dòng)仿真教程
如何夾帶modelsim的仿真波形白底黑線
ModelSim手動(dòng)仿真教程
芯片設(shè)計(jì)之Modelsim仿真工具
Vivado調(diào)用Modelsim仿真

評(píng)論