成人免费无码不卡毛片,亚洲AⅤ无码精品一区二区三区,国产尤物精品视频,久久精品日本亚洲,欧美成人一区三区无码乱码A片,中文字日产幕码一区二区色哟哟,亞洲日韓中文字幕網AV

  • 正文
    • 7.5  仿真測試文件(Testbench)的設(shè)計方法
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

FPGA系統(tǒng)設(shè)計的仿真驗證之: 仿真測試文件(Testbench)的設(shè)計方法

2013/08/26
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

?

7.5??仿真測試文件(Testbench)的設(shè)計方法

7.5.1??測試文件的用途

隨著設(shè)計量和復(fù)雜度的不斷增加,數(shù)字設(shè)計驗證變得越來越難,所消耗的成本也越來越高。面對這種挑戰(zhàn),驗證工程師必須依靠相應(yīng)的驗證工具和方法才行。對于大型的設(shè)計,比如上百萬門的設(shè)計驗證,工程師必須使用一整套規(guī)范的驗證工具;而對于較小的設(shè)計,使用具有HDL?testbench的仿真器是一個不錯的選擇。

Testbench已經(jīng)成為了HLL(High-Level-Language,高級語言)設(shè)計標準驗證方法。一般來說,它能夠完成下面一些任務(wù)。

·??實例化DUT(Design?Under?Test,被測設(shè)計)。

·??通過為模塊添加測試向量對DUT進行仿真。

·??通過終端或波形窗口提供仿真結(jié)果。

·??比較實際輸出與期望輸出的差異。

一般來說,Testbench使用工業(yè)標準VHDL或者Verilog?HDL語言來描述。簡單的Testbench通過調(diào)用用戶設(shè)計的功能模塊,然后進行仿真。較為復(fù)雜的Testbench還包括一些其他的功能,比如包含特定的激勵向量或者進行實際輸出與期望輸出的比較等。

如圖7.32所示是一個標準的HDL驗證流程,圖中表達了上述的Testbench功能。

圖7.32??HDL?Testbench仿真流程

?

由于Testbench是使用VHDL或者Verilog?HDL編寫的,因此Testbench的驗證流程是跨平臺的。同時由于這兩種語言是標準的非私有語言,所以使用它們進行驗證的流程可以在未來的設(shè)計中繼續(xù)使用。

下面講解Testbench的設(shè)計方法。

7.5.2??測試文件設(shè)計方法

由于測試文件只是在仿真時使用,因此在綜合中對RTL語言的語法限制在測試文件中并不存在。相反地,測試文件可以編寫得更加通俗,所有的行為結(jié)構(gòu)語法都可以使用,使之更加容易理解。所有的測試文件都包含了如表7.1所示的結(jié)構(gòu)。

表7.1 測試文件的共同結(jié)構(gòu)

VHDL

Verilog?HDL

實體和結(jié)構(gòu)聲明(Entity,Architecture)

模塊聲明(Module)

信號聲明(Signal)

信號生命(Signal)

頂層模塊實例化

頂層模塊實例化

激勵向量

激勵向量

?

正如所述,測試文件除了包含這些共有的結(jié)構(gòu)意外,還完成一些額外的工作。例如顯示結(jié)果、嵌入的誤碼檢測等。下面通過一些例子來展現(xiàn)測試文件中常用的結(jié)構(gòu)。

1.產(chǎn)生測試時鐘

仿真必須產(chǎn)生時鐘才能進行,只有在推進的仿真時鐘中才可以判定輸出的結(jié)果是否符合設(shè)計的要求。交互時鐘是硬件設(shè)計語言里面最容易實現(xiàn)的時鐘,下面通過Verilog語言的例子來說明如何生成測試時鐘。

Parameter ClockPeriod = 10;???????? // 聲明時鐘周期常量

//時鐘生成方法1:

???? initial begin

????????? forever Clock = #(ClockPeriod / 2) ~ Clock;

???? end

//時鐘生成方法2:

???? initial begin

????????? always #(ClockPeriod / 2) Clock = ~Clock;

???? end

在兩種實現(xiàn)方法中,都是用了initial塊語句。在方法1中,使用了forever語句,是最常用的產(chǎn)生時鐘的方法。在方法2中,使用過了always語句,同樣也實現(xiàn)了時鐘的生成。兩種方法都產(chǎn)生了周期為10?的時鐘波形。

2.提供激勵源

為了得到Testbench的驗證結(jié)果,必須為DUT提供激勵向量。并行激勵模塊常常被用來為測試文件提供必要的激勵。有兩種不同的方法來實現(xiàn)并行的激勵:一種是絕對時間激勵,另一種是相對時間激勵。

