仿真第1個子模塊
??在開始設(shè)計前,根據(jù)設(shè)計劃分好各功能模塊(為了敘述方便,這里以對“FPGA數(shù)字信號處理(十三)鎖相環(huán)位同步技術(shù)的實(shí)現(xiàn)”中設(shè)計的系統(tǒng)仿真為例)。編寫好第一個子模塊(本例中為雙相時鐘生成模塊),在Vivado中添加仿真sim文件,編寫testbench:
`timescale 1ns / 1ps //----------------------------------------------------- // 雙相時鐘信號生成模塊測試 //----------------------------------------------------- module clk_gen_sim; reg clk, rst; wire clk_d1, clk_d2; clk_gen i1 ( .clk(clk), //32MHz系統(tǒng)時鐘 .rst(rst), //高電平有效復(fù)位信號 .clk_d1(clk_d1), //時鐘1 .clk_d2(clk_d2) //時鐘2 ); always #10 clk = ~clk; initial begin clk = 1'b1; rst = 1'b1; #50; rst = 1'b0; #1000; $stop; end endmodule
??綜合正確后,點(diǎn)擊“Run Simulation”->“Run Behavioral Simulation”進(jìn)行行為仿真,仿真結(jié)果如下圖:
??仿真結(jié)果正確(即功能與預(yù)期相符),則表明該子模塊設(shè)計正確,可以開始下一個子模塊的設(shè)計和仿真。
加入第N個子模塊
??和上節(jié)一樣,設(shè)計好一個子模塊,則添加一個仿真激勵testbench文件,在仿真中確認(rèn)功能正確性。最終的仿真文件清單如下所示:
??Vivado對多模塊、多文件的仿真提供了很好的特性支持。上面有多個testbench文件,分別對不同的模塊進(jìn)行仿真。當(dāng)仿真好第一個模塊后,需要仿真第二個模塊時,對第一個模塊對應(yīng)的testbench點(diǎn)右鍵->“Disable File”,并將第二個模塊對應(yīng)的testbench點(diǎn)右鍵->“Set as Top”(當(dāng)狀態(tài)為Enable的仿真文件只有一個時會自動設(shè)置為Top),如下圖所示:
??如果想要重新仿真先前的模塊,在testbench文件上點(diǎn)右鍵->“Enable File”即可重新將其置為有效。通過這樣的方法可以完成所有模塊的仿真。
多模塊聯(lián)合仿真
??我們知道,模塊化設(shè)計的代碼,各個模塊之間的聯(lián)系是非常緊密的。對于簡單的設(shè)計還比較好,可以像上節(jié)一樣每個模塊單獨(dú)測試,各自編寫testbench也并不復(fù)雜。而更多的設(shè)計在仿真時我們期望能直接使用第一個模塊產(chǎn)生的信號,作為第二個模塊的測試激勵,即多模塊聯(lián)合仿真。比如在“FPGA綜合系統(tǒng)設(shè)計(七)基于DDC的兩路信號相位差檢測”中,在仿真DDC模塊(數(shù)字下變頻)時顯然更希望直接使用信號生成模塊(signal_gen)中產(chǎn)生的信號作為激勵,而不是另外在testbench中生成一個信號作為激勵。否則不僅費(fèi)時費(fèi)力,也沒有測試到模塊之間連接的正確性。
??方法有兩個:第一個是先編寫好設(shè)計的頂層模塊,不斷的將子模塊實(shí)例化到頂層模塊中,只對頂層模塊做仿真;第二個是在testbench中把需要的子模塊都實(shí)例化好。
1. 第一種方法
??Vivado可以觀察模塊的內(nèi)部信號,在運(yùn)行頂層模塊的仿真后,Scope窗口內(nèi)顯示了頂層模塊內(nèi)包含的所有子模塊。如下圖所示:
??仿真波形窗口內(nèi)默認(rèn)只顯示頂層模塊的接口和在testbench文件中定義的變量。如果要觀察子模塊內(nèi)部的信號,在子模塊上右鍵->“Add to Wave Window”,即可將相關(guān)信號添加到波形窗口。
??借助于Vivado的這個特性,可以在設(shè)計過程中不斷在頂層模塊中實(shí)例化子模塊,達(dá)到多模塊聯(lián)合仿真的目的。這樣做的優(yōu)點(diǎn)是在編寫testbench代碼上更省力,缺點(diǎn)是只有一個頂層模塊的testbench,無法對各個子模塊進(jìn)行單獨(dú)測試。
2. 第二種方法
??在仿真一個子模塊時希望用到其它子模塊的輸出信號,將兩者都在testbench中實(shí)例化即可。和下面testbench代碼類似:
`timescale 1ns / 1ps module clk_iq_sim; reg clk, rst; wire clk_d1, clk_d2; wire clk_i, clk_q; clk_gen i1 ( .clk(clk), //32MHz系統(tǒng)時鐘 .rst(rst), //高電平有效復(fù)位信號 .clk_d1(clk_d1), //時鐘1 .clk_d2(clk_d2) //時鐘2 ); /*使用clk_gen模塊的輸出信號作為該模塊的輸入激勵*/ clk_iq i2 ( .clk(clk), //32MHz系統(tǒng)時鐘 .rst(rst), //高電平有效復(fù)位信號 .clk_d1(clk_d1), //時鐘1 .clk_d2(clk_d2), //時鐘2 .clk_i(clk_i), .clk_q(clk_q) ); always #10 clk = ~clk; initial begin clk = 1'b1; rst = 1'b1; #50; rst = 1'b0; #1000; $stop; end endmodule
??這樣做的好處是仍然可以保持每一個子模塊都有一個對應(yīng)的仿真激勵文件,更方便功能測試和文件管理。尤其在經(jīng)常需要修改和運(yùn)行仿真的設(shè)計中,單獨(dú)測試一個模塊的運(yùn)行時間比運(yùn)行總體的頂層模塊仿真要節(jié)省不少時間。
使用Quartus+ModelSim
??Vivado自帶的仿真(Vivado Simulation)已經(jīng)足夠好用,而使用Quartus時,由于其自帶的波形仿真工具并不方便,經(jīng)常需要調(diào)用ModelSim來仿真。使用Quartus+ModelSim也可以達(dá)到上面的效果。
??多仿真文件的管理在Quartus主界面的Assignments菜單->Settings窗口中,如下圖所示:
??點(diǎn)擊EDA Tool Settings下的Simulation,在Test Benches窗口中可以添加和管理多個testbench文件。在Compile test bench的下拉菜單里選擇指定的一個testbench,調(diào)用ModelSim仿真時會讀取相應(yīng)的文件。
??ModelSim仿真過程中也可以觀察到頂層模塊內(nèi)部子模塊的信號。在sim-Default窗口下可以看到頂層模塊和子模塊之間的實(shí)例化信息,選中相應(yīng)的子模塊,在Objects窗口(如果沒有則在ModelSim主界面的View菜單中選中打開)下會顯示出該子模塊的相關(guān)信號。
??對需要顯示的信號點(diǎn)右鍵->“Add to”->“Wave”->“Selected Signals”,即可添加到波形窗口。點(diǎn)擊“Run-All”重新運(yùn)行仿真,新添加信號的波形便會顯示出來。
審核編輯:劉清
-
鎖相環(huán)
+關(guān)注
關(guān)注
35文章
597瀏覽量
89577 -
FPGA設(shè)計
+關(guān)注
關(guān)注
9文章
428瀏覽量
27327 -
仿真器
+關(guān)注
關(guān)注
14文章
1037瀏覽量
85341 -
DDC
+關(guān)注
關(guān)注
2文章
95瀏覽量
37660 -
Vivado
+關(guān)注
關(guān)注
19文章
834瀏覽量
68690
原文標(biāo)題:Testbench編寫指南(3)模塊化工程的仿真方法
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
模塊化示波器的技術(shù)原理和應(yīng)用
怎么在ISE中進(jìn)行模塊化設(shè)計?
嵌入式軟件開發(fā)過程中的模塊化
介紹一下機(jī)電暫態(tài)開源工具使用過程中的一些體會
利用模塊化建模方法實(shí)現(xiàn)基于System Generator的控制器導(dǎo)出并多軟硬件仿真驗(yàn)證

關(guān)于testbench在FPGA編程中的技巧
介紹FPGA中testbench的編寫技巧

使用三種自動化testbench驗(yàn)證方法
在模塊化設(shè)計過程中編寫testbench并仿真的方法
FPGA仿真的學(xué)習(xí)課件和工程文件免費(fèi)下載
使用matlab產(chǎn)生待濾波信號并編寫testbench進(jìn)行仿真分析

評論