版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
仿真驗(yàn)證與Testbench編寫5.1VerilogHDL電路仿真和驗(yàn)證概述
5.2VerilogHDL測試程序設(shè)計(jì)基礎(chǔ)5.3與仿真相關(guān)的系統(tǒng)任務(wù)
5.4信號(hào)時(shí)間賦值語句
5.5任務(wù)和函數(shù)
5.6典型測試向量的設(shè)計(jì)5.7用戶自定義元件模型5.8基本門級(jí)元件和模塊的延遲建模
5.9編譯預(yù)處理語句
5.10VerilogHDL測試方法簡介本章小結(jié)
在VerilogHDL集成電路設(shè)計(jì)過程中,設(shè)計(jì)者完成RTL級(jí)描述后需要對(duì)設(shè)計(jì)進(jìn)行設(shè)計(jì)確認(rèn)。設(shè)計(jì)確認(rèn)是設(shè)計(jì)者檢查設(shè)計(jì)中是否包含缺陷的過程。在設(shè)計(jì)中,表述不清的設(shè)計(jì)規(guī)范、設(shè)計(jì)者的錯(cuò)誤或者錯(cuò)誤地調(diào)用了元件等都可能給設(shè)計(jì)帶來缺陷。5.1VerilogHDL電路仿真和驗(yàn)證概述因此,設(shè)計(jì)確認(rèn)對(duì)于集成電路設(shè)計(jì)來說具有重要的作用。設(shè)計(jì)確認(rèn)可以通過仿真和驗(yàn)證來完成。仿真和驗(yàn)證能確保設(shè)計(jì)的完整性、可靠性、實(shí)效性以及先進(jìn)性。
仿真,也可以稱為模擬,是通過EDA仿真工具,對(duì)所設(shè)計(jì)電路或系統(tǒng)輸入測試信號(hào),然后根據(jù)其輸出信號(hào)(波形、文本或者VCD文件)與期望值進(jìn)行比較,來確認(rèn)是否得到與所期望一致的正確的設(shè)計(jì)結(jié)果,從而驗(yàn)證設(shè)計(jì)的正確性。在設(shè)計(jì)過程中,仿真是在綜合之前完成的,這就是通常所說的行為級(jí)仿真、RTL仿真或前仿真。在RTL設(shè)計(jì)階段只包含了時(shí)鐘及其時(shí)序,并未包含門延遲和線延遲。因此,RTL仿真對(duì)于時(shí)鐘來說是正確的,并且不用考慮競爭冒險(xiǎn)、毛刺、建立和保持時(shí)間以及其它一些詳細(xì)的時(shí)序問題,這樣RTL仿真就具有較快的速度。
驗(yàn)證是一系列測試平臺(tái)的集合,是一個(gè)證明設(shè)計(jì)思路如何實(shí)現(xiàn)及保證設(shè)計(jì)在功能上正確的過程。驗(yàn)證在VerilogHDL設(shè)計(jì)的整個(gè)流程中分為4個(gè)階段:階段1—功能驗(yàn)證;
階段2—綜合后驗(yàn)證;
階段3—時(shí)序驗(yàn)證;
階段4—板級(jí)驗(yàn)證。
其中前3個(gè)階段是在PC平臺(tái)上依靠EDA工具來實(shí)現(xiàn)的,最后一個(gè)階段則需要在真正的硬件平臺(tái)(FPGA、CPLD等)上進(jìn)行,需要借助一些調(diào)試工具或者專業(yè)性的分析儀來調(diào)試,因此本書所介紹的驗(yàn)證僅限于在PC平臺(tái)上運(yùn)行的前3個(gè)階段的驗(yàn)證。在測試驗(yàn)證環(huán)節(jié)中,要求測試需具備高效、完備的特性。高效是指以最短的時(shí)間發(fā)現(xiàn)錯(cuò)誤,從而能以最短的時(shí)間上市;完備是指發(fā)現(xiàn)全部的錯(cuò)誤,要求測試需達(dá)到一定的覆蓋率,包括代碼的覆蓋率和功能的覆蓋率。
目前常用的功能驗(yàn)證有三種:黑盒法、白盒法和灰盒法。
1)黑盒法
黑盒法就是把測試代碼看做一個(gè)黑盒子,測試人員完全不考慮代碼內(nèi)部的邏輯結(jié)構(gòu)和內(nèi)部特性,只依據(jù)程序的需求規(guī)格說明書,檢查程序的功能是否符合它的功能說明。驗(yàn)證人員在RTL級(jí)輸入端施加激勵(lì)信號(hào),然后將輸出值與期望值相比較,以驗(yàn)證設(shè)計(jì)的正確性。黑盒法主要有兩個(gè)優(yōu)點(diǎn):(1)簡單。驗(yàn)證者無需了解RTL級(jí)設(shè)計(jì)的細(xì)節(jié),只需根據(jù)規(guī)格說明書搭建Testbench(測試平臺(tái))。(2)易于實(shí)現(xiàn)驗(yàn)證和設(shè)計(jì)的獨(dú)立性。由于驗(yàn)證者不了解RTL級(jí)設(shè)計(jì)細(xì)節(jié),在搭建Testbench時(shí)不會(huì)受設(shè)計(jì)者思路的影響,因此能避免按RTL級(jí)設(shè)計(jì)者的實(shí)現(xiàn)思路來驗(yàn)證RTL級(jí)設(shè)計(jì)的情況。
黑盒法的主要缺點(diǎn)是可觀測性差。由于驗(yàn)證人員對(duì)內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)不了解,無法插入內(nèi)部測試點(diǎn),因此很難對(duì)錯(cuò)誤進(jìn)行迅速定位,在大規(guī)模設(shè)計(jì)中難以跟蹤錯(cuò)誤的根源。黑盒法一般適用于中小規(guī)模電路的驗(yàn)證。
2)白盒法
白盒法也稱結(jié)構(gòu)測試或邏輯驅(qū)動(dòng)測試,它是按照RTL級(jí)代碼內(nèi)部結(jié)構(gòu)進(jìn)行測試,通過測試來檢測RTL級(jí)代碼內(nèi)部實(shí)現(xiàn)是否按照設(shè)計(jì)規(guī)格說明書的規(guī)定正常執(zhí)行,檢驗(yàn)RTL級(jí)代碼中的每條路徑是否都能按預(yù)定要求正確工作。
驗(yàn)證人員是在對(duì)內(nèi)部的設(shè)計(jì)細(xì)節(jié)熟悉且能夠?qū)?nèi)部信號(hào)完全控制和觀察的情況下進(jìn)行驗(yàn)證的。
白盒法的優(yōu)點(diǎn)在于容易觀察和控制驗(yàn)證的進(jìn)展?fàn)顩r,可以根據(jù)事先設(shè)置的觀測點(diǎn),在錯(cuò)誤出現(xiàn)后很快定位問題的根源。其缺點(diǎn)則是需要耗費(fèi)很長的時(shí)間去了解RTL級(jí)的實(shí)現(xiàn)細(xì)節(jié),且難以實(shí)現(xiàn)設(shè)計(jì)與驗(yàn)證的分離,驗(yàn)證團(tuán)隊(duì)可能會(huì)受設(shè)計(jì)團(tuán)隊(duì)思路的影響,出現(xiàn)沿著設(shè)計(jì)思路去驗(yàn)證的現(xiàn)象,結(jié)果是無法證明設(shè)計(jì)的功能是否正確。
3)灰盒法
灰盒法是介于黑盒法和白盒法之間的一種測試方法?;液袦y試關(guān)注輸出對(duì)于輸入的正確性,同時(shí)也關(guān)注內(nèi)部表現(xiàn),但這種關(guān)注沒有白盒法那樣詳細(xì)、完整,只是通過一些表征性的現(xiàn)象、事件、標(biāo)志來判斷內(nèi)部的運(yùn)行狀況。在很多測試中經(jīng)常會(huì)出現(xiàn)輸出正確、內(nèi)部錯(cuò)誤的情況,如果每次都通過白盒測試來操作,效率會(huì)很低,因此可采取灰盒法。
5.2.1Testbench及其結(jié)構(gòu)
在VerilogHDL中,通常采用測試平臺(tái)(Testbench)方式進(jìn)行仿真和驗(yàn)證。在仿真時(shí),Testbench用來產(chǎn)生測試激勵(lì)給待驗(yàn)證設(shè)計(jì)(DesignUnderVerification,DUV),或者稱為待測試設(shè)計(jì)(DesignUnderTest,DUT),同時(shí)檢查DUV/DUT的輸出是否與預(yù)期的一致,從而達(dá)到驗(yàn)證設(shè)計(jì)功能的目的,如圖5.2-1所示。5.2VerilogHDL測試程序設(shè)計(jì)基礎(chǔ)
圖5.2-1Testbench結(jié)構(gòu)應(yīng)該指出的是,由于Testbench是一個(gè)測試平臺(tái),信號(hào)集成在模塊內(nèi)部,因此沒有輸入、輸出。在Testbench模塊內(nèi),例化待測設(shè)計(jì)的頂層模塊,并把測試行為的代碼封裝在內(nèi),直接對(duì)待測系統(tǒng)提供測試激勵(lì)。圖5.2-2給出了一個(gè)典型的Testbench程序結(jié)構(gòu)。
圖5.2-2典型的Testbench程序結(jié)構(gòu)下面舉例介紹測試程序中各模塊的分布。
例5.2-1T觸發(fā)器測試程序示例。
moduleTflipflop_tb;
//數(shù)據(jù)類型聲明
regclk,rst_n,T;
wiredata_out;
//對(duì)被測試模塊實(shí)例化
TFFU1(.data_out(data_out),.T(T),.clk(clk),.rst_n(rst_n));
//產(chǎn)生測試激勵(lì)
always
#5clk=~clk;
initial
begin
clk=0;
#3rst_n=0;
#5rst_n=1;
T=1;
#30T=0;
#20T=1;
end
//對(duì)輸出響應(yīng)進(jìn)行收集
initial
begin
$monitor($time,"T=%b,clk=%b,rst_n=%b,
data_out=%b",T,clk,rst_n,data_out);
end
endmodule
圖5.2-3T觸發(fā)器的仿真波形部分文本輸出結(jié)果:
0T=x,clk=0,rst_n=x,data_out=x
3T=x,clk=0,rst_n=0,data_out=0
5T=x,clk=1,rst_n=0,data_out=0
8T=1,clk=1,rst_n=1,data_out=1
10T=1,clk=0,rst_n=1,data_out=1
Testbench模塊最重要的任務(wù)就是利用各種合法的語句,產(chǎn)生適當(dāng)?shù)臅r(shí)序和數(shù)據(jù),以完成測試,并達(dá)到覆蓋率要求。一般來講,測試激勵(lì)信號(hào)在initial語句塊和always語句塊中進(jìn)行賦值,因此,與被測試模塊的輸入端口相連的輸入激勵(lì)信號(hào)定義為reg類型;與被測試模塊輸出端口相連的信號(hào)定義為wire類型,主要用于對(duì)測量結(jié)果的觀察。仿真因EDA工具和設(shè)計(jì)復(fù)雜度的不同而略有不同,對(duì)于簡單的設(shè)計(jì),特別是一些小規(guī)模的數(shù)字設(shè)計(jì)來說,一般可以直接使用開發(fā)工具內(nèi)嵌的仿真波形工具繪制激勵(lì)信號(hào),然后進(jìn)行功能仿真。另外一種較為常用的方式是,使用HDL(硬件描述語言)編制Testbench(仿真文件),通過波形或自動(dòng)比較工具,分析設(shè)計(jì)的正確性,并分析Testbench自身的覆蓋率和正確性。從圖中可以清晰地看出Testbench的主要功能:
(1)為DUT提供激勵(lì)信號(hào);
(2)正確實(shí)例化DUT;
(3)將仿真數(shù)據(jù)顯示在終端或者存為文件,也可以顯示在波形窗口中供分析檢查;
(4)復(fù)雜設(shè)計(jì)可以使用EDA工具,或者通過用戶接口自動(dòng)比較仿真結(jié)果與理想值,實(shí)現(xiàn)結(jié)果的自動(dòng)檢查。前兩點(diǎn)功能主要和Testbench的編寫方法和風(fēng)格(CodingStyle)相關(guān),后兩點(diǎn)功能主要和仿真工具的功能特性及支持的用戶接口相關(guān)。仿真工具將在后面章節(jié)中詳細(xì)介紹,本章所要論述的重點(diǎn)是如何編寫規(guī)范、高效、合理的測試程序。
Testbench設(shè)計(jì)好以后,可以為芯片設(shè)計(jì)的各個(gè)階段服務(wù)。比如,對(duì)RTL代碼、綜合網(wǎng)表和布線之后的網(wǎng)表進(jìn)行仿真時(shí),都可以采用同一個(gè)Testbench。編寫Testbench時(shí)需要注意的問題:
(1)
Testbench代碼不需要可綜合性。Testbench代碼只是硬件行為描述而不是硬件設(shè)計(jì)。Testbench只用于仿真軟件中模擬硬件功能,不會(huì)被實(shí)現(xiàn)成電路,不需要具備可綜合性。因此,在編寫Testbench的時(shí)候,要盡量使用抽象層次較高的語句,不僅具備高的代碼書寫效率,而且準(zhǔn)確、仿真效率高。
(2)行為級(jí)描述效率高。如前所述,VerilogHDL語言具備5個(gè)描述層次,分別為開關(guān)級(jí)、門級(jí)、RTL級(jí)、算法級(jí)和系統(tǒng)級(jí)。雖然所有的VerilogHDL語言都可用于Testbench中,但是行為級(jí)描述代碼具有顯著優(yōu)勢。①降低了測試代碼的書寫難度,測試人員不需要理解電路的結(jié)構(gòu)和實(shí)現(xiàn)方式,從而節(jié)約了測試代碼的開發(fā)時(shí)間。②行為級(jí)描述便于根據(jù)需要從不同層次進(jìn)行抽象設(shè)計(jì)。在高層次描述中,設(shè)計(jì)更加簡單、高效,只有在需要解析某個(gè)模塊的詳細(xì)結(jié)構(gòu)時(shí),才會(huì)使用低層次的詳細(xì)描述。③EDA工具本身就支持Testbench中的高級(jí)數(shù)據(jù)結(jié)構(gòu)和運(yùn)算,其編譯、運(yùn)行和行為級(jí)仿真速度快。
(3)掌握結(jié)構(gòu)化、程式化的描述方式。結(jié)構(gòu)化的描述有利于設(shè)計(jì)維護(hù)。由于在Testbench中,所有的initial、always以及assign語句都是同時(shí)執(zhí)行的,其中每個(gè)描述事件都是基于時(shí)間“0”點(diǎn)開始的,因此可通過這些語句將不同的測試激勵(lì)劃分開來。一般不要將所有的測試都放在一個(gè)語句塊中。5.2.2測試平臺(tái)舉例
為了驗(yàn)證設(shè)計(jì)模塊功能的正確性,需要在Testbench中編寫信號(hào)激勵(lì)給設(shè)計(jì)模塊,同時(shí)觀察這些激勵(lì)在設(shè)計(jì)模塊中的響應(yīng)是否與設(shè)計(jì)目標(biāo)值一致。
圖5.2-5中給出了一個(gè)DUT的仿真平臺(tái)。測試平臺(tái)需要產(chǎn)生時(shí)鐘信號(hào)、復(fù)位信號(hào)和一系列的仿真向量,觀察DUT的響應(yīng),確認(rèn)仿真結(jié)果。建立Testbench進(jìn)行仿真的流程分為編寫仿真激勵(lì)、搭建仿真環(huán)境、確認(rèn)仿真結(jié)果三個(gè)步驟。為一個(gè)設(shè)計(jì)建立仿真平臺(tái),將這個(gè)設(shè)計(jì)在該平臺(tái)中實(shí)例化,然后將在平臺(tái)中產(chǎn)生的測試激勵(lì)輸入給設(shè)計(jì)模塊,再觀察DUT的響應(yīng)是否與期望值相同。下面介紹組合邏輯電路和時(shí)序邏輯電路測試仿真環(huán)境的搭建。
圖5.2-5DUT仿真平臺(tái)
1.組合邏輯電路仿真環(huán)境的搭建
組合邏輯電路的設(shè)計(jì)驗(yàn)證,主要是檢查設(shè)計(jì)結(jié)果是否符合該電路真值表的功能,因此在搭建組合邏輯電路仿真環(huán)境時(shí),用initial語句塊把被測電路的輸入按照真值表提供的數(shù)據(jù)變化作為測試條件。組合邏輯電路的特點(diǎn)決定了仿真中只需對(duì)輸入信號(hào)進(jìn)行設(shè)計(jì)即可,沒有時(shí)序、定時(shí)信息和全局復(fù)位、置位等信號(hào)要求。
例5.2-2
搭建全加器的仿真環(huán)境。
全加器真值表如表5.2-1所示。
用VerilogHDL編寫的全加器程序代碼如下:
moduleadder1(a,b,ci,so,co);
inputa,b,ci;
outputso,co;
assign{co,so}=a+b+ci;
endmodule
表5.2-1全加器真值表根據(jù)全加器的真值表(表5.2-1)編寫的全加器測試程序如下:
moduleadder1_tb;
wireso,co;
rega,b,ci;
adder1U1(a,b,ci,so,co); //模塊實(shí)例化
initial //測試信號(hào)產(chǎn)生
begin
a=0;b=0;ci=0;
#20a=0;b=0;ci=1;
#20a=0;b=1;ci=0;
#20a=0;b=1;ci=1;
#20a=1;b=0;ci=0;
#20a=1;b=0;ci=1;
#20a=1;b=1;ci=0;
#20a=1;b=1;ci=1;
#200$finish;
end
endmodule
在源程序中,把全加器的輸入a、b和ci定義為reg型變量;把輸出so和co定義為wire型變量;用模塊實(shí)例化語句“adder1U1(a,b,ci,so,co);”把全加器設(shè)計(jì)電路例化到測試仿真環(huán)境中;用initial語句塊改變輸入的變化并生成測試條件,輸入的變化語句完全根據(jù)全加器的真值表編寫。仿真結(jié)果如圖5.2-6所示。
圖5.2-6全加器的仿真結(jié)果
2.時(shí)序邏輯電路仿真環(huán)境的搭建
時(shí)序邏輯電路仿真環(huán)境的搭建要求與組合邏輯電路基本相同,主要區(qū)別在于時(shí)序邏輯電路仿真環(huán)境中,需要考慮時(shí)序、定時(shí)信息和全局復(fù)位、置位等信號(hào)要求,并定義這些信號(hào)。
例5.2-3
搭建十進(jìn)制加法計(jì)數(shù)器的仿真環(huán)境。
用VerilogHDL編寫的十進(jìn)制加法計(jì)數(shù)器的源程序代碼如下:
modulecnt10(clk,rst,ena,q,cout);
inputclk,rst,ena;
output[3:0]q;
outputcout;
reg[3:0]q;
always@(posedgeclkorposedgerst)
begin
if(rst)q=4'b0000;
elseif(ena)
begin
if(q<9)q=q+1;
elseq=0;
end
end
assigncout=q[3]&q[0];
endmodule
VerilogHDL測試程序代碼如下:
modulecnt10_tb;
regclk,rst,ena;
wire[3:0]q;
wirecout;
cnt10U1(clk,rst,ena,q,cout); //模塊實(shí)例化
always#50clk=~clk; //時(shí)鐘信號(hào)產(chǎn)生
initial
begin
clk=0;rst=0;ena=1; //控制信號(hào)產(chǎn)生
#1200rst=1;
#120rst=0;
#2000ena=0;
#200ena=1;
#20000$finish;
end
endmodule
在源程序中,用模塊實(shí)例化語句“cnt10U1(clk,rst,ena,q,cout);”把十進(jìn)制計(jì)數(shù)模塊例化到仿真環(huán)境中;在always中用語句“#50clk=~clk;”產(chǎn)生周期為100(標(biāo)準(zhǔn)時(shí)間單位)的時(shí)鐘方波;用initial語句塊生成復(fù)位信號(hào)rst和使能控制信號(hào)ena的測試條件。仿真結(jié)果如圖5.2-7所示。
圖5.2-7十進(jìn)制加法計(jì)數(shù)器的仿真結(jié)果5.2.3VerilogHDL仿真結(jié)果確認(rèn)
VerilogHDL仿真結(jié)果可以通過觀察波形、觀察文本輸出、自動(dòng)檢查仿真結(jié)果和使用VCD文件等方式來確認(rèn)其正確性。
1)觀察波形
該方式即通過直接觀察各信號(hào)波形的輸出,比較測試值和期望值的大小,來確定仿真結(jié)果的正確性。圖5.2-8是ModelSim信號(hào)波形觀察窗口。這種方法的優(yōu)勢在于觀測信號(hào)比較直觀,適用于觀測時(shí)間較短的測試信號(hào)。
圖5.2-8ModelSim信號(hào)波形觀察口
2)觀察文本輸出
VerilogHDL語法中規(guī)定了一系列系統(tǒng)任務(wù),其中的打印任務(wù)主要用來協(xié)助查看仿真結(jié)果。例如,$display,即直接輸出到標(biāo)準(zhǔn)輸出設(shè)備;$monitor,即監(jiān)控參數(shù)的變化;$fdisplay,即輸出到文件;等等。下面的程序是在例5.2-2的測試平臺(tái)中增加了用于屏幕打印的任務(wù)$monitor。
moduleadder1_tb;
wireso,co;
rega,b,ci;
adder1U1(a,b,ci,so,co); //模塊實(shí)例化
initial //測試信號(hào)產(chǎn)生
begin
a=0;b=0;ci=0;
#20a=0;b=0;ci=1;
#20a=0;b=1;ci=0;
#20a=0;b=1;ci=1;
#20a=1;b=0;ci=0;
#20a=1;b=0;ci=1;
#20a=1;b=1;ci=0;
#20a=1;b=1;ci=1;
#200$finish;
end
initial$monitor($time,"%b%b%b->%b%b",a,b,ci,so,co);
endmodule
其輸出的結(jié)果是:
0000->00
20001->10
40010->10
60011->01
80100->10
3)自動(dòng)檢查仿真結(jié)果
自動(dòng)檢查仿真結(jié)果是通過在設(shè)計(jì)代碼中的關(guān)鍵節(jié)點(diǎn)添加斷言監(jiān)控器,形成對(duì)電路邏輯綜合的注釋或是對(duì)設(shè)計(jì)特點(diǎn)的說明,以提高設(shè)計(jì)模塊的觀察性。在行為約束時(shí)觀察設(shè)計(jì)的關(guān)鍵節(jié)點(diǎn)是否達(dá)到預(yù)期值,如果斷言監(jiān)控器檢查到信號(hào)沒有達(dá)到其預(yù)期值,則產(chǎn)生相應(yīng)的信息及差異的時(shí)間,這類信息通常出現(xiàn)在仿真報(bào)告、腳本或者控制信息里。
4)使用VCD文件
VerilogHDL提供一系列系統(tǒng)任務(wù)用于記錄信號(hào)值變化并保存到標(biāo)準(zhǔn)的VCD(ValueChangeDump)格式數(shù)據(jù)庫中。VCD文件是一種標(biāo)準(zhǔn)格式的波形記錄文件,只記錄發(fā)生變化的波形??梢詫⒎抡嫫髦械姆抡娼Y(jié)果輸出成一個(gè)VCD文件,然后將該VCD文件輸入給其它第三分析工具進(jìn)行分析。VCD文件將在第5.3.7節(jié)中詳細(xì)講述。5.2.4VerilogHDL仿真效率
和C/C++等軟件語言相比,VerilogHDL行為級(jí)仿真代碼的執(zhí)行時(shí)間比較長,其主要原因就是要通過串行軟件代碼完成并行語義的轉(zhuǎn)化。隨著代碼的增加,會(huì)使得仿真驗(yàn)證過程非常漫長,從而導(dǎo)致仿真效率的降低,這成為整體設(shè)計(jì)的瓶頸。即便如此,不同的設(shè)計(jì)代碼其仿真執(zhí)行效率也是不同的。下面幾點(diǎn)可以幫助設(shè)計(jì)人員提高VerilogHDL代碼的仿真代碼執(zhí)行時(shí)間。
1.減小層次結(jié)構(gòu)
仿真代碼的層次越少,執(zhí)行時(shí)間就越短。這主要是因?yàn)閰?shù)在模塊端口之間傳遞時(shí)需要消耗仿真器的執(zhí)行時(shí)間。
2.減少門級(jí)代碼的使用
由于門級(jí)建模屬于結(jié)構(gòu)級(jí)建模,自身參數(shù)建模較復(fù)雜,需要通過建模調(diào)用的方式來實(shí)現(xiàn),因此建議仿真代碼盡量使用行為級(jí)語句,建模層次越抽象,執(zhí)行時(shí)間就越短。
3.仿真精度越高,效率越低
VerilogHDL語法中提供了計(jì)時(shí)單位值和計(jì)時(shí)精度值,并且要求計(jì)時(shí)單位值大于等于計(jì)時(shí)精度值。由于在VerilogHDL模型中,所有時(shí)延都是通過單位時(shí)間進(jìn)行描述的,并且是一個(gè)相對(duì)的概念,所以計(jì)時(shí)單位值與計(jì)時(shí)精度值的差距越大,則模擬時(shí)間越長。例如包含`timescale1ns/1ps定義的代碼執(zhí)行時(shí)間就比包含`timescale1ns/1ns定義的代碼執(zhí)行時(shí)間長。因此在仿真中,需要通過具體的仿真要求,設(shè)定合適的仿真時(shí)間和分辨率,提高仿真效率。`timescale仿真時(shí)間標(biāo)度將在第5.9.3節(jié)中詳細(xì)講述。
4.進(jìn)程越少,效率越高
代碼中的語句塊越少仿真越快,例如將相同的邏輯功能分布在兩個(gè)always語句塊中,其仿真執(zhí)行時(shí)間就比利用一個(gè)always語句來實(shí)現(xiàn)的代碼長。這是因?yàn)榉抡嫫髟诓煌M(jìn)程之間進(jìn)行切換也需要時(shí)間。
5.減少仿真器的輸出顯示
VerilogHDL語言包含一些系統(tǒng)任務(wù),可以在仿真器的控制臺(tái)顯示窗口輸出一些提示信息。雖然它對(duì)于軟件調(diào)試是非常有用的,但會(huì)降低仿真器的執(zhí)行效率,因此在代碼中這一類系統(tǒng)任務(wù)不能隨意使用。
本質(zhì)上來講,減少代碼執(zhí)行時(shí)間并不一定會(huì)提高代碼的驗(yàn)證效率,因此上述建議需要和代碼的可讀性、可維護(hù)性以及驗(yàn)證覆蓋率等方面結(jié)合起來考慮。
5.3.1$display和$write
VerilogHDL中有兩種主要的標(biāo)準(zhǔn)輸出任務(wù):$display和$write。這兩個(gè)系統(tǒng)函數(shù)都用于輸出信息且語法格式相同,其語法格式分別如下:
$display("<format_specifiers>",<signal1,signal2,…,signaln>);5.3與仿真相關(guān)的系統(tǒng)任務(wù)
$write("<format_specifiers>",<signal1,signal2,…,signaln>);
其中,“<format_specifiers>”通常稱為“格式控制”,而“<signal1,signal2,…,signaln>”則為“信號(hào)輸出列表”。
雖然$display和$write的作用相同,但$display是將特定信息輸出到標(biāo)準(zhǔn)輸出設(shè)備,并且?guī)в行薪Y(jié)束字符,即自動(dòng)地在輸出后進(jìn)行換行;而$write輸出特定信息時(shí)不自動(dòng)換行。如果想在一行里輸出多個(gè)信息,可以使用$write。輸出格式說明由“%”和格式字符組成,其作用是將輸出的數(shù)據(jù)轉(zhuǎn)換成指定的格式輸出。格式說明總是由“%”字符開始的。對(duì)于不同類型的數(shù)據(jù)用不同的格式輸出。表5.3-1中給出了常用的幾種輸出格式,無論何種格式都以較短的結(jié)果輸出。表5.3-1常用的輸出格式如果需要原樣輸出的字符,即普通字符,其中一些特殊的字符可以通過表5.3-2中的轉(zhuǎn)換序列來輸出。表中的字符形式用于格式字符串參數(shù)中,用來顯示特殊的字符。表5.3-2特殊字符的輸出格式在$display和$write的參數(shù)列表中,其“信號(hào)輸出表列”是需要輸出的一些數(shù)據(jù),可以是表達(dá)式。下面舉例說明。
例5.3-1$display語句。
moduledisp_tb;
reg[31:0]rval;
pulldown(pd);
initial
begin
rval=101;
$display("\\\t%%\n\"\123"); //八進(jìn)制數(shù)123就是字符S
$display("rval=%hhex%ddecimal",rval,rval);
$display("rval=%ootal%bbinary",rval,rval);
$display("rvalhas%casciicharactervalue",rval);
$display("pdstrengthvalueis%v",pd);
$display("currentscopeis%m");
$display("%sisasciivaluefor101",101);
$write("simulationtimeis");
$write("%t\n",$time);
end
endmodule
輸出結(jié)果為
\%
"S
rval=00000065hex101decimal
rval=00000000145octal00000000000000000000000001100101binary
rvalhaseasciicharactervalue
pdstrengthvalueisStX
currentscopeisdisp
eisasciivaluefor101
simulationtimeis0在$display中,輸出列表中數(shù)據(jù)的顯示寬度是自動(dòng)按照輸出格式進(jìn)行調(diào)整的。這樣在顯示輸出數(shù)據(jù)時(shí),在經(jīng)過格式轉(zhuǎn)換以后,總是用表達(dá)式的最大可能值所占的位數(shù)來顯示表達(dá)式的當(dāng)前值。5.3.2$monitor和$strobe
$monitor、$strobe與$display、$write一樣,屬于信號(hào)的輸出顯示的系統(tǒng)任務(wù)。同時(shí),$monitor與$strobe都提供了監(jiān)控和輸出參數(shù)列表中字符或變量的值的功能。
(1)
$monitor的語法格式:
$monitor("<format_specifiers>",<signal1,signal2,…,signaln>);
例如:
$monitor(p1,p2,…,pn);任務(wù)$monitor提供了監(jiān)控和輸出參數(shù)列表中的表達(dá)式或變量值的功能。其參數(shù)列表中輸出控制格式字符串和輸出列表的規(guī)則與$display中的一樣。當(dāng)啟動(dòng)一個(gè)帶有一個(gè)或多個(gè)參數(shù)的$monitor任務(wù)時(shí),仿真器則建立一個(gè)處理機(jī)制,使得每當(dāng)參數(shù)列表中變量或表達(dá)式的值發(fā)生變化時(shí),整個(gè)參數(shù)列表中變量或表達(dá)式的值都將輸出顯示。如果同一時(shí)刻兩個(gè)或多個(gè)參數(shù)的值發(fā)生變化,則在該時(shí)刻只輸出顯示一次。在$monitor中,參數(shù)可以是$time系統(tǒng)函數(shù)。這樣,參數(shù)列表中變量或表達(dá)式的值同時(shí)發(fā)生變化的時(shí)刻可以通過標(biāo)明同一時(shí)刻的多行輸出來顯示。例如:
$monitor($time,,"rxd=%btxd=%b",rxd,txd);
在$display中也可以這樣使用。注意在上面的語句中,“,,”代表一個(gè)空參數(shù)??諈?shù)在輸出時(shí)顯示為空格。
$monitor還提供了以下兩種常用的系統(tǒng)任務(wù):
$monitoron;
$monitoroff;
$monitoron和$monitoroff任務(wù)的作用是通過打開和關(guān)閉監(jiān)控標(biāo)志來控制監(jiān)控任務(wù)$monitor的啟動(dòng)和停止,這樣,程序員可以很容易地控制$monitor的發(fā)生時(shí)間。其中$monitoroff任務(wù)用于關(guān)閉監(jiān)控標(biāo)志,停止監(jiān)控任務(wù)$monitor;$monitoron則用于打開監(jiān)控標(biāo)志,啟動(dòng)監(jiān)控任務(wù)$monitor。通常在通過調(diào)用$monitoron啟動(dòng)$monitor時(shí),不管$monitor參數(shù)列表中的值是否發(fā)生變化,總是立刻輸出顯示當(dāng)前時(shí)刻參數(shù)列表中的值,這用于在監(jiān)控的初始時(shí)刻設(shè)定初始比較值。在缺省情況下,控制標(biāo)志在仿真的起始時(shí)刻就已經(jīng)打開了。在多模塊調(diào)試的情況下,許多模塊中都調(diào)用了$monitor,但因?yàn)槿魏螘r(shí)刻只能有一個(gè)$monitor起作用,因此需配合$monitoron與$monitoroff使用,把需要監(jiān)視的模塊用$monitoron打開,在監(jiān)視完畢后及時(shí)用$monitoroff關(guān)閉,以便把$monitor讓給其它模塊使用。
$monitor與$display的不同處還在于$monitor往往在initial塊中調(diào)用,只要不調(diào)用$monitoroff,$monitor便不間斷地對(duì)所設(shè)定的信號(hào)進(jìn)行監(jiān)視。
例5.3-2$monitor系統(tǒng)任務(wù)的應(yīng)用示例。
modulemonitor_tb;
integera,b;
initialbegin
a=2;
b=4;
forever
begin
#5a=a+b;
#5b=a-1;
end
end
initial#40$finish;
initial
begin
$monitor($time,"a=%d,b=%d",a,b);
end
endmodule輸出結(jié)果:
0a=2,b=4
5a=6,b=4
10a=6,b=5
15a=11,b=5
20a=11,b=10
25a=21,b=10
30a=21,b=20
35a=41,b=20
(2)
$strobe的語法格式:
$strobe(<functions_or_signals>);
$strobe("<string_and/or_variables>",
<functions_or_signals>);
$strobe系統(tǒng)任務(wù)用于某時(shí)刻所有時(shí)間處理完后,在這個(gè)時(shí)間步的結(jié)尾輸出一行格式化的文本。VerilogHDL提供了除$strobe以外的其它幾個(gè)相關(guān)的擴(kuò)展系統(tǒng)任務(wù),其含義如下:
$strobe—在所有時(shí)間處理完后,以十進(jìn)制格式輸出一行格式化的文本;
$strobeb—在所有時(shí)間處理完后,以二進(jìn)制格式輸出一行格式化的文本;
$strobeo—在所有時(shí)間處理完后,以八進(jìn)制格式輸出一行格式化的文本;
$strobeh—在所有時(shí)間處理完后,以十六進(jìn)制格式輸出一行格式化的文本。
這些系統(tǒng)任務(wù)在指定時(shí)間顯示模擬數(shù)據(jù),但這種任務(wù)的執(zhí)行是在該特定時(shí)間步結(jié)束時(shí)才顯示模擬數(shù)據(jù)?!皶r(shí)間步結(jié)束”意味著對(duì)于指定時(shí)間步內(nèi)的所有時(shí)間都已經(jīng)處理了。
$strobe任務(wù)的參數(shù)定義和$display任務(wù)相同,但是$strobe任務(wù)在被調(diào)用時(shí)刻所有的賦值語句都完成后,才輸出相應(yīng)的文字信息。因此$strobe任務(wù)提供了另一種數(shù)據(jù)顯示機(jī)制,可以保證數(shù)據(jù)只在所有賦值語句執(zhí)行完畢后才被顯示。
例5.3-3$strobe系統(tǒng)任務(wù)的應(yīng)用示例。
modulestrobe_tb;
rega,b;
initialbegin
a=0;
$display("abydisplayis:",a);
$strobe("abystrobeis:",a);
a=1;
end
initialbegin
b<=0;
$display("bbydisplayis:",b);
$strobe("bbystrobeis:",b);
#5;
$display("#5bbydisplayis:",b);
$display("#5bbystrobeis:",b);
b<=1;
end
endmodule顯示結(jié)果:
abydisplayis:0
bbydisplayis:x
abystrobeis:1
bbystrobeis:0
#5bbydisplayis:0
#5bbystrobeis:05.3.3$time和$realtime
在VerilogHDL中有兩種類型的時(shí)間系統(tǒng)函數(shù):$time和$realtime。用這兩個(gè)時(shí)間系統(tǒng)函數(shù)可以得到當(dāng)前的仿真時(shí)刻。這兩個(gè)函數(shù)被調(diào)用后都返回當(dāng)前時(shí)刻相對(duì)仿真開始時(shí)刻的時(shí)間量值。所不同的是,$time函數(shù)以64位整數(shù)值的形式返回仿真時(shí)間,而$realtime函數(shù)則以實(shí)型數(shù)據(jù)返回仿真時(shí)間。
(1)系統(tǒng)函數(shù)$time。$time可以返回一個(gè)64比特整數(shù)表示的當(dāng)前仿真時(shí)刻值,該時(shí)刻是以模塊的開始仿真時(shí)間為基準(zhǔn)的。
例5.3-4$time系統(tǒng)任務(wù)的應(yīng)用示例。
`timescale1ns/1ns
moduletime_tb;
regts;
parameterdelay=2;
initialbegin
#delayts=1;
#delayts=0;
#delayts=1;
#delayts=0;
end
initial
$monitor($time,,,"ts=%b",ts); //使用函數(shù)$time
endmodule
輸出結(jié)果:
0ts=x
3ts=1
5ts=0
8ts=1
10ts=0
(2)系統(tǒng)函數(shù)$realtime。$realtime和$time的作用是一樣的,只是$realtime返回的時(shí)間數(shù)字是一個(gè)實(shí)型數(shù),該數(shù)字也是以時(shí)間尺度為基準(zhǔn)的。
例5.3-5$realtime系統(tǒng)任務(wù)的應(yīng)用示例。
`timescale1ns/1ns
modulerealtime_tb;
regset;
parameterp=2;
initial
begin
$monitor($realtime,,"set=b%",set); //使用函數(shù)$realtime
#pset=0;
#pset=1;
end
endmodule
輸出結(jié)果:
0set=x
2set=0
4set=15.3.4$finish和$stop
系統(tǒng)任務(wù)$finish和$stop用于對(duì)仿真過程進(jìn)行控制,分別表示結(jié)束仿真和中斷仿真。其語法格式分別如下:
$finish;
$finish(n);
$stop;
$stop(n);
其中,n是參數(shù),可以取0、1或2幾個(gè)值,含義如表5.3-3所示。表5.3-3n的取值及其含義系統(tǒng)任務(wù)$finish的作用是退出仿真器,返回主操作系統(tǒng),也就是結(jié)束仿真過程。任務(wù)$finish可以帶參數(shù),根據(jù)參數(shù)的值輸出不同的特征信息;如果不帶參數(shù),默認(rèn)$finish的參數(shù)值為1。
系統(tǒng)任務(wù)$stop的作用是把EDA工具(例如仿真器)置成暫停模式,在仿真環(huán)境下給出一個(gè)交互式的命令提示符,將控制權(quán)交給用戶。該任務(wù)可以帶有參數(shù)表達(dá)式。根據(jù)參數(shù)值(0,1或2)的不同,輸出不同的信息。參數(shù)值越大,輸出的信息越多。
例5.3-6$finish系統(tǒng)任務(wù)的應(yīng)用示例。
modulefinish_tb;
integera,b;
initialbegin
a=2;
b=4;
foreverbegin
#5a=a+b;
#5b=a-1;
end
end
initial#40$finish;
initialbegin
$monitor($time,"a=%d,b=%d",a,b);
end
endmodule
例中,程序執(zhí)行到第40個(gè)時(shí)間單位時(shí)退出仿真器。
例5.3-7$stop系統(tǒng)任務(wù)的應(yīng)用示例。
modulestop_tb;
integera,b;
initialbegin
a=2;
b=4;
foreverbegin
#5a=a+b;
#5b=a-1;
end
end
initial#40$stop;
initialbegin
$monitor($time,"a=%d,b=%d",a,b);
end
endmodule
例中,程序執(zhí)行到第40個(gè)時(shí)間單位時(shí)停止仿真,將EDA仿真器設(shè)置為暫停模式。5.3.5$readmemh和$readmemb
VerilogHDL程序中的系統(tǒng)任務(wù)$readmemb和$readmemh用來從文件中讀取數(shù)據(jù)到存儲(chǔ)器中。這兩個(gè)系統(tǒng)任務(wù)可以在仿真的任何時(shí)刻被執(zhí)行使用,其語法格式分別如下:
$readmemb("<file_name>",<memory_name>);
$readmemb("<file_name>",<memory_name>,<start_addr>);
$readmemb("<file_name>",<memory_name>,<start_addr>,<finish_addr>);
$readmemh("<file_name>",<memory_name>);
$readmemh("<file_name>",<memory_name>,<start_addr>);
$readmemh("<file_name>",<memory_name>,<start_addr>,<finish_addr>);
在這兩個(gè)系統(tǒng)任務(wù)中,被讀取的數(shù)據(jù)文件的內(nèi)容只能包含空白位置(空格,換行,制表格(tab)和form-feeds)、注釋行(//形式的和/*…*/形式的都允許)、二進(jìn)制或十六進(jìn)制的數(shù)字。數(shù)字中不能包含位寬說明和格式說明,對(duì)于$readmemb系統(tǒng)任務(wù),每個(gè)數(shù)字必須是二進(jìn)制數(shù)字;對(duì)于$readmemh系統(tǒng)任務(wù),每個(gè)數(shù)字必須是十六進(jìn)制數(shù)字。讀取數(shù)據(jù)文件中的不定值(x或X)、高阻值(z或Z)和下劃線(_)的使用方法及代表的意義與一般VerilogHDL程序中的使用方法及代表的意義是一樣的。另外,數(shù)字必須用空白位置或注釋行分隔開。
例5.3-8$readmemh和$readmemb系統(tǒng)任務(wù)的應(yīng)用示例。
moduleread_mem_tb;
reg[7:0]memory_b[0:7];
reg[31:0]memory_h[0:31];
integeri;
initialbegin
//把數(shù)據(jù)文件init_b.txt讀入存儲(chǔ)器中的給定地址
$readmemb("init_b.txt",memory_b);
//把數(shù)據(jù)文件init_h.txt讀入存儲(chǔ)器中的給定地址
$readmemb("init_h.txt",memory_h);
//顯示初始化后的存儲(chǔ)器內(nèi)容
for(i=0;i<8;i=i+1)
begin
$display("memory_b[%0d]=%b",i,memory_b[i]);
$display("memory_h[%0h]=%h",i,memory_h[i]);
end
end
endmodule
文件init_b.txt和init_h.txt包含初始化數(shù)據(jù)。用@<address>在數(shù)據(jù)文件中指定地址。其中,“init_b.txt”指定二進(jìn)制數(shù)據(jù)從第二位地址開始寫入;而“init_h.txt”指定十六進(jìn)制數(shù)據(jù)從第一位地址寫入。樣本文件如下。
init_b.txt文件:
@002
1111111101010101
0000000010101010
@006
1111zzzz00001111
init_h.txt文件:
@001
00000000000000000000000000000011
00000000000000000000000000000111
00000000000000000000000000001111
000000000000000000000000000111115.3.6$random
$random是產(chǎn)生隨機(jī)數(shù)的系統(tǒng)函數(shù),每次調(diào)用該函數(shù)將返回一個(gè)32位的隨機(jī)數(shù),該隨機(jī)數(shù)是一個(gè)帶符號(hào)的整型數(shù)。其語法格式如下:
$random%<number>;
該系統(tǒng)函數(shù)提供了一個(gè)產(chǎn)生隨機(jī)數(shù)的手段。當(dāng)函數(shù)被調(diào)用時(shí)返回一個(gè)32bit的隨機(jī)數(shù)。它是一個(gè)帶符號(hào)的整型數(shù)。
$random的一般用法:
$ramdom%b;
其中b為一常數(shù)且要求大于零,它給出了一個(gè)范圍在(-b+1)到(b-1)之間的隨機(jī)數(shù)。
例5.3-9$random系統(tǒng)任務(wù)的應(yīng)用實(shí)例。
`timescale1ns/1ns
modulerandom_pulse(dout);
output[9:0]dout;
regdout;
integerdelay1,delay2,k;
initial
begin
#10dout=0;
for(k=0;k<100;k=k+1)
begin
delay1=20*({$random}%6); //delay1在0~100ns的范圍變化
delay2=20*(1+{$random}%3); //delay2在20~60ns的范圍變化
#delay1dout=1<<({$random}%10);
//dout的0~9位中隨機(jī)出現(xiàn)1,且出現(xiàn)的時(shí)間在0~100ns的范圍變化
#delay2dout=0;
//脈沖的寬度在20~60ns的范圍變化
end
end
endmodule5.3.7值變轉(zhuǎn)儲(chǔ)文件系統(tǒng)任務(wù)
值變轉(zhuǎn)儲(chǔ)文件(ValueChangeDump-VCD)是一個(gè)ASCII文件,它包括仿真時(shí)間、范圍與信號(hào)的定義以及仿真運(yùn)行過程中信號(hào)值的變化等信息。設(shè)計(jì)中的所有信號(hào)或者選定的信號(hào)集合在仿真過程中都可以被寫入VCD文件。后處理工具可以把VCD文件作為輸入,并把層次信息、信號(hào)值和信號(hào)波形顯示出來。對(duì)于大規(guī)模設(shè)計(jì)的仿真,設(shè)計(jì)者都可以把選定的信號(hào)轉(zhuǎn)儲(chǔ)到VCD文件中,并使用后處理工具調(diào)試、分析和驗(yàn)證仿真輸出結(jié)果。調(diào)試過程中VCD文件的使用流程如圖5.3-1所示。
圖5.3-1調(diào)試過程中VCD文件的使用流程
VerilogHDL提供了系統(tǒng)任務(wù)來選擇要轉(zhuǎn)儲(chǔ)的模塊實(shí)例或者模塊實(shí)例信號(hào)($dumpvars),選擇VCD文件的名稱($dumpfile),選擇轉(zhuǎn)儲(chǔ)過程的起點(diǎn)和終點(diǎn)($dumpon和$dumpoff),選擇生成監(jiān)測點(diǎn)($dumpall)。
(1)
$dumpfile用于指定VCD文件名。若不指定VCD文件,則由仿真器指定一個(gè)默認(rèn)文件。例如,仿真信息轉(zhuǎn)儲(chǔ)到myfile.dmp文件:
$dumpfile("myfile.dmp");
(2)
$dumpvars用于轉(zhuǎn)儲(chǔ)模塊中的信號(hào)。
例如,若沒有指定變量范圍,則把設(shè)計(jì)中的全部信號(hào)都轉(zhuǎn)儲(chǔ):
$dumpvars;
轉(zhuǎn)儲(chǔ)模塊實(shí)例top中的信號(hào):
$dumpvars(1,top); //只轉(zhuǎn)儲(chǔ)top下的第一層信號(hào)
$dumpvars(2,top.m1); //轉(zhuǎn)儲(chǔ)top.m1模塊以下兩層的信號(hào)
$dumpvars(0,top.m1); //數(shù)字0表示轉(zhuǎn)儲(chǔ)top.m1模塊下面各層的所有信號(hào)
(3)
$dumpon和$dumpoff用于啟動(dòng)和停止轉(zhuǎn)儲(chǔ)過程。例如:
initial
begin
$dumpon; //啟動(dòng)轉(zhuǎn)儲(chǔ)過程
#1000$dumpoff; //過了1000個(gè)仿真時(shí)間單位后,停止轉(zhuǎn)儲(chǔ)過程
end
(4)
$dumpall用于生成一個(gè)檢查點(diǎn),轉(zhuǎn)儲(chǔ)所有VCD變量的當(dāng)前值。
(5)
$dumplimit用于指定VCD文件的最大長度(字節(jié))。例如:
$dumplimit(1024); //VCD文件的最大長度為1024字節(jié)
(6)
$dumpflush用于刷新操作系統(tǒng)VCD文件緩沖區(qū)中的數(shù)據(jù)。例如:
$dumpflush; //轉(zhuǎn)儲(chǔ)恢復(fù)到刷新以前的狀態(tài)
$dumpfile和$dumpvars任務(wù)通常在仿真開始時(shí)指定。$dumpon、$dumpoff和$dumpall任務(wù)在仿真過程中控制轉(zhuǎn)儲(chǔ)過程。表5.3-4是擴(kuò)展的VCD文件。表5.3-4擴(kuò)展的VCD文件例5.3-10
以脈沖計(jì)數(shù)器為例說明VCD的使用。
程序如下:
modulecount(clk,count);
inputclk;
outputreg[0:3]count;
initial count='d1;
always@(posedgeclk)
begin
count=count+1;
end
endmodule測試程序如下:
modulecounter_tb;
regclock,up_dn;
wire[0:3]cnt_out;
parameterON_DELAY=1,OFF_DELAY=2;
localparamDUMP_FILE="count.vcd";
localparamDUMP_DONE=200;
countucud(clock,cnt_out);
always
begin
clock=1;
#ON_DELAY;
clock=0;
#OFF_DELAY;
end
initial
begin
#DUMP_DONE$dumpflush;
$stop;
end
initial
begin
$dumpfile(DUMP_FILE);
$dumplimit(1024);
$dumpvars(0,test_counter);
$dumpvars(0,ucud.count,ucud.clk,);
end
initial
begin
$dumpportslimit(10000,"count.evcd");
#10;
$dumpports(ucud,"count.evcd");
#40;
$dumpportsall("count.evcd");
#30;
$dumpportsoff("count.evcd");
#20;
$dumpportson("count.evcd");
$dumpportsall("count.evcd");
$dumpportsflush("count.evcd");
end
endmodule
VCD文件是ASCII文件,所包含的信息如下:
(1)文件頭信息:提供日期、仿真器版本和時(shí)間刻度單位。
(2)節(jié)點(diǎn)信息:定義所轉(zhuǎn)儲(chǔ)變量的范圍和類型。
(3)值的變化情況:實(shí)際取值隨時(shí)間變化的信息,同時(shí)記錄絕對(duì)仿真時(shí)間。
其中生成的拓展VCD文件如下:
$date
FriApr0814:59:532011
$end
$version
ModelSimVersion6.5c
$end
$timescale
1ns
$end
$scopemodulecounter_tb$end
$varparameter32!ON_DELAY$end
$varparameter32"OFF_DELAY$end
$varparameter72#DUMP_FILE$end
$varparameter32$DUMP_DONE$end
$varreg1%clock$end
$varreg1&up_dn$end
$varwire1'cnt_out[0]$end
$varwire1(cnt_out[1]$end
$varwire1)cnt_out[2]$end
$varwire1*cnt_out[3]$end
$scopemoduleucud$end
$varwire1+clk$end
$varreg4,count[0:3]$end
$varwire1+clk$end
$upscope$end
$upscope$end
$enddefinitions$end
有一些具有圖形顯示功能的后處理工具可以供商業(yè)上使用,它們目前是仿真和調(diào)試過程的重要組成部分。對(duì)于大規(guī)模的仿真,設(shè)計(jì)者難以分析$display和$monitor語句的輸出。從仿真波形圖來分析結(jié)果更加直觀。VCD之外的其它格式也已經(jīng)出現(xiàn),但是VCD仍然是最流行的VerilogHDL仿真器轉(zhuǎn)儲(chǔ)格式。
VCD文件可能變得非常龐大(對(duì)大規(guī)模設(shè)計(jì)而言,VCD文件的大小可能達(dá)到數(shù)百兆字節(jié)),因而只能選擇那些需要檢查的信號(hào)進(jìn)行轉(zhuǎn)儲(chǔ)。
VCD數(shù)據(jù)庫是仿真過程中數(shù)據(jù)信號(hào)變化的記錄,它只記錄用戶指定的信號(hào)。使用VCD系統(tǒng)任務(wù)時(shí)需要注意如下事項(xiàng):
(1)用戶可以用$dump*系統(tǒng)任務(wù)打開一個(gè)數(shù)據(jù)庫,保存信號(hào)并控制信號(hào)的保存。除$dumpvars外,其它任務(wù)的作用都比較直觀。
(2)必須首先使用$dumpfile系統(tǒng)任務(wù),并且在一次仿真中只能打開一個(gè)VCD數(shù)據(jù)庫。
(3)在仿真前(時(shí)間0前)必須先指定要觀測的波形,這樣才能看到信號(hào)完整的變化過程。
(4)在仿真時(shí),定期地將數(shù)據(jù)保存到磁盤是一個(gè)良好的習(xí)慣,因?yàn)橐坏┫到y(tǒng)出現(xiàn)問題數(shù)據(jù)也不會(huì)全部丟失。
(5)
VCD數(shù)據(jù)庫不記錄仿真結(jié)束時(shí)的數(shù)據(jù)。因此如果希望看到最后一次數(shù)據(jù)變化后的波形,必須在結(jié)束仿真前使用$dumpall。
在集成電路設(shè)計(jì)和驗(yàn)證階段,經(jīng)常需要對(duì)特定信號(hào)進(jìn)行延遲來實(shí)現(xiàn)相應(yīng)的時(shí)序控制,或者避免信號(hào)沖突形成電路中的熱點(diǎn)。信號(hào)的時(shí)間延遲可以通過兩類方式來完成:一類是延遲控制,它是為行為語句的執(zhí)行指定一個(gè)延遲時(shí)間的信號(hào)時(shí)間延遲方式,5.4信號(hào)時(shí)間賦值語句可以分為串行延遲控制、并行延遲控制、阻塞式延遲控制和非阻塞式延遲控制;另一類是事件控制,它是為行為語句的執(zhí)行指定觸發(fā)事件的信號(hào)時(shí)間延遲方式,可以分為邊沿觸發(fā)事件控制和電平敏感事件控制。圖5.4-1為信號(hào)的時(shí)間延遲分類。
圖5.4-1信號(hào)的時(shí)間延遲分類5.4.1時(shí)間延遲的語法說明
延遲語句用于對(duì)各條語句的執(zhí)行時(shí)間進(jìn)行控制,從而快速滿足用戶的時(shí)序要求。VerilogHDL語言中延遲控制的語法格式有兩類:
#<延遲時(shí)間>行為語句;
和
#<延遲時(shí)間>;其中,符號(hào)“#”是延遲控制的關(guān)鍵字符,“延遲時(shí)間”可以是直接指定的延遲時(shí)間量,或者以參數(shù)的形式給出。在仿真過程中,所有延遲時(shí)間都根據(jù)時(shí)間單位定義。例如:
#2Sum=A^B;//#2指定2個(gè)時(shí)間單位后,將A異或B的值賦給Sum
根據(jù)時(shí)間控制部分在過程賦值語句中出現(xiàn)的位置,可以把過程賦值語句中的時(shí)間控制方式分為外部時(shí)間控制方式和內(nèi)部時(shí)間控制方式。
(1)外部時(shí)間控制方式:時(shí)間控制出現(xiàn)在整個(gè)過程賦值語句的最左端,也就是出現(xiàn)賦值目標(biāo)變量的左邊的時(shí)間控制方式。其語法結(jié)構(gòu)舉例如下:
#5a=b;
這在仿真執(zhí)行時(shí)就相當(dāng)于執(zhí)行了如下幾條語句:
initial
begin
#5;
a=b;
end
(2)內(nèi)部時(shí)間控制方式:過程賦值語句中的時(shí)間控制部分還可以出現(xiàn)在“賦值操作符”和“賦值表達(dá)式”之間的時(shí)間控制方式。其語法結(jié)構(gòu)舉例如下:
a=#5b;
其中,時(shí)間控制部分“#5”就出現(xiàn)在賦值操作符“=”和賦值表達(dá)式“b”的中間,因此在這條過程賦值語句內(nèi)帶有內(nèi)部時(shí)間控制方式的時(shí)間控制。它在執(zhí)行時(shí)就相當(dāng)于執(zhí)行了如下幾條語句:
initial
begin
temp=b;//先求b的值
#5;
a=temp;
end5.4.2時(shí)間延遲的描述形式
此處,時(shí)間延遲的描述形式是指延遲控制的描述形式,分為串行延遲控制、并行延遲控制、阻塞式延遲控制和非阻塞式延遲控制四種形式。下面以實(shí)現(xiàn)兩組不同波形的信號(hào)為例(圖5.4-2中的q0_out和q1_out)來說明四種不同時(shí)間延遲的描述形式。
圖5.4-2兩組示例波形
1.串行延遲控制
串行延遲控制是最為常見的信號(hào)延遲控制,它是由begin-end過程塊加上延遲賦值語句構(gòu)成,其中延遲賦值語句可以為外部時(shí)間控制方式,也可以為內(nèi)部時(shí)間控制方式。在“延遲時(shí)間”之后也可根據(jù)實(shí)際情況來確定是否執(zhí)行相應(yīng)的行為語句。
若在“延遲時(shí)間”后面有相應(yīng)的行為語句,則仿真進(jìn)程遇到這條帶有延遲控制的行為語句后并不立即執(zhí)行行為語句指定的操作,而是等到“延遲時(shí)間”所指定的時(shí)間量過去后才真正開始執(zhí)行行為語句指定的操作。
例5.4-1以VerilogHDL串行延遲控制方式設(shè)計(jì)圖5.4-2所示信號(hào)。
`timescale1ns/1ns
moduleserial_delay(q0_out,q1_out);
outputq0_out,q1_out;
regq0_out,q1_out;
initial
begin
q0_out=1'b0;
#50q0_out=1'b1;
#100
q0_out=1'b0;
#100
q0_out=1'b1;
#50q0_out=1'b0;
#100
q0_out=1'b1;
#50q0_out=1'b0;
#50q0_out=1'b1;
#50q0_out=1'b0;
end
initial
begin
q1_out=1'b0;
#100
q1_out=1'b1;
#100
q1_out=1'b0;
#50q1_out=1'b1;
#100
q1_out=1'b0;
#50q1_out=1'b1;
#100
q1_out=1'b0;
#50q1_out=1'b1;
#50q1_out=1'b0;
end
endmodule在上述代碼中,產(chǎn)生指定的輸出信號(hào)q0_out和q1_out是通過串行延遲控制方式實(shí)現(xiàn)的,即每一個(gè)延遲賦值語句是在其前一個(gè)賦值語句執(zhí)行完成后,延遲相應(yīng)的時(shí)間單位,才開始執(zhí)行當(dāng)前的賦值語句。
2.并行延遲控制
并行延遲控制方式是通過fork-join過程塊加上延遲賦值語句構(gòu)成的,其中延遲賦值語句同串行延遲控制方式一樣,既可以是外部時(shí)間控制方式,也可以是內(nèi)部時(shí)間控制方式。在“延遲時(shí)間”之后也可根據(jù)實(shí)際情況來確定是否執(zhí)行相應(yīng)的行為語句。
在“延遲時(shí)間”后面有相應(yīng)的行為語句,則仿真進(jìn)程遇到這條帶有延遲控制的行為語句后并不立即執(zhí)行行為語句指定的操作,而是等到“延遲時(shí)間”所指定的時(shí)間量過去后才真正開始執(zhí)行行為語句指定的操作。但并行延遲控制方式與串行延遲控制方式的不同之處在于,并行延遲控制方式中的多條延遲語句是并行執(zhí)行的,并不需要等待上一條語句執(zhí)行完成后才開始執(zhí)行當(dāng)前的語句。
例5.4-2
以VerilogHDL并行延遲控制方式設(shè)計(jì)圖5.4-2所示信號(hào)。
`timescale1ns/1ns
moduleparallel_delay(q0_out,q1_out);
outputq0_out,q1_out;
regq0_out,q1_out;
initial
fork
q0_out=1'b0;
#50q0_out=1'b1;
#150 q0_out=1'b0;
#250 q0_out=1'b1;
#300 q0_out=1'b0;
#400 q0_out=1'b1;
#450 q0_out=1'b0;
#500 q0_out=1'b1;
#600 q0_out=1'b0;
join
initial
fork
q1_out=1'b0;
#100 q1_out=1'b1;
#200 q1_out=1'b0;
#250 q1_out=1'b1;
#350 q1_out=1'b0;
#400 q1_out=1'b1;
#500 q1_out=1'b0;
#550 q1_out=1'b1;
#600 q1_out=1'b0;
join
endmodule在上述代碼中,產(chǎn)生指定的輸出信號(hào)q0_out和q1_out是通過并行延遲控制方式實(shí)現(xiàn)的,即每一個(gè)延遲賦值語句不用等待前一個(gè)延遲賦值語句執(zhí)行完成后才開始執(zhí)行,所有的延遲賦值語句都是在仿真進(jìn)程的起始時(shí)刻開始執(zhí)行的。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版新型建筑項(xiàng)目施工安全免責(zé)協(xié)議書3篇
- 2025版智慧物流合作投資項(xiàng)目協(xié)議書范本3篇
- 2025年新型環(huán)保材料應(yīng)用個(gè)人住宅裝修合同
- 2025年項(xiàng)目合作商業(yè)機(jī)密保密協(xié)議書2篇
- 2025年全球及中國低溫硅導(dǎo)熱液行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年全球及中國核電蒸發(fā)器U型管行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025-2030全球經(jīng)典拉線驅(qū)動(dòng)探頭行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025-2030全球氧化鋯蒸發(fā)材料行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025年度個(gè)人住房借款合同模板(含二次抵押)3篇
- 2025年度個(gè)人二手房交易合同范本解析
- 廣東省茂名市電白區(qū)2024-2025學(xué)年七年級(jí)上學(xué)期期末質(zhì)量監(jiān)測生物學(xué)試卷(含答案)
- 2024版?zhèn)€人私有房屋購買合同
- 2024爆炸物運(yùn)輸安全保障協(xié)議版B版
- 2025年度軍人軍事秘密保護(hù)保密協(xié)議與信息安全風(fēng)險(xiǎn)評(píng)估合同3篇
- 《食品與食品》課件
- 讀書分享會(huì)《白夜行》
- 中國服裝零售行業(yè)發(fā)展環(huán)境、市場運(yùn)行格局及前景研究報(bào)告-智研咨詢(2025版)
- 光伏工程施工組織設(shè)計(jì)
- DB4101-T 121-2024 類家庭社會(huì)工作服務(wù)規(guī)范
- 化學(xué)纖維的鑒別與測試方法考核試卷
- 2024-2025學(xué)年全國中學(xué)生天文知識(shí)競賽考試題庫(含答案)
評(píng)論
0/150
提交評(píng)論