編寫這個教程以前,爲了讓不一樣水平階段的人都能閱讀,我儘可能作到了零基礎入門這個目標,全部的操做步驟都通過縝密的思考,作到了詳細再詳細的程度。async
若是您是FPGA開發方面的初學者,那麼這個教程必定可以幫助你在仿真技術上越過新人的臺階;若是您是FPGA開發的老手,這篇文檔也並不是對您沒有幫助,您能夠把教程發給其餘剛入門的同事,免去您親自上陣指導的麻煩,把主要的精力放在更有價值的地方。工具
1、FPGA設計仿真驗證簡介佈局
嚴格來說,FPGA設計驗證包括功能仿真、時序仿真和電路驗證,它們分別對應整個開發流程的每個步驟。仿真是指使用設計軟件包對已實現的設計進行完整的測試,並模擬實際物理環境下的工做狀況。學習
功能仿真是指僅對邏輯功能進行模擬測試,以瞭解其實現的功能是否知足原設計的要求,仿真過程沒有加入時序信息,不涉及具體器件的硬件特性,如延時特性等,所以又叫前仿真,它是對HDL硬件描述語言的功能實現狀況進行仿真,以確保HDL語言描述可以知足設計者的最初意圖。測試
時序仿真則是在HDL能夠知足設計者功能要求的基礎上,在佈局佈線後,提取有關的器件延遲、連線延時等時序參數信息,並在此基礎上進行的仿真,也成爲後仿真,它是接近於器件真實運行狀態的一種仿真。優化
2、仿真軟件ModelSim及其應用動畫
HDL的仿真軟件有不少種,如VCS、VSS、NC-Verilog、NC-VHDL、ModelSim等,對於開發FPGA來講,通常是使用FPGA廠家提供的集成開發環境,他們都有本身的仿真器,如Xilinx公司的ISE,Altera公司的Quartus II等,可是這些廠家開發的仿真器的仿真功能每每比不上專業的EDA公司的仿真工具,如ModelSim AE(Altera Edition)、ModelSim XE(Xilinx Edition)等。Quartus II設有第三方仿真工具的接口,能夠直接調用其餘EDA公司的仿真工具,這極大地提升了EDA設計的水平和質量。atom
ModelSim是Model Technology(Mentor Graphics的子公司)的HDL硬件描述語言的仿真軟件,該軟件能夠用來實現對設計的VHDL、Verilog HDL 或是兩種語言混合的程序進行仿真,同時也支持IEEE常見的各類硬件描述語言標準。spa
不管是從使用界面和調試環境,仍是從仿真速度和效果上看,ModelSim均可以算的上是業界比較優秀的HDL語言仿真軟件。它是惟一的單內核支持VHDL和Verilog HDL混合仿真的仿真器,是作FPGA/ASIC設計的RTL級和門級電路仿真的好選擇,它採用直接優化的編譯技術,Tcl/Tk技術和單一內核仿真技術,具備仿真速度快,編譯的代碼與仿真平臺無關,便於IP核的保護和加快錯誤程序定位等優勢。設計
ModelSim分幾種不一樣的版本:ModelSim SE、ModelSim PE、ModelSim LE和ModelSim OEM,其中的SE、PE、LE是其最高版本,編譯速度是全部版本中最快的,而OEM版本就是集成在FPGA廠家設計工具中的版本,它們專門和某個廠家的FPGA配套來使用,如後面使用到的ModelSim AE就是專門針對Altera公司QuartusII的配套的OEM產品。
3、ModelSim的仿真流程
ModelSim不只能夠用於數字電路系統設計的功能仿真,還能夠應用於數字電路系統設計的時序仿真。 ModelSim的使用中,最基本的步驟包括建立工程、編寫源代碼、編譯、啓動仿真器和運行仿真五個步驟,仿真流程如圖1所示:
圖1 ModelSim仿真的基本流程(基於工程的)
這個是基於工程的流程,還有一種是基於庫文件的,和基於工程的相比,它須要本身建立工做庫,另外關閉ModelSim軟件後,下次還得本身手動打開設計文件,而基於工程的就不會這樣,工程是一直保持的狀態,不用每次啓動軟件後再手工加載,除非咱們本身關掉這個工程。還有另外兩個流程,這裏不提了,詳細內容可參看ModelSim AlteraTutorial.PDF 。在軟件的安裝目錄的DOCS文件夾內是所有的參考文檔,包括使用手冊等。
4、仿真測試文件(Test Bench)程序的設計方法
隨着設計量和複雜度的不斷增長,數字驗證變得愈來愈難,所消耗的成本也愈來愈高,面對這種挑戰,驗證工程師必須依靠相應的驗證工具和方法。對於大型的設計,好比上百萬門的設計驗證,工程師必須使用一整套規範的驗證工具,而對於較小的設計,使用具備HDL Test Bench的仿真器是一個不錯的選擇。
通常來講,Test Bench使用工業標準VHDL或者Verilog HDL語言來描述,簡單的Test Bench經過調用用戶設計的功能模塊,而後進行仿真,較爲複雜的Test Bench還包括一些其餘的功能,好比包含特定的激勵向量或者進行實際輸出與指望的比較等。
在開始寫Test Bench以前,很重要的一點就是要設計實例化DUT(Design Under Test,即就是被測元件),還要詳細瞭解整個的測試計劃和測試案例。整個的測試Test Bench環境如圖2所示:
圖2 Test Bench的測試環境
從圖中能夠看見,Test Bench和被測對象Counter構成了一個封閉的循環,Test Bench負責向被測元器件的輸入端口提供激勵(時鐘)和一些控制信號(復位和置位信號),另外Test Bench還監測被測元器件的輸出端口所輸出的信號值是否和咱們的設計預期相符,並把監測的狀況顯示給咱們。
因爲Test Bench程序和被測對象構成了一個封閉的循環,所以Test Bench的輸入端口須要與被測對象的輸出端口鏈接,Test Bench的輸出端口則要與被測對象的輸入端口相鏈接。因此在端口的定義上,Test Bench程序須要和被測對象相對應。
被測元器件是一個已經設計好的電路或系統,Test Bench是用元件例化語句將其嵌入程序中。VerilogHDL測試平臺是一個設有輸入輸出端口的設計模塊,被測元器件的輸入端定義爲reg(寄存器)型變量,在always塊或initial塊中賦值(產生測試條件),被測元器件的輸出端定義爲wire(線網)型變量,產生相應輸入變化的輸出結果(波形)。
4.1 組合邏輯電路Test Bench的設計
組合邏輯的設計驗證,主要就是檢查設計結果是否是符合該電路的真值表功能,所以在編寫組合邏輯Test Bench時,用initial塊把被測電路的輸入按照真值表提供的數據變化做爲測試條件,就能實現Test Bench的設計。
例1. 編寫一位全加器的Test Bench程序
全加器的A和B兩個是1位二進制加數的輸入端,CI是低位來的進位輸入端,CO是向高位進位的輸出端,SO是全加器的本位和值。
用Verilog HDL語言編寫的全加器程序adder.v以下:
//-----------------------------------------------------
// DesignName : adder1
// FileName : adder1.v
//Function : 1 bit full adder
//Coder : Cheng xu
//-----------------------------------------------------
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
根據全加器的真值表寫的全加器的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平臺,仿真上面的程序。這一講先暫時不講仿真測試的方法,留到下一講再來詳述,這一講主要講述的內容是Test Bench程序的編寫方法,故如今僅僅給出仿真的波形圖,全加器的仿真波形如圖3所示:
圖3 一位全加器的仿真波形圖
如今對着這個圖,咱們返回來再來看看咱們編寫的test_adder1.v這個Test Bench程序究竟完成了哪些工做,是否是按照咱們的要求來工做的:
①首先看程序第二行的`timescale1ns/1ns這句代碼,這個是時間尺度指令,它是用來定義模塊的仿真時間單位和時間精度的,其使用格式爲:`timescale 仿真時間單位/時間精度,用於說明仿真時間單位和時間精度的數字只能是1、10或100,不能爲其它的數字,單位能夠是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執行。這時候再看看仿真的波形圖就不難理解最開始的線爲何是紅色而不是正常的綠色的緣由了,由於咱們在程序中begin的下一行就是 #20 a =0; b = 0; c = 0; 它前面的延時20個ns是相對於begin的延時,也就是說程序開始的時候是什麼都不作的,輸出爲不肯定的值,過了20個ns纔將全0賦給了a、b和ci,這個時候纔是最開始的綠線的部分。
②在Test Bench程序中,把全加器的輸入a、b和ci定義爲了reg型變量,把輸出so和co定義爲了wire型變量,這個和被測元件的定義狀況恰好是反的,這樣也說明了TestBench程序和被測元件是封閉的一個循環。用元件例化語句adder1U( .a(a), .b(b), .ci(ci), .so(so), .co(co) ) ; 把全加器設計電路嵌入到Test Bench程序中。
③程序的後面有一句 #200 $stop; 這個是一個系統任務,用來暫停仿真過程的,將控制權交還給用戶,用戶在取得控制權之後能夠輸入其它的控制命令或者查看仿真結果等,以後能夠從暫停的地方恢復仿真過程。$stop有兩種表達形式,帶參數的和不帶參數的:
$stop;
$stop(n); //n能夠取0、1或2
不帶參數的$stop等同於$stop(0),在暫停時不輸出任何信息;$stop(1)在暫停時輸出當前仿真時刻和暫停處在程序中的位置;$stop(2)不只有$stop(1)的做用,還能輸出仿真時佔用內存大小和CPU時間。
而用於退出仿真過程的系統任務是 $finish,咱們在點擊Run(開始運行)的時候,系統會詢問咱們是否要結束仿真,假如咱們選"是",這個系統任務會把ModelSim軟件在完成仿真後關閉,假如咱們選"否",則能夠繼續留在仿真界面。
和一位全加器的真值表進行所有的對比後發現和該仿真波形徹底一致,仿真結束。
4.2 時序邏輯電路Test Bench的設計
時序邏輯電路Test Bench的設計要求和組合邏輯電路基本相同,主要區別在於時序邏輯電路Test Bench軟件中,須要用always塊語句生成時鐘信號。
例2所編寫的程序,就是在下一講當中的實例,利用這個實例來說解軟件的所有操做流程和使用方法,這一講先來分析這個程序以及和它相配套的Test Bench程序,看看它們是否可以按照咱們設計指望的那樣輸出仿真結果。
例2. 編寫8位加法器的Test Bench程序
第一個文件,源程序:
//-----------------------------------------------------
// DesignName : counter8
// FileName : counter8.v
//Function : 8 bits counter with asyncclear and sync load
//Coder : Cheng xu
//-----------------------------------------------------
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仿真測試程序:
//test_counter8.v
`timescale1ns/1ns //注意最前面的符號是數字鍵"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 八位加法器仿真波形圖
如今就對着這個圖,來看看咱們編寫的test_counter8.v文件是否是按照咱們的設計要求的那樣來工做的:
①和組合邏輯的設計同樣,咱們要在test_counter8.v中例化被測元件counter8,把八位加法器元件嵌入到test_counter8.v這個Test Bench中來。
②和組合邏輯不一樣的是,咱們要利用always #10 clk = ~clk; 這個語句來產生週期爲20個時間基準單位(1ns)的時鐘(方波),即就是20ns的時鐘信號。注意:時鐘只能用always塊才能生成,但要在initial塊中賦給時鐘的初始值(如clk=0或clk=1),若是不設置時鐘初始值,則在仿真的時鐘輸出端是一個未知x(不變,就是例1中的那段紅線了)。
③在initial塊中生成復位信號和加載信號,注意:必定要給復位信號和加載信號賦給初始值,不然和不設置時鐘初始值同樣會出現問題的。
④在initial塊的begin語句一開始就設置相關的初始值是一個好習慣。
和test_counter8.v進行所有的對比後發現和該仿真波形徹底一致,仿真結束。
至此,第一講所有內容結束,主要是講了Test Bench程序的編寫方法,下一講咱們將介紹ModelSim軟件的使用方法。
本實驗的目的就是在ModelSim環境下學習掌握該軟件的通常仿真測試流程和仿真測試方法,另外學習編寫簡單的Test Bench程序並在ModelSim下進行調試。
實驗步驟以下:
1. 打開ModelSim軟件,如圖1所示:
圖1 打開軟件
2. 軟件的啓動畫面如圖2所示,進入界面後如圖3所示:
圖2 軟件的啓動畫面
圖3 軟件進入後的畫面
注意:若是是第一次使用軟件,進入後會有一些諸如軟件的歡迎畫面等不相關的對話框,無須擔憂,直接關閉便可,亦可選擇下次登錄時不顯示。
3. 進入ModelSim主窗口後,選擇File菜單下的"New→Project",新建一個工程,在彈出的對話框中,給該工程命名並指定一個存放的路徑,如圖4所示:
圖4 新建工程
在這裏,工程名和你的頂層文件名保持一致是推薦的作法。路徑的注意事項已經說過,這裏再也不說起。默認的庫名就是"work",這個無需更改,點擊"OK"便可。
4. 以後會彈出如圖5的對話框,選擇是新建一個文件仍是添加已存在的文件,這兩個均可以選擇,假如事先編好了文件,就選擇添加進來,假如沒有就新建。在這裏使用添加已有文件,在軟件開始以前就編好所用的程序,這樣比較方便些。軟件自帶的編輯環境不是很好,使用第三方的編輯工具是推薦的方法。建議使用UltraEdit或Notepad++這些專業的代碼編輯軟件。
UltraEdit偏重於功能的強大和豐富的用戶可定製化特性,而Notepad++更加註重易用性。二者在普通功能上差別不是特別大,根據本身的喜愛選擇一款便可。
圖5 給工程中添加文件
在路徑G:\FPGA_Project\ModelSim\counter8下新建兩個文件,一個是counter8.v,一個是test_counter8.v,前者是咱們的原始的設計文件,後者是其相應的仿真測試文件。在這個路徑的Windows目錄下,在空白處右鍵選擇新建一個文本文檔.TXT格式,而後在這個文件上右鍵選擇UltraEdit或Edit with Notepad++就能夠啓動相應的代碼編輯工具進行編輯了,保存的時候注意存成".v"或".vhd"格式便可。
如下給出兩個文件的代碼:
第一個文件:
//-----------------------------------------------------
// DesignName : counter8
// FileName : counter8.v
//Function : 8 bits counter with asyncclear and sync load
//Coder : Cheng xu
//-----------------------------------------------------
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_counter8.v
`timescale1ns/1ns //注意最前面的符號是數字鍵"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個步驟開始的時候再進行。
5. 把剛纔新建的文件添加到工程中去,點擊"AddExisting Flie"後出現以下畫面,如圖6所示:
圖6 添加原始的待測試程序文件
點擊"OK"後,繼續添加另一個測試文件,如圖7所示:
圖7 添加仿真測試文件
以後點"OK",再關閉"Add items to the Project"這個對話框。最簡單的辦法是一次同時添加兩個文件,點擊"Browse"以後,鼠標直接框選這兩個文件,這樣能夠一次添加多個文件到ModelSim工程中。
6. 咱們在軟件的Project區域已經能看到咱們添加的這兩個文件了,如圖8所示:
圖8 Project區域狀態
咱們下面就能夠編譯這兩個文件了,這時候由於尚未編譯文件,因此Status一欄顯示的是兩個問號。接着在這個Project區域單擊鼠標右鍵,選擇"Compile→Compile All",把HDL源文件編譯到當前工程的工做庫當中去。如圖9所示:
圖9 編譯源文件和仿真測試文件
咱們在軟件下方的Transcript區域中假如看到如圖10的字樣,就說明編譯經過了:
圖10 編譯成功畫面
注意中間的兩個successful說明成功了。另外,咱們在Project區域中的Status一欄中可以看見兩個綠色的勾,這也是一種編譯成功的提示。
7. 編譯經過以後,在Project區域鼠標右鍵點擊"Add to Project → Simulation Configuration",如圖11所示:
圖11 添加Simulation Configuration
在出現的Add SimulationConfiguration對話框的右下角打開OptimizationOptions,打開後切換到Options選項卡頁面,在Optimization Level中選擇Disable Optimizations,如圖12所示:
圖12 關閉優化選項
點擊OK肯定以後返回Add Simulation Configuration對話框,在Optimization欄中關閉Enable Optimization,再展開work目錄,選中Test Bench文件test_counter8,以後save保存。如圖13所示:
圖13 關閉優化選項
此時會在Project區域出現一個仿真配置文件:Simulation 1,雙擊它就能進入仿真了,在重啓ModelSim以後,還能夠雙擊它進入仿真,比較方便。
注意:若是不關閉優化選項的話,有時候ModelSim軟件會報錯致使不能正常進行仿真。
8. 雙擊"Simulation 1"後進入仿真波形界面,在Object區域鼠標右鍵選擇"Add → To Wave → Signals inRegion",把待仿真的信號添加入Wave窗口。如圖14所示:
圖14 待仿真的信號添加入Wave窗口
9. 接着咱們把wave窗口中的兩個信號量改爲無符號數顯示,方便咱們觀察,在load_din和dout上依次單擊鼠標右鍵,按照圖15的方法修改便可:
正如前面第二講所述,時序仿真在實際應用中使用的並很少,可是爲了保持仿真系列文檔的完整性,咱們仍是把仿真的方法寫出來。
時序仿真就要比第二講的功能仿真步驟上要多一些,本講以目前的QuartusII的12.0SP2版本和Cyclone IV的EP4CE6F17C8爲例,講解下時序仿真的方法和步驟。
時序仿真須要的文件總共有如下幾種:
①綜合後生成的網表文件" * .vo "(假如在Setting裏面設置裏輸出語言爲VHDL的話,則生成的網表文件爲" * .vho")
②綜合後生成的具備工程延時信息的文件" * .sdo "(VHDL語言亦爲此)
③ Test Bench程序文件
④ Altera的元器件庫
大體的過程就是先在Quartus II中生成網表文件和時延文件,而後調用ModelSim進行仿真,具體的時序仿真步驟以下:
1. 打開Quartus II軟件,新建工程,再新建文件counter8.v,把上一講中的counter8.v這個源文件複製到Quartus II的工程目錄中,並添加該文件到工程中。接着,選擇"Settings"→"EDA Tool Settings",選擇左欄的"Simulation",設置狀況如圖1所示。
第一欄的"Tool name"選擇ModelSim-Altera
第二欄的"Format for output netlist"選擇本身熟悉的語言,VHDL或Verilog均可以,後面的"output directory"是選擇輸出的網表文件和延時信息文件的存放路徑,通常選擇默認便可,這樣的話,未來編譯成功後,會在Quartus II的工程文件夾(本例爲counter8這個文件夾)下面生成一個simulation/modelsim的文件夾,裏面存有未來要用到的.vo和.sdo這兩個文件。
再往下,看到有"More EDA Netlist WritterSettings…"按鈕,點擊後進入設置畫面,設置狀況如圖2所示。注意的地方就是Generatenetlist for functional simulation這一項後面是處於OFF的關閉狀態,這樣才能生成咱們所要的時序仿真文件。
圖1 simulation的設置
圖2 More EDA Netlist WritterSettings的設置
都設置好了之後,所有點擊"OK"後退出設置,在QII的編譯環境下執行全編譯。編譯中的狀況如圖3所示:
圖3 編譯中的狀況
注意:下面比咱們平時進行的全編譯時多了一項"EDANetlist Writer",圖3的紅色箭頭指向的位置。
2. 找到新建工程目錄所在的文件夾,在裏面找到simulation/modelsim這個文件夾,會發現文件夾內有10個文件,如圖4所示:
圖4 生成的10個文件
注意:counter8.vo和counter8_v.sdo就是時序仿真須要的兩個重要的網表文件,它們與counter8_8_1200mv_85c_slow.vo和counter8_8_1200mv_85c_v_slow.sdo只是命名不一樣而已,文件的內容實際上是同樣的。後兩個是QuartusII目前新的網表文件的命名方法,文件名標示出了速度等級(-8)、內核電壓(1200mv)、溫度條件(85℃)以及時序模型(slow)。
之因此Altera尚未取消舊的命名文件方法並讓QuartusII繼續生成這兩個網表文件,是由於有TclScript文件是按照舊的命名方法寫的,須要兼容它們。
如下時序仿真以counter8.vo和counter8_v.sdo爲例,若是須要用fast時序模型作仿真,也是按照下面的方法進行,只是把vo和sdo文件換爲fast。
另外".xrf"和".sft"這兩個文件,是QuartusII編譯生成的一些相關的信息文件,時序仿真用不到。
3. 打開ModelSim軟件,新建一個工程,如圖5所示:
圖5 新建工程並指定路徑
①接着把剛纔生成的counter8.vo和counter8_v.sdo兩個文件拷貝到如今個仿真工程的目錄下面。
②以後還要拷貝一個很重要的文件,到QuartusII的安裝目錄下: \quartus\eda\sim_lib,找到cycloneive_atoms.v這個文件,這個是Altera器件庫的庫文件,進行時序仿真就是基於這個庫文件的,把它也拷貝到仿真工程目錄。
注意:咱們是以Cyclone IV的EP4CE6F17C8爲例的,因此這裏須要複製的就是cycloneive這個庫文件,若是是其它器件的話,須要再對應選擇。
③把test_counter8.v文件拷貝到這個仿真工程目錄下面。
④在QII安裝目錄的..altera\12.0\quartus\eda\fv_lib\verilog,把這裏面的dffeas.v和dffep.v文件拷貝到這個仿真工程目錄下面。
4. 進行完上面的步驟後,返回到ModelSim這個軟件界面,會發現軟件還停留在剛纔新建工程,須要咱們爲其工程添加文件的對話框,那咱們就添加文件,把"counter8.vo"、"cycloneive_atoms.v"、"test_counter8.v"、"dffeas.v"和"dffep.v"這5個文件添加進去,如圖6所示:
圖6 添加的5個文件
注意:此時不須要添加counter8.v這個文件了,.vo文件能夠替代它。
5. 以後關閉添加文件對話框,能夠看見Project區域有了咱們添加的5個文件了,在該區域點右鍵,"Compile"→"Compile All"執行所有編譯。
6. 在Project區域點右鍵,"Add to Project"→"Simulation Configuration"添加一個仿真配置的設置,這時會直接彈出添加仿真配置對話框,這裏,咱們要進行以下的設置:
①在"Design"選項卡下展開work前面的"+"號後點選test_counter8,這個就是Test Bench文件。如圖7所示:
圖7 Design選項卡的設置
②再切換到"SDF"選項卡,點擊"Add"添加".sdo"文件,點擊瀏覽後會直接出現這個".sdo"文件的,選擇便可,在下面的"Apply to Region"內輸入"U",這個就是咱們的Test Bench程序中例化頂層文件的例化名字。如圖8所示:
圖8 SDF選項卡的設置
接着把下面的兩個SDF選項的複選框都選中。如圖9所示:
圖9 選中SDF選項的兩個複選框
點擊"OK"退出配置設置界面。配置好了之後的Project區域的內容如圖10所示:
圖10 Project區域的內容
7. 雙擊Simulation執行仿真,後面的步驟和功能仿真同樣的了,再也不贅述。仿真的波形圖如圖11所示:
圖11 時序仿真的波形圖
從圖11中能夠看到dout相對於主時鐘clk有明顯的延時,這個延時大小與當前使用的器件的時序模型有關。
在具體實踐過程當中,可能還會遇到各類各樣的問題,ModelSim正常運行也依賴於仿真庫文件的齊備,因此碰到某些工程在仿真中遇到報錯的狀況時,不妨檢查下ModelSim的提示信息,看看是否有仿真所必需的庫文件沒有添加進來。