Testbench編寫指南(3)模組化工程的模擬方法
Testbench編寫指南(3)模組化工程的模擬方法
文章轉自:https://blog.csdn.net/FPGADesigner/article/details/80816066
文章目錄
第3篇的題材是模組化工程的模擬方法。現在只要是功能比較完善、規模比較大的FPGA設計都會採用模組化設計的方法。本文介紹在模組化設計過程中編寫testbench並模擬的方法,Vivado對此有很好的特性支援,使用Quartus+ModelSim也可以達到同樣的效果。
模擬第1個子模組
在開始設計前,根據設計劃分好各功能模組(為了敘述方便,這裡以對“FPGA數字訊號處理(十三)鎖相環位同步技術的實現”中設計的系統模擬為例)。編寫好第一個子模組(本例中為雙相時鐘生成模組),在Vivado中新增模擬sim檔案,編寫testbench:
`timescale 1ns / 1ps //----------------------------------------------------- // 雙相時鐘訊號生成模組測試 //----------------------------------------------------- module clk_gen_sim; reg clk, rst; wire clk_d1, clk_d2; clk_gen i1 ( .clk(clk), //32MHz系統時鐘 .rst(rst), //高電平有效復位訊號 .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
綜合正確後,點選“Run Simulation”->“Run Behavioral Simulation”進行行為模擬,模擬結果如下圖:
模擬結果正確(即功能與預期相符),則表明該子模組設計正確,可以開始下一個子模組的設計和模擬。
加入第N個子模組
和上節一樣,設計好一個子模組,則新增一個模擬激勵testbench檔案,在模擬中確認功能正確性。最終的模擬檔案清單如下所示:
Vivado對多模組、多檔案的模擬提供了很好的特性支援。上面有多個testbench檔案,分別對不同的模組進行模擬。當模擬好第一個模組後,需要模擬第二個模組時,對第一個模組對應的testbench點右鍵->“Disable File”,並將第二個模組對應的testbench點右鍵->“Set as Top”(當狀態為Enable的模擬檔案只有一個時會自動設定為Top),如下圖所示:
如果想要重新模擬先前的模組,在testbench檔案上點右鍵->“Enable File”即可重新將其置為有效。通過這樣的方法可以完成所有模組的模擬。
多模組聯合模擬
我們知道,模組化設計的程式碼,各個模組之間的聯絡是非常緊密的。對於簡單的設計還比較好,可以像上節一樣每個模組單獨測試,各自編寫testbench也並不複雜。而更多的設計在模擬時我們期望能直接使用第一個模組產生的訊號,作為第二個模組的測試激勵,即多模組聯合模擬。比如在“FPGA綜合系統設計(七)基於DDC的兩路訊號相位差檢測 ”中,在模擬DDC模組(數字下變頻)時顯然更希望直接使用訊號生成模組(signal_gen)中產生的訊號作為激勵,而不是另外在testbench中生成一個訊號作為激勵。否則不僅費時費力,也沒有測試到模組之間連線的正確性。
方法有兩個:第一個是先編寫好設計的頂層模組,不斷的將子模組例項化到頂層模組中,只對頂層模組做模擬;第二個是在testbench中把需要的子模組都例項化好。
1. 第一種方法
Vivado可以觀察模組的內部訊號,在執行頂層模組的模擬後,Scope視窗內顯示了頂層模組內包含的所有子模組。如下圖所示:
模擬波形視窗內預設只顯示頂層模組的介面和在testbench檔案中定義的變數。如果要觀察子模組內部的訊號,在子模組上右鍵->“Add to Wave Window”,即可將相關訊號新增到波形視窗。
藉助於Vivado的這個特性,可以在設計過程中不斷在頂層模組中例項化子模組,達到多模組聯合模擬的目的。這樣做的優點是在編寫testbench程式碼上更省力,缺點是隻有一個頂層模組的testbench,無法對各個子模組進行單獨測試。
2. 第二種方法
在模擬一個子模組時希望用到其它子模組的輸出訊號,將兩者都在testbench中例項化即可。和下面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系統時鐘
.rst(rst), //高電平有效復位訊號
.clk_d1(clk_d1), //時鐘1
.clk_d2(clk_d2) //時鐘2
);
/*使用clk_gen模組的輸出訊號作為該模組的輸入激勵*/
clk_iq i2
(
.clk(clk), //32MHz系統時鐘
.rst(rst), //高電平有效復位訊號
.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
這樣做的好處是仍然可以保持每一個子模組都有一個對應的模擬激勵檔案,更方便功能測試和檔案管理。尤其在經常需要修改和執行模擬的設計中,單獨測試一個模組的執行時間比執行總體的頂層模組模擬要節省不少時間。
使用Quartus+ModelSim
Vivado自帶的模擬(Vivado Simulation)已經足夠好用,而使用Quartus時,由於其自帶的波形模擬工具並不方便,經常需要呼叫ModelSim來模擬。使用Quartus+ModelSim也可以達到上面的效果。
多模擬檔案的管理在Quartus主介面的Assignments選單->Settings視窗中,如下圖所示:
點選EDA Tool Settings下的Simulation,在Test Benches視窗中可以新增和管理多個testbench檔案。在Compile test bench的下拉選單裡選擇指定的一個testbench,呼叫ModelSim模擬時會讀取相應的檔案。
ModelSim模擬過程中也可以觀察到頂層模組內部子模組的訊號。在sim-Default視窗下可以看到頂層模組和子模組之間的例項化資訊,選中相應的子模組,在Objects視窗(如果沒有則在ModelSim主介面的View選單中選中開啟)下會顯示出該子模組的相關訊號。
對需要顯示的訊號點右鍵->“Add to”->“Wave”->“Selected Signals”,即可新增到波形視窗。點選“Run-All”重新執行模擬,新新增訊號的波形便會顯示出來。