在絕對時間激勵中,所有的仿真時間值都是相對仿真時間零點定義的。而在相對時間激勵中,一般會提供初始化值,然后等待事件來觸發(fā)激勵向量。兩種方法都可以根據(jù)設(shè)計者的需要在同一個測試文件中使用。

下面分別是兩種方法產(chǎn)生激勵的例子。

(1)絕對時間。

initial?begin

?????Reset?=?1;????????????????//仿真時間零點激勵

?????Load?=?0;?????????????????//仿真時間零點激勵

?????Count_UpDn?=?0;??????????//仿真時間零點激勵

?????#100?Reset?=?0;??????????//絕對時間100激勵

?????#20?Load?=?1;????????????//絕對時間120激勵,相對上一個時間點20

?????#20?Count_UpDn?=?1;?????//絕對時間140激勵,相對上一個時間點20

end

(2)相對時間。

always?@?(posedge?clock)

?????TB_Count?<=?TB_Count?+?1;????//絕對時間的遞增

initial?begin

?????if?(TB_Count?<=?5)????begin????//觸發(fā)事件,產(chǎn)生下列激勵

???????????Reset?=?1;

???????????Load?=?0;

???????????Count?_UpDn?=?0;

???????????end

?????else?begin????????????????//觸發(fā)事件,產(chǎn)生下列激勵

???????????Reset?=?0;

???????????Load?=?1;

???????????Count_UpDn?=?1;

?????end

end

initial?begin

?????if?(Count?==?1100)?begin????//觸發(fā)事件,產(chǎn)生歸零激勵,并顯示結(jié)果

???????????Count_UpDn?<=?0;

???????????$display("Terminal?Count?Reached,?now?counting?down.");

???????????end

end

值得注意的是,Verilog?HDL語言的initial模塊之間是并行執(zhí)行的,但是initial模塊內(nèi)部是順序執(zhí)行的。也就是說,測試文件的激勵順序在仿真時間零點同時啟動并行模塊,然后根據(jù)各個模塊的內(nèi)部激勵順序產(chǎn)生激勵向量。

3.結(jié)果輸出

測試文件通過關(guān)鍵詞$display和$monitor來實現(xiàn)結(jié)果的輸出。下面是使用Verilog?HDL語言實現(xiàn)在終端上顯示結(jié)果的例子:

//?在終端中打印信號的ASCII值

initial?begin

??????$timeformat(-9,1,"ns",12);?????????????????????????????????//設(shè)置輸出時鐘格式

??????$display("?Time?Clk?Rst?Ld?SftRg?Data?Sel");???????????//顯示輸入的字符串

??????$monitor("%t?%b?%b?%b?%b?%b?%b",????????????????????????//設(shè)置輸出信號的格式

??????$realtime,?clock,?reset,?load,?shiftreg,?data,?sel);?//指定輸出的信號

end

$display是將函數(shù)內(nèi)部雙引號中的字符串輸出在終端中。而$monitor則不同,因此它的輸出是事件驅(qū)動的。在例子中,$monitor信號列表中的$realtime信號變化會觸發(fā)終端顯示事件的發(fā)生,該信號被設(shè)計者對應(yīng)到仿真時間中,每次$monitor的觸發(fā)將會把信號列表中的信號值顯示在終端中。

$monitor語句中的“%”用于定義信號列表中信號的輸出格式。例如,%t將信號按照時間格式輸出,%b將信號按照二進制格式輸出。另外,Verilog?HDL語言還提供了其他的輸出格式,比如%h為十六進制輸出,%d為十進制輸出,%o為八進制輸出等。更為詳細的格式輸出定義可以參看Verilog參考手冊。

?

7.5.3??測試常用語句

常用的Verilog測試用結(jié)構(gòu)語句,比如$monitor、$display和$time在上面已經(jīng)介紹過了。下面再來介紹一些其他的常用語句。

1.force/release

force和release語句可以用來強制對執(zhí)行過程中的寄存器或網(wǎng)絡(luò)型信號量賦值。這兩條語句共同完成一個強制賦值的過程。當一個被force的信號被release以后,這個信號將會保持當時的狀態(tài)直到下一個賦值語句產(chǎn)生為止。

下面舉個例子來說明這兩條語句的使用。

module?testbench;

?????...

?????initial?begin

??????????reset?=?1;????????????????//在仿真時間零點將reset激勵為1

??????????force?DataOut?=?101;????//在仿真時間零點強制使DataOut為101,并保持

