FPGA系統設計的模擬驗證
最近做專案卡住了,模擬已經通過了,可是將程式下載到板子除錯時,chipscope中獲取訊號時,所有訊號一直保持高或者低,沒有任何變化。後來查資料知道,我只做了功能模擬,沒有做時序模擬,可能還有沒有發現的問題。事實證明,每個模擬都需要做。
一、前言
FPGA設計驗證包括功能與時序模擬和電路驗證。
功能模擬是指僅對邏輯功能進行測試模擬,以瞭解其實現的功能是否滿足原設計的要求。模擬過程中沒有加入時序資訊,不涉及具體器件的硬體特性,如延時特性等,因此也叫前模擬。它是對HDL硬體設計語言的功能實現能力進行模擬,以確保HDL語言描述能夠滿足設計者的最初意圖。
時序模擬則是在HDL可以滿足設計者功能要求的基礎上,在佈局佈線後,提取有關的器件延遲、連線延時等時序引數,並在此基礎上進行的模擬,因此,也稱為後模擬,它是接近真實器件執行的模擬。
我使用的是ISE_14.7,整合MODELSIM_10.1a。模擬的方法分為直接和間接兩種。直接是指從ISE 上起動MODELSIM。間接是單獨起動MODELSIM,然後使用ISE 生成的用於模擬的資料夾netgen。
下面分別介紹功能模擬和時序模擬,本文只介紹直接從ISE上啟動MODELSIM。本文參考的例項為之前的博文《verilog實現中值濾波》。
二、功能模擬
1、建立工程
此步驟不再詳細描述,可參考檔案《黑金Sparten6開發板Verilog教程V1.5》第四部分 LED流水燈例程。該部分詳細介紹從新建一個專案, 建立模擬檔案,從ISE中啟動ModelSim進行功能模擬以及到最後下載到FPGA的全過程。像我這樣的小白可以通過學習這部分,對如何使用FPGA進行一個簡易專案的開發,有個直面的感性認識。
2、在用Modelsim模擬前,在ISE中需要確認一下設定,點選選單的“Project->Design Properties…”。
3、如下圖所示,確認這裡“Simulator”的選擇為“Modelsim-SE Mixed”,這在新建工程時我們已經設定好了,為保萬無一失,我們還是確認一下。
4、先切換到Simulation模式, 再選中main_test.v檔案, 最後右鍵選擇Simulate Behavioral Model後選擇Process Properties..。
5、彈出“Process Properties”設定視窗,在右邊的“Compiled Library Directory”後面填入之前編譯庫時設定的已編譯庫的路徑“C:\Xilinx\Xilinx_lib”。這個在Xilinx的安裝路徑下。其他選項預設設定即可,點選“OK” 完成設定。
6、接下去我們開始寫測試指令碼檔案,右擊main.v->New Source...
7、如圖所示,選擇新建原始檔型別是“Verilog Test Fixture”,再輸入測試指令碼檔案的名字和存放目錄。
8、這裡“Associate Source”是選擇測試指令碼對應的設計原始檔,如果工程中有多個設計原始檔,可以選擇任意一個設計原始檔進行模擬。這裡我選擇的是頂層模組的設計原始檔main.v,對整個工程進行模擬我們只有一個設計原始檔,然後點選“Next”。下一個介面點選“finish”,即完成模擬檔案的建立。
9、這裡的測試指令碼只是一個基本的模板,它把設計檔案mian_test的介面在這個模組裡面例化申明瞭,我們還需要自動動手新增復位和時鐘的激勵。完成後的指令碼檔案如下:
`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 16:45:09 10/17/2018
// Design Name: main
// Module Name: E:/WorkSpace/FPGAProject/ImageProcessingTest/main_test.v
// Project Name: ImageProcessingTest
// Target Device:
// Tool versions:
// Description:
//
// Verilog Test Fixture created by ISE for module: main
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
////////////////////////////////////////////////////////////////////////////////
module main_test;
/***輸入埠Inputs在測試檔案中的資料型別為reg***/
// Inputs
reg CLK;
reg RSTn;
reg Start_sig;
/***定義計數器,記錄儲存的畫素個數100*100=10000=10,0000,0000,0000***/
reg [13:0] pix_cnt;
/***輸出埠Outputs在測試檔案中的資料型別為wire***/
// Outputs
wire Done_sig;
wire [7:0] Data_out;
/***定義整型變數fouti***/
integer fouti;
// Instantiate the Unit Under Test (UUT)
main uut (
.CLK(CLK),
.RSTn(RSTn),
.Start_sig(Start_sig),
.Done_sig(Done_sig),
.Data_out(Data_out)
);
initial begin
// Initialize Inputs
CLK = 0;
RSTn = 0;
Start_sig = 0;
fouti = $fopen("medfilter2_re.txt");//@@@
// Wait 100 ns for global reset to finish
#100;
// Add stimulus here
/***新增復位資訊***/
RSTn = 0;
Start_sig = 1;
pix_cnt = 0;
#100;
// To start the syste
RSTn = 1;
pix_cnt = 1;
end
/***新增時鐘激勵***/
always #10 CLK = ~CLK;
/***計數***/
[email protected](posedge CLK)
begin
if(Done_sig)
pix_cnt <= pix_cnt + 1;
end
/***通過計數停止模擬***/
[email protected](posedge CLK)
begin
if(pix_cnt == 14'd10001)
begin
Start_sig <= 0;
$display("Image Medfilter Completed!\n");
$display("The all time is %d \n",$time);
$stop;
end
end
/***將結果資料Data_out寫入txt文件中***/
[email protected](posedge CLK)
begin
if(Done_sig)
begin
$fwrite(fouti, "%d", Data_out, "\n");
$display("%d",pix_cnt);
end
end
endmodule
10、儲存後main_test.v已經成了這個模擬的頂層了,它下面是設計檔案main.v。我們選擇模擬模式Behavioral(行為模擬),然後選中main_test.v檔案,隨後雙擊“Simulation Behavioral Model”,隨後Modelsim將被呼叫,啟動模擬。
11、彈出Modelsim後,我們可以開啟Wave檢視。如果想新增訊號到Wave中檢視,點選uut,在Name視窗下選擇要新增的訊號,例如rom_data,右擊選擇Add Wave,隨後就可以在Wave視窗中觀察rom_data訊號。
12、點選Restart按鈕復位一下,再點選Run All按鈕。Modelsim會執行到$stop的地方。
補充:每次新增訊號比較麻煩,可以點選“save Format”, 將新增好的訊號儲存,方便下次使用。
點選"File",選擇"Open",開啟檔案“wave.do”。如下圖所示。
在“wave.do”檔案中,複製下圖藍色部分的語句,在命令列視窗執行這些語句,即可將之前儲存的訊號新增到wave視窗中。
三、時序模擬
時序模擬一共有四類:
第一類:綜合(Synthesize),綜合後可生成綜合後模擬模型(Generate Post-Synthesis Simulation Model)。
在Implementation狀態下,點選Synthesize-XST下Generate Post-Synthesis Simulation Model。
第二類:實現(Implement)中的翻譯(Translate),生成Generate Post-Translate Simulation Model。
第三類:實現(Implement)中的對映(Map),生成Generate Post-Map Simulation Model。
第四類:實現(Implement)中的佈局佈線(Place&Route),生成Generate Post-Place&Route Simulation Model。
綜合後,進行ISE的實現(Implement),包括翻譯、對映、佈局佈線。在這三個過程中都可以生成一個模擬模型,翻譯和對映不會產生延時,因此常用佈局佈線後產生的模擬模型進行時序模擬。下面講解如何使用佈局佈線後產生的模擬模型進行時序模擬。
1、啟動Modelsim模擬
生成模擬模型之後,切換到"Simulation"模式,選擇“Post-Route”,然後雙擊ModelSim Simulator下Simulate Post-Place & Route Model,隨後Modelsim啟動。
2、如何編寫模擬檔案及如何使用Modelsim觀察訊號變化,同功能模擬。
四、參考資料
1、《黑金Sparten6開發板Verilog教程V1.5》
連結:https://pan.baidu.com/s/17Ubnroqc3oNEXt_W2XkXgg
提取碼:1m7m
2、《用ISE 與Modelsim 進行FPGA 後模擬(時序模擬)的兩種方法》
連結:https://pan.baidu.com/s/1w3msgwOHQX0LIkg1nk4yqg
提取碼:bv41
3、《FPGA應用開發入門與典型案例》