引言:Testbench是驗(yàn)證HDL設(shè)計(jì)的主要手段,本文提供了布局和構(gòu)建高效Testbench的指南以及示例。另外,本文還提供了一種示例,可以為任何設(shè)計(jì)開(kāi)發(fā)自檢Testbench。
1. 概述
由于FPGA設(shè)計(jì)規(guī)模和復(fù)雜性的增加,數(shù)字設(shè)計(jì)驗(yàn)證已成為一項(xiàng)越來(lái)越困難和費(fèi)力的任務(wù)。為了應(yīng)對(duì)這一挑戰(zhàn),驗(yàn)證工程師依靠多種驗(yàn)證工具和方法。對(duì)于大型、數(shù)百萬(wàn)門(mén)的設(shè)計(jì),工程師通常使用一套正式的驗(yàn)證工具。然而,對(duì)于較小的設(shè)計(jì),設(shè)計(jì)工程師通常使用帶有Testbench的HDL仿真器效果最好,如Modelsim、Vivado Simulator等。
Testbench已成為驗(yàn)證HLL(高級(jí)語(yǔ)言)設(shè)計(jì)的標(biāo)準(zhǔn)方法。通常,Testbench執(zhí)行以下任務(wù):
?實(shí)例化被測(cè)設(shè)計(jì)(DUT) ?通過(guò)將測(cè)試向量應(yīng)用于模型來(lái)激勵(lì)DUT ?將結(jié)果輸出到終端或波形窗口進(jìn)行目視檢查
?可選擇將實(shí)際結(jié)果與預(yù)期結(jié)果進(jìn)行比較
通常,Testbench是用行業(yè)標(biāo)準(zhǔn)VHDL或Verilog硬件描述語(yǔ)言編寫(xiě)的,Testbench調(diào)用功能設(shè)計(jì),然后對(duì)其進(jìn)行仿真。復(fù)雜的Testbench還執(zhí)行其他功能,例如,將實(shí)際結(jié)果與預(yù)期結(jié)果進(jìn)行比較的邏輯。圖1顯示了遵循上述步驟的標(biāo)準(zhǔn)HDL驗(yàn)證流程。
圖1:使用Testbench的HDL驗(yàn)證流程 由于Testbench是用VHDL或Verilog編寫(xiě)的,因此Testbench驗(yàn)證流程可以跨平臺(tái)和供應(yīng)商工具移植。此外,由于VHDL和Verilog是標(biāo)準(zhǔn)的非專有語(yǔ)言,因此用VHDL或Verilog編寫(xiě)的驗(yàn)證套件可以在未來(lái)的設(shè)計(jì)中毫無(wú)困難地重用。
2. Testbench構(gòu)建
由于Testbench僅用于仿真,因此它們不受適用于綜合中使用的RTL語(yǔ)言子集的語(yǔ)義約束的限制。相反,可以使用所有行為構(gòu)造。因此,Testbench可以更通用地編寫(xiě),使其更容易維護(hù)。所有Testbench均包含表1所示的基本部分。
表1:Testbench通用構(gòu)建
激勵(lì)時(shí)鐘可以很容易地在VHDL和Verilog源代碼中實(shí)現(xiàn)。以下是Testbench中經(jīng)常使用的時(shí)鐘生成VHDL和Verilog示例:
VHDL:
Verilog:
2.2 提供激勵(lì)
為了獲得Testbench驗(yàn)證結(jié)果,須向DUT提供激勵(lì)。在Testbench上使用并發(fā)激勵(lì)塊來(lái)提供,通常采用兩種方法:絕對(duì)時(shí)間激勵(lì)和相對(duì)時(shí)間激勵(lì)。在第一種方法中,相對(duì)于仿真時(shí)間零點(diǎn)指定模擬值。相比之下,相對(duì)時(shí)間激勵(lì)提供初始值,然后在重新觸發(fā)激勵(lì)之前等待事件。根據(jù)設(shè)計(jì)師的需求,這兩種方法可以在Testbench上結(jié)合使用。
表2和表3分別提供了VHDL和Verilog源代碼中的絕對(duì)時(shí)間和相對(duì)時(shí)間激勵(lì)的示例。
表2:絕對(duì)時(shí)間激勵(lì)示例
表3:相對(duì)時(shí)間激勵(lì)示例
VHDL過(guò)程塊和Verilog初始?jí)K與文件中的其他過(guò)程和初始?jí)K同時(shí)執(zhí)行。然而,在每個(gè)(進(jìn)程或初始)塊中,事件是按照寫(xiě)入的順序執(zhí)行。這意味著激勵(lì)序列在模擬時(shí)間零點(diǎn)開(kāi)始于每個(gè)并發(fā)塊。推薦使用多個(gè)塊將復(fù)雜的激勵(lì)序列分解為更可讀和可維護(hù)的代碼塊。
2.3 結(jié)果顯示
Verilog中的$display和$monitor關(guān)鍵字用于顯示結(jié)果。雖然VHDL沒(méi)有等效的顯示特定命令,但它提供了std_textio包,該包允許將文件I/O重定向到顯示終端窗口(有關(guān)此技術(shù)的示例,請(qǐng)參閱下面的自檢Testbench)。
以下是Verilog示例,其中值顯示在終端屏幕上:
$display關(guān)鍵字將帶引號(hào)的括號(hào)文本(“…”)輸出到終端窗口。$monitor關(guān)鍵字的工作方式不同,因?yàn)樗妮敵鍪鞘录?qū)動(dòng)的。在該示例中,$realtime變量(由用戶分配給當(dāng)前模擬時(shí)間)用于觸發(fā)信號(hào)列表中值的顯示。Verilog提供了額外的格式說(shuō)明符,例如,%h用于十六進(jìn)制,%d用于十進(jìn)制,%o用于八進(jìn)制格式。格式化的顯示結(jié)果如圖2所示。
圖2:仿真結(jié)果輸出到終端 2.4 其他語(yǔ)句結(jié)構(gòu) (1)force/release
force/release語(yǔ)句可用于覆蓋對(duì)寄存器或網(wǎng)絡(luò)進(jìn)行的程序分配。這些構(gòu)造通常用于強(qiáng)制特定的設(shè)計(jì)行為。一旦強(qiáng)制值被釋放,信號(hào)將保持其狀態(tài),直到新值通過(guò)過(guò)程賦值傳遞。以下是強(qiáng)制和釋放語(yǔ)句使用的示例:
(2)assign/deassign
賦值和取消賦值語(yǔ)句類(lèi)似于強(qiáng)制和釋放語(yǔ)句,但賦值和取消指派僅適用于設(shè)計(jì)中的寄存器。它們通常用于設(shè)置輸入值。與強(qiáng)制語(yǔ)句一樣,assign語(yǔ)句會(huì)覆蓋過(guò)程語(yǔ)句傳遞的值。以下是賦值和取消賦值語(yǔ)句用法的示例。
(3)timescales
時(shí)間刻度指令用于指定Testbench的單位時(shí)間步長(zhǎng)。它也會(huì)影響仿真器的精度。此指令的語(yǔ)法為:
`timescale reference_time/precision
reference_time是測(cè)量的單位時(shí)間。精度決定延遲四舍五入的精度,并設(shè)置仿真的單位時(shí)間步長(zhǎng)。以下是“時(shí)間刻度用法”的示例:
如果仿真使用定時(shí)延遲值,則模擬必須以大于最小延遲的精度運(yùn)行(以便包含延遲)。例如,如果在仿真庫(kù)中使用9ps延遲,則仿真的精度必須為1ps才能適應(yīng)9ps延遲。
(4)讀取內(nèi)存初始化文件
Verilog提供$readmemb和$readmemh命令來(lái)讀取ASCII文件以初始化內(nèi)存內(nèi)容。此命令可用于在模擬中初始化Xilinx BlockRAM或SelectRAM組件。語(yǔ)法如下:
$readmemb(“3. 簡(jiǎn)單Testbench”,design_instance);
簡(jiǎn)單的Testbench實(shí)例化用戶設(shè)計(jì),然后為其提供激勵(lì)。Testbench輸出以圖形方式顯示在仿真器的波形窗口上,或作為文本發(fā)送到用戶終端或文本文件。
下面是一個(gè)代表移位寄存器的簡(jiǎn)單Verilog設(shè)計(jì):
以下簡(jiǎn)單的Testbench示例實(shí)例化了移位寄存器設(shè)計(jì)。
上面的Testbench實(shí)例化設(shè)計(jì),設(shè)置時(shí)鐘,然后提供激勵(lì)。所有過(guò)程塊都從模擬時(shí)間零點(diǎn)開(kāi)始,并且是并發(fā)的。符號(hào)(#)指定應(yīng)用下一個(gè)激勵(lì)之前的延遲。$stop命令指示仿真器停止Testbench仿真(所有Testbench都應(yīng)包含stop命令)。最后,$monitor語(yǔ)句將ASCII格式的結(jié)果返回到屏幕或本編輯器。
下面是一個(gè)VHDL Testbench,它實(shí)例化并為上述Verilog移位寄存器設(shè)計(jì)提供激勵(lì)。
4. 自動(dòng)驗(yàn)證
建議自動(dòng)化Testbench結(jié)果驗(yàn)證,特別是對(duì)于較大的設(shè)計(jì)。自動(dòng)化減少了檢查設(shè)計(jì)正確性所需的時(shí)間,并最大限度地減少了人為錯(cuò)誤。通常使用幾種方法來(lái)自動(dòng)化Testbench驗(yàn)證:
(1)數(shù)據(jù)庫(kù)比較:首先,創(chuàng)建一個(gè)包含預(yù)期輸出的數(shù)據(jù)庫(kù)文件(“黃金向量”文件)。然后,捕獲仿真輸出并將其與黃金向量文件中的參考向量進(jìn)行比較。這種方法的缺點(diǎn)是由于沒(méi)有提供從輸出到輸入文件的指針,難以將不正確的輸出追蹤到錯(cuò)誤的來(lái)源。
(2)波形比較:波形比較可以自動(dòng)或手動(dòng)執(zhí)行。自動(dòng)方法采用Testbench比較器將黃金波形與Testbench輸出波形進(jìn)行比較。Xilinx HDL Bencher工具可用于執(zhí)行自動(dòng)波形比較。
(3)Self-Checking Testbench。自檢Testbench在運(yùn)行時(shí),而不是在仿真結(jié)束時(shí),根據(jù)實(shí)際結(jié)果檢查預(yù)期結(jié)果。由于可以在Testbench上構(gòu)建有用的錯(cuò)誤跟蹤信息來(lái)顯示設(shè)計(jì)失敗的地方,因此調(diào)試時(shí)間大大縮短。
5. Self-Checking Testbench
自檢Testbench是通過(guò)在Testbench文件中放置一系列預(yù)期向量來(lái)實(shí)現(xiàn)的。這些向量在定義的運(yùn)行時(shí)間間隔與實(shí)際仿真結(jié)果進(jìn)行比較。如果實(shí)際結(jié)果與預(yù)期結(jié)果匹配,則仿真成功。如果結(jié)果與預(yù)期不符,Testbench會(huì)報(bào)告差異。
對(duì)于同步設(shè)計(jì)來(lái)說(shuō),實(shí)現(xiàn)自檢Testbench更簡(jiǎn)單,因?yàn)榭梢栽跁r(shí)鐘邊緣或每個(gè)“n”個(gè)時(shí)鐘周期后比較預(yù)期和實(shí)際結(jié)果。比較方法也取決于設(shè)計(jì)的性質(zhì)。例如,內(nèi)存I/O自檢Testbench應(yīng)在每次向內(nèi)存位置寫(xiě)入或從內(nèi)存位置讀取新數(shù)據(jù)時(shí)檢查結(jié)果。同樣,如果一個(gè)設(shè)計(jì)使用了大量的組合塊,在指定預(yù)期結(jié)果時(shí)必須考慮組合延遲。
在自檢自檢Testbench上,以規(guī)則的運(yùn)行時(shí)間間隔將預(yù)期輸出與實(shí)際輸出進(jìn)行比較,以提供自動(dòng)錯(cuò)誤檢查。這種技術(shù)在中小型設(shè)計(jì)中效果很好。然而,由于可能的輸出組合隨著設(shè)計(jì)復(fù)雜性呈指數(shù)級(jí)增長(zhǎng),為大型設(shè)計(jì)編寫(xiě)自檢Testbench變得更加困難和耗時(shí)。
以下是用Verilog和VHDL編寫(xiě)的簡(jiǎn)單自檢Testbench的示例: Verilog示例:
這種簡(jiǎn)單的自檢Testbench設(shè)計(jì)可以移植到任何測(cè)試用例中。如果不需要在每個(gè)時(shí)鐘沿進(jìn)行檢查,則可以根據(jù)需要修改for循環(huán)。如果仿真成功,終端屏幕上會(huì)顯示以下信息:
VHDL示例:
如果檢測(cè)到錯(cuò)誤,則會(huì)在仿真器提示下顯示:
6. 編寫(xiě)Testbench指南
本節(jié)提供了編寫(xiě)Testbench的指南,規(guī)劃Testbench布局可以提高仿真驗(yàn)證結(jié)果。
(1)在編寫(xiě)Testbench之前,了解仿真器。
盡管常用的仿真工具符合HDL行業(yè)標(biāo)準(zhǔn),但這些標(biāo)準(zhǔn)并沒(méi)有解決幾個(gè)重要的仿真特定問(wèn)題。不同的模擬器具有不同的特性、能力和性能特征,并產(chǎn)生不同的仿真結(jié)果。
(2)基于事件的仿真與基于周期的仿真
仿真器器使用基于事件或基于周期的仿真方法?;谑录姆抡嫫髟谳斎?、信號(hào)或門(mén)改變值時(shí)安排仿真器事件。在基于事件的仿真器中,延遲值可以與門(mén)和網(wǎng)絡(luò)相關(guān)聯(lián),以實(shí)現(xiàn)最佳的時(shí)序模擬?;谘h(huán)的仿真器以同步設(shè)計(jì)為目標(biāo)。它們優(yōu)化組合邏輯,并在時(shí)鐘周期內(nèi)分析結(jié)果。此功能使基于循環(huán)的仿真器比基于事件的仿真器更快、更節(jié)省內(nèi)存。然而,由于基于循環(huán)的仿真器不允許詳細(xì)的時(shí)序特異性,因此它們的準(zhǔn)確性不高。
(3)避免使用無(wú)限循環(huán)
當(dāng)一個(gè)事件被添加到基于事件的仿真器中時(shí),CPU和內(nèi)存的使用率會(huì)增加,仿真處理速度也會(huì)減慢。除非對(duì)Testbench至關(guān)重要,否則不應(yīng)使用無(wú)限循環(huán)來(lái)提供設(shè)計(jì)激勵(lì)。通常,時(shí)鐘是在無(wú)限循環(huán)內(nèi)指定的(例如,Verilog中的“永遠(yuǎn)”循環(huán)),而不是其他信號(hào)事件。
(4)將激勵(lì)分解為邏輯塊
在Testbench中,所有初始(Verilog)和過(guò)程(VHDL)塊同時(shí)運(yùn)行。如果將無(wú)關(guān)的激勵(lì)分為單獨(dú)的塊,則Testbench激勵(lì)序列更容易實(shí)施和審查。由于每個(gè)并發(fā)塊都相對(duì)于模擬時(shí)間零點(diǎn)運(yùn)行,因此使用單獨(dú)的塊更容易傳遞激勵(lì)。使用單獨(dú)的激勵(lì)塊可以使Testbench更容易創(chuàng)建、維護(hù)和升級(jí)。
(5)避免顯示不重要的數(shù)據(jù)
大型設(shè)計(jì)的Testbench可能包含超過(guò)100000個(gè)事件和大量信號(hào)。顯示大量仿真數(shù)據(jù)會(huì)大大減慢仿真速度。最好每“n”個(gè)時(shí)鐘周期只對(duì)相關(guān)信號(hào)進(jìn)行采樣,以確保足夠的仿真速度。
7.高級(jí)Testbench技術(shù) (1)用task任務(wù)和process過(guò)程模塊化激勵(lì)
在創(chuàng)建更大的Testbench時(shí),應(yīng)該對(duì)激勵(lì)進(jìn)行分區(qū),以幫助代碼清晰并便于修改,并使代碼更具可讀性。以下示例中,Testbench模擬了SDRAM控制器的設(shè)計(jì)。該設(shè)計(jì)包括重復(fù)激勵(lì)塊,因此Testbench通過(guò)聲明單獨(dú)的任務(wù)來(lái)劃分激勵(lì),這些任務(wù)稍后在Testbench中調(diào)用以執(zhí)行單獨(dú)的設(shè)計(jì)功能。
Verilog示例:
這些任務(wù)指定了設(shè)計(jì)功能的單獨(dú)元素,包括讀寫(xiě)、數(shù)據(jù)讀寫(xiě)或nop(無(wú)操作)。一旦指定,這些任務(wù)可以在激勵(lì)過(guò)程中調(diào)用,如下所示:
VHDL示例:
(2)仿真中雙向信號(hào)的控制
大多數(shù)設(shè)計(jì)使用雙向信號(hào),在Testbench上必須與單向信號(hào)區(qū)別對(duì)待。
VHDL示例:
要訪問(wèn)上述示例中的雙向DATA信號(hào),可以按如下方式設(shè)置Testbench:
雙向總線由Testbench控制,雙向總線的值通過(guò)data_top信號(hào)訪問(wèn)。
Verilog示例:
Verilog Testbench可以按如下方式設(shè)置:
8.編碼風(fēng)格指南 (1)縮進(jìn)
始終縮進(jìn)代碼以使其更具可讀性。建議縮進(jìn)寬度為三到四個(gè)空格??s進(jìn)寬度為五個(gè)或更多空格通常會(huì)在右邊距留下很少的空間,而縮進(jìn)寬度小于三個(gè)空格則會(huì)導(dǎo)致縮進(jìn)太小。
(2)文件命名
在源文件名中始終保持“.v”(Verilog)或“.vhd”(VHDL)文件擴(kuò)展名。如果這些標(biāo)準(zhǔn)擴(kuò)展名被更改,一些編輯器和過(guò)濾器將無(wú)法識(shí)別源文件。
(3)信號(hào)命名
對(duì)所有用戶信號(hào)使用相同的大小寫(xiě)(建議使用小寫(xiě))。Verilog是區(qū)分大小寫(xiě)的,錯(cuò)誤的大寫(xiě)可能會(huì)導(dǎo)致設(shè)計(jì)在綜合和仿真中失敗。此外,使用一致的信號(hào)名稱格式樣式使信號(hào)名稱更容易在源文件中定位。使用簡(jiǎn)短的描述性信號(hào)名稱。短名稱更容易輸入,描述性名稱有助于記錄信號(hào)功能。
(4)注釋
自由地注釋Testbench代碼。注釋對(duì)于繼承和重用代碼的其他人來(lái)說(shuō)是無(wú)價(jià)的,注釋代碼填充了重要的細(xì)節(jié),大大提高了源代碼的清晰度和可重用性
(5)設(shè)計(jì)結(jié)構(gòu)
為每個(gè)模塊或?qū)嶓w保留一個(gè)物理文件。單獨(dú)的模塊和實(shí)體的單獨(dú)文件使設(shè)計(jì)更容易維護(hù)。
本文轉(zhuǎn)載自FPGA技術(shù)實(shí)戰(zhàn)公眾號(hào)
-
FPGA
+關(guān)注
關(guān)注
1625文章
21619瀏覽量
601146 -
硬件
+關(guān)注
關(guān)注
11文章
3201瀏覽量
66050 -
HDL
+關(guān)注
關(guān)注
8文章
326瀏覽量
47302 -
HDL設(shè)計(jì)
+關(guān)注
關(guān)注
0文章
2瀏覽量
5613
原文標(biāo)題:編寫(xiě)高效的Testbench
文章出處:【微信號(hào):FPGA研究院,微信公眾號(hào):FPGA研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論