??????????#25?reset?=?0;???????????//在仿真絕對時間25將reset激勵為0

??????????#25?release?DataOut;????//在仿真絕對時間50釋放

??????????????????????????????????????//?DataOut值將保持直至下一個對它的賦值語句

??????????...

??????????end

endmodule

2.a(chǎn)ssign/deassign

assign/deassign語句與force/release語句相類似,不過assign/deassign語句只能對設(shè)計中的寄存器型信號賦值。它們常常被用來設(shè)置輸入值。

下面是這兩個語句的例子。

module?testbench;

?????...

?????initial?begin

??????????reset?=?1;??????????????//絕對時間零點對reset賦值1

??????????DataOut?=?101;

??????????#25?reset?=?0;?????????//絕對時間25對reset賦值0

??????????release?DataOut;

??????????...

?????end

?????initial?begin

??????????#20?assign?reset?=?1;?//此條語句覆蓋之前的賦值語句(即絕對時間零點的賦值)

??????????#25?reset?=?0;??????????//絕對時間45對reset賦值0

??????????#50?release?reset;?????//絕對時間95釋放reset信號

endmodule

3.timescales

timescale語句用于定義測試文件的單位時間,同時也對仿真的精度有影響。它的語法定義如下:

‘timescale?reference_time/precision

其中,reference_time是單位時間的度量,precision決定了仿真的推進延遲精度,同時也設(shè)置了仿真的推進步進單位。下面是timescale語句的使用范例:

‘timescale?1?ns?/?1?ps???????????//度量參考為1ns,精度為1ps

module?testbench;

?????...

?????initial?begin

??????????#5?reset?=?1;????????????//?5個仿真時間延遲,相當于5×1ns?=?5ns?的仿真時間

??????????#10?reset?=?0;

??????????...

??????????end

?????initial?begin

??????????//display語句將在每一個仿真推進步進中執(zhí)行,也就是1ps執(zhí)行一次

??????????$display?(“%d?,?Reset?=?%b”,?$time,?reset);

??????????end

endmodule

應(yīng)該注意的是,如果仿真中使用了時間延遲值,那么仿真的精度應(yīng)大于最小的延遲值。例如仿真中使用了9ps的仿真時間延遲,那么仿真的推進步進精度必須為1ps來保證9ps的延遲。

4.Reading?Memory?Initialization?Files

Verilog?HDL提供了$readmemb和$readmemh命令來讀取ASCII文件,用于初始化memory的內(nèi)容。這兩個語句可以用于初始化FPGA中由IP?Core生成的存儲器宏模塊,例如RAM、ROM等。

下面是利用這個語句對Xilinx的實例(design_instance)進行初始化的例子。

$readmemb?(“<design.mif>”,?design_instance);

其中,mif文件是Xilinx的Core?Generator建立的對存儲器進行初始化的文件。用戶也可以自己編寫這個文件的內(nèi)容。

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

華清遠見(www.farsight.com.cn)是國內(nèi)領(lǐng)先嵌入師培訓(xùn)機構(gòu),2004年注冊于中國北京海淀高科技園區(qū),除北京總部外,上海、深圳、成都、南京、武漢、西安、廣州均有直營分公司。華清遠見除提供嵌入式相關(guān)的長期就業(yè)培訓(xùn)、短期高端培訓(xùn)、師資培訓(xùn)及企業(yè)員工內(nèi)訓(xùn)等業(yè)務(wù)外,其下屬研發(fā)中心還負責嵌入式、Android及物聯(lián)網(wǎng)方向的教學(xué)實驗平臺的研發(fā)及培訓(xùn)教材的出版,截止目前為止已公開出版70余本嵌入式/移動開發(fā)/物聯(lián)網(wǎng)相關(guān)圖書。企業(yè)理念:專業(yè)始于專注 卓識源于遠見。企業(yè)價值觀:做良心教育、做專業(yè)教育,更要做受人尊敬的職業(yè)教育。

嘉黎县| 廉江市| 繁昌县| 德保县| 南汇区| 常德市| 隆昌县| 灵川县| 民县| 通道| 安福县| 连南| 呼伦贝尔市| 灯塔市| 平定县| 丹寨县| 收藏| 清水河县| 怀来县| 景洪市| 资兴市| 东阿县| 泰宁县| 宁晋县| 简阳市| 时尚| 松江区| 万全县| 盐津县| 石狮市| 竹溪县| 遂溪县| 灌南县| 清涧县| 黎城县| 湘阴县| 平潭县| 普安县| 绥阳县| 浠水县| 诏安县|