綜合知識

當前位置 /首頁/綜合知識 > /列表

如何編寫testbench來仿真VHDL程序,vhdl時鐘的testbench怎麼寫

1.如何編寫 test bench來仿真VHDL程序

本文介紹如何寫testbench來仿真VHDL程序。

vhdl時鐘的testbench怎麼寫 如何編寫testbench來仿真VHDL程序

通常testbench完成如下的任務:1. 實例化需要測試的設計(DUT);2. 通過對DUT模型加載測試向量來仿真設計;3. 將輸出結果到終端或波形窗口中加以視覺檢視;4. 另外,將實際結果和預期結果進行比較。 一、構建Testbench 本文用VHDL來寫,由於testbench只用來進行仿真,它們沒有那些適用於綜合的RTL語言子集的語法約束限制,而是所有的行為結構都可以使用。

所有testbench包含了以下的基本程序段:Entity and Architecture Declaration ;Signal Declaration ;Instantiation of Top-level Design ;Provide Stimulus. 在ISE工程中添加source:VHDL Test Bench到頂層文件,在source for 選項中選擇Behavioral Simulation。你會發現Test Bench中有很多已經自動寫好,可根據自己的設計需要改寫程序。

其中Entity是空的,由於是仿真,不必有管腳的輸入輸出,只要寫好激勵信號就可以了。 二、雙擊Simulate Behavioral Model進行Modelsim仿真 我們在modelsim仿真的過程中,如果想改寫激勵程序,點擊environment back(圖中向左的箭頭),回到激勵程序的編寫環境。

可以利用其提供的模板直接改寫testbench,點source->show language template,需要將read only取消掉,否則無法改寫。本人建議,在這個環境中可以看到模板,你可以根據需要將相應的語句拷到VHDL Testbench中去。

這裏只是簡單介紹如何用test bench來仿真VHDL程序,其中各種激勵信號的編寫、時序的安排要依靠設計的需要,這些只能靠平時不斷的積累。 這裏介紹的是從ISE中直接調用modelsim進行仿真,因此關於ISE和modelsim的關聯也是大家經常遇到的問題。

這個下次再總結。

2.怎樣寫testbench

如何編寫testbench的總結?1.激勵的設置相應於被測試模塊的輸入激勵設置為reg型,輸出相應設置為wire類型,雙向端口inout在測試中需要進行處理。

方法1:為雙向端口設置中間變量inout_reg作為該inout的輸出寄存,inout口在testbench中要定義為wire型變量,然後用輸出使能控制傳輸方向。eg:inout [0:0] bi_dir_port;wire [0:0] bi_dir_port;reg [0:0] bi_dir_port_reg;reg bi_dir_port_oe;assign bi_dir_port=bi_dir_port_oe?bi_dir_port_reg:1'bz;用bi_dir_port_oe控制端口數據方向,並利用中間變量寄存器改變其值。

等於兩個模塊之間用inout雙向口互連。往端口寫(就是往模塊裏面輸入)方法2:使用force和release語句,這種方法不能準確反映雙向端口的信號變化,但這種方法可以反映塊內信號的變化。

具體如示:module test();wire data_inout;reg data_reg;reg link;#xx; //延時force data_inout=1'bx; //強制作為輸入端口。

#xx;release data_inout; //釋放輸入端口endmodule從文本文件中讀取和寫入向量1)讀取文本文件:用 $readmemb系統任務從文本文件中讀取二進制向量(可以包含輸入激勵和輸出期望值)。

$readmemh 用於讀取十六進制文件。例如:reg [7:0] mem[1:256] // a 8-bit, 256-word 定義存儲器meminitial $readmemh ( "mem.data", mem ) // 將.dat文件讀入寄存器mem中initial $readmemh ( "mem.data", mem, 128, 1 ) // 參數為寄存器加載數據的地址始終2)輸出文本文件:打開輸出文件用?$fopen 例如:integer out_file; // out_file 是一個文件描述,需要定義為 integer類型out_file = $fopen ( " cpu.data " ); // cpu.data 是需要打開的文件,也就是最終的輸出文本設計中的信號值可以通過$fmonitor, $fdisplay,2. Verilog和Ncverilog命令使用庫文件或庫目錄ex). ncverilog -f run.f -v lib/lib.v -y lib2 +libext+.v //一般編譯文件在run.f中, 庫文件在lib.v中,lib2目錄中的.v文件系統自動搜索使用庫文件或庫目錄,只編譯需要的模塊而不必全部編譯3.Verilog Testbench信號記錄的系統任務:1). SHM數據庫可以記錄在設計仿真過程中信號的變化. 它只在probes有效的時間內記錄你set probe on的信號的變化.ex). $shm_open("waves.shm"); //打開波形數據庫$shm_probe(top, "AS"); // set probe on "top",第二個參數: A -- signals of the specific scrope S -- Ports of the specified scope and below, excluding library cellsC -- Ports of the specified scope and below, including library cellsAS -- Signals of the specified scope and below, excluding library cellsAC -- Signals of the specified scope and below, including library cells還有一個 M ,表示當前scope的memories, 可以跟上面的結合使用, "AM" "AMS" "AMC"什麼都不加表示當前scope的ports;$shm_close //關閉數據庫2). VCD數據庫也可以記錄在設計仿真過程中信號的變化. 它只記錄你選擇的信號的變化.ex). $dumpfile("filename"); //打開數據庫$dumpvars(1, top.u1); //scope = top.u1, depth = 1第一個參數表示深度, 為0時記錄所有深度; 第二個參數表示scope,省略時表當前的scope.$dumpvars; //depth = all scope = all$dumpvars(0); //depth = all scope = current$dumpvars(1, top.u1); //depth = 1 scope = top.u1$dumpoff //暫停記錄數據改變,信號變化不寫入庫文件中$dumpon //重新恢復記錄3). Debussy fsdb數據庫也可以記錄信號的變化,它的優勢是可以跟debussy結合,方便調試.如果要在ncverilog仿真時,記錄信號, 首先要設置debussy:a. setenv LD_LIBRARY_PATH :$LD_LIBRARY_PATH(path for debpli.so file (/share/PLI/nc_xl//nc_loadpli1))b. while invoking ncverilog use the +ncloadpli1 option.ncverilog -f run.f +debug +ncloadpli1=debpli:deb_PLIPtrfsdb數據庫文件的記錄方法,是使用$fsdbDumpfile和$fsdbDumpvars系統函數,使用方法參見VCD注意: 在用ncverilog的時候,為了正確地記錄波形,要使用參數: "+access+rw", 否則沒有讀寫權限在記錄信號或者波形時需要指出被記錄信號的路徑,如:tb.module.u1.clk.………………………………………………………………………………………………………關於信號記錄的系統任務的説明:在testbench中使用信號記錄的系統任務,就可以將自己需要的部分的結果以及波形文件記錄下來(可採用sigalscan工具查看),適用於對較大的系統進行仿真,速度快,優於全局仿真。

使用簡單,在testbench中添加:initial begin$shm_open("waves.shm");$shm_probe("要記錄信號的路徑“,”AS“);#10000$shm_close; 即可。4. ncverilog編譯的順序: ncverilog file1 file2 。

.有時候這些文件存在依存關係,如在file2中要用到在file1中定義的變量,這時候就要注意其編譯的順序是從後到前,就先編譯file2然後才是file2.5. 信號的強制賦值force首先, force語句只能在過程語句中出現,即要在initial 或者 always 中間. 去除force 用 release 語句.initial begin force sig1 = 1'b1; 。 ; release sig1; endforce可以對wire賦值,這時整個net都被賦值; 也可以對reg賦值.6.加載測試向量時,避免在時鐘的上下沿變化為了模。

3.如何寫TESTBENCH, 給個教程吧

一、基本概念和基礎知識Testbench 不僅要產生激勵也就是輸入,還要驗證響應也就是輸出。

當然也可以只產生激勵,然後通過波形窗口通過人工的方法去驗證波形,這種方法只能適用於小規模的設計。在ISE 環境中,當前資源操作窗顯示了資源管理窗口中選中的資源文件能進行的相關操作。

在資源管理窗口選中了testbench 文件後,在當前資源操作窗顯示的ModelSimSimulator 中顯示了4 種能進行的模擬操作,分別是:Simulator Behavioral Model(功能仿真)、Simulator Post-translate VHDL Model(翻譯後仿真)、Simulator Post-Map VHDLModel(映射後仿真)、Simulator Post-Place & Route VHDL Model(佈局佈線後仿真)。如圖1 所示:圖1l Simulator Behavioral Model 也就是所説的功能仿真、行為仿真、前仿真。

驗證功能是否正確,這是設計的第一步。功能仿真正確的程序不一定能被正確綜合,也就是硬件實現。

有的在綜合時報錯誤,有的雖然能綜合但結果並不正確。當然,功能仿真如果都不能通過,以後的步驟也就無法進行。

這是必做的仿真。l Simulator Post-translate VHDL Model 也就是翻譯後仿真。

對源程序進行編譯後首先排除了語法錯誤,對一些像類屬命令(Generic)、生成語句(Generate)等進行了展開。不是必做的仿真。

l Simulator Post-Map VHDL Model也就是映射後仿真。不同的器件內部結構也不盡相同,映射的作用就是將綜合後產生的網表文件對應到實際的器件上去。

由於映射不包含佈線,也就是要用什麼類型的邏輯單元雖然已經確定但要用哪個位置的還沒有確定,因此,映射後仿真不包含佈線延時。不是必做的仿真。

l Simulator Post-Place & Route VHDL Model 也就是所説的佈局佈線後仿真、時序仿真、後仿真。這是最完整的仿真,既包含邏輯延時又包含佈線延時。

在做佈局佈線後仿真時要用到一個叫SDF的文件。SDF文件包含設計中每個單元(Cell)的延時和時序約束數據。

通過加載這個文件就能得到完整的時序情況。它是必做的仿真。

一般必須進行功能仿真和佈局佈線後仿真。常見問題:為什麼有的testbench在進行功能仿真時能正確進行,而在進行佈局佈線後仿真時就不能運行。

有兩點要注意的地方:(1)、在做映射後仿真或佈局佈線後仿真時,都已經經過了綜合工具的綜合,源程序中的類屬命令(Generic)、生成語句(Generate)等都已經進行展開。例如,如果用Generic 定義了一個參數width,綜合工具進行綜合時已經按照一個確定的width 值進行了綜合。

它生成的電路已經具有一個確定的結構,不能再隨意調整。所以在映射後仿真和佈局佈線後仿真的testbench中,往往不能出現Generic 語句。

(2)映射後仿真和佈局佈線後仿真都要用到SDF 文件,並且要將SDF文件關聯到設計中的實例。所以在映射後仿真和佈局佈線後仿真的testbench中,第一,要將你的設計聲明成一個元件。

第二,實例化你設計的元件並且實例名要取為UUT(默認的,當然也可以改)。關於斷言語句在仿真中為了能得到更多信息,經常要用到斷言語句(assert)。

其語法如下:Assert<條件>Report<消息>Severity<出錯級別>;出錯級別共有5 種:l Notel Warningl Errorl Failurel Fatal在VHDL 模型的模擬過程中,一旦斷言語句的條件為假,則發送消息並將出錯級別發送給模擬器。通常可以設置一箇中止模擬器運行的出錯級別,一般默認的中止運行的出錯級別為Failure。

我們來看一個例子:assert falsereport "********* " & IMAGE(DWIDTH) & "BIT DIVIDER SEQUENCE FINISHEDAT " & IMAGE(now) & " !" & " *********"severity note;斷言的條件不是一個條件表達式,而直接是false。這説明只要程序執行到這裏斷言就一定會成立,送出消息。

出錯級別為note,在模擬器的輸出窗口將會顯示:圖2再看一個例子:assert (s_cyi((DWIDTH-1)/4) = '0')and (s_ovi = '0')and (s_qutnt = conv_std_logic_vector(v_quot,DWIDTH))and (s_rmndr = conv_std_logic_vector(v_remd,DWIDTH))report "ERROR in division!"severity failure;斷言的條件有4 個並且是與的關係,只要其中一個條件不成立則整個表達式為假,斷言成立。如果斷言成立將輸出“ERROR in division!“這個消息。

並且通知模擬器出錯級別為failure,這一般會停止模擬。這個斷言實際是在對結果進行驗證。

二、實際testbench分析下面將詳細分析一個實際的testbench,它是用來測試8051 的ALU單元的除法功能的。8 位的除法器,被除數和除數的組合共有256*256=65536 種。

我們採用的方法是窮舉所有的輸入組合,這樣的代碼覆蓋率可以達到100%。它的驗證必須通過程序自動完成,否則通過人工方法工作量太大。

把要測試的程序當作一個元件,例如想象成一個74 系列數字電路。Testbench 的作用是在被測試電路的輸入端加上激勵,然後比較被測試電路的輸出和計算出來的期望值是否一致。

對我們這個例子來説,在要仿真的ALU 輸入端產生65536 種輸入組合,然後將ALU產生的對應輸出值和testbench 算出的期望值相比較,如果有錯誤產生則停止模擬並輸出信息。ALU 的除法單元的輸入有4 個,分別是被除數、除。