Verilog HDL數(shù)字集成電路設(shè)計原理與應(yīng)用(第三版)課件 第5章 仿真驗證與Testbench編寫_第1頁
Verilog HDL數(shù)字集成電路設(shè)計原理與應(yīng)用(第三版)課件 第5章 仿真驗證與Testbench編寫_第2頁
Verilog HDL數(shù)字集成電路設(shè)計原理與應(yīng)用(第三版)課件 第5章 仿真驗證與Testbench編寫_第3頁
Verilog HDL數(shù)字集成電路設(shè)計原理與應(yīng)用(第三版)課件 第5章 仿真驗證與Testbench編寫_第4頁
Verilog HDL數(shù)字集成電路設(shè)計原理與應(yīng)用(第三版)課件 第5章 仿真驗證與Testbench編寫_第5頁
已閱讀5頁,還剩68頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

5.1VerilogHDL電路仿真和驗證概述

5.2VerilogHDL測試程序設(shè)計基礎(chǔ)

5.3與仿真相關(guān)的系統(tǒng)任務(wù)

5.4信號時間賦值語句

5.5任務(wù)和函數(shù)

5.6典型測試向量的設(shè)計

5.7基本門級元件和模塊的延時建模

5.8編譯預(yù)處理語句5.1VerilogHDL電路仿真和驗證概述在VerilogHDL集成電路設(shè)計過程中,設(shè)計者完成RTL級描述后需要進行設(shè)計確認。設(shè)計確認是設(shè)計者檢查設(shè)計中是否包含缺陷的過程。在設(shè)計中,表述不清的設(shè)計規(guī)范、設(shè)計者的錯誤或者錯誤地調(diào)用了元件等都可能給設(shè)計帶來缺陷。因此,設(shè)計確認對于集成電路設(shè)計來說具有重要的作用。設(shè)計確認可以通過仿真和驗證來完成。仿真和驗證能確保設(shè)計的完整性、可靠性、實效性以及先進性。仿真也可以稱為模擬,是通過EDA仿真工具對所設(shè)計電路或系統(tǒng)輸入測試信號,然后根據(jù)其輸出信號(波形、文本或者VCD文件)與期望值進行比較,來確認是否得到與期望一致的設(shè)計結(jié)果,從而驗證設(shè)計的正確性。在設(shè)計過程中,仿真是在綜合之前完成的,這就是通常所說的行為級仿真、RTL仿真或前仿真。RTL設(shè)計階段只包含了時鐘及其時序,并未包含門延時和線延時。因此,RTL仿真對于時鐘來說是正確的,并且不用考慮競爭冒險、毛刺、建立和保持時間以及其他一些詳細的時序問題,這樣RTL仿真就具有較快的速度。驗證是一系列測試平臺的集合,是一個證明設(shè)計思路如何實現(xiàn)及保證設(shè)計在功能上正確的過程。驗證在VerilogHDL設(shè)計的整個流程中分為4個階段:階段1—功能驗證;階段2—綜合后驗證;階段3—時序驗證;階段4—板級驗證。其中前3個階段是在PC平臺上依靠EDA工具來實現(xiàn)的,最后一個階段則需要在真正的硬件平臺(FPGA、CPLD等)上進行,需要借助一些調(diào)試工具或者專業(yè)的分析儀來調(diào)試,因此本書所介紹的驗證僅限于在PC平臺上運行的前3個階段的驗證。在測試驗證環(huán)節(jié),要求測試需具備高效、完備的特性。高效是指以最短的時間發(fā)現(xiàn)錯誤,從而能以最短的時間上市;完備是指發(fā)現(xiàn)全部的錯誤,要求測試達到一定的覆蓋率,包括代碼的覆蓋率和功能的覆蓋率。1.驗證方法對于功能驗證,根據(jù)驗證的透明度,可以分為黑盒法、白盒法和灰盒法。1)黑盒法黑盒法就是把測試代碼看作一個黑盒子,測試人員完全不考慮代碼內(nèi)部的邏輯結(jié)構(gòu)和內(nèi)部特性,只依據(jù)程序的需求規(guī)格說明書,檢查程序的功能是否符合它的功能說明。驗證人員在RTL級輸入端施加激勵信號,然后將輸出值與期望值相比較,以驗證設(shè)計的正確性。

黑盒法主要有兩個優(yōu)點:①

簡單。驗證者無須了解RTL級設(shè)計的細節(jié),只需根據(jù)規(guī)格說明書搭建Testbench(測試平臺)。②

易于實現(xiàn)驗證和設(shè)計的獨立。由于驗證者不了解RTL級設(shè)計細節(jié),在搭建Testbench時不會受設(shè)計者思路的影響,因此能避免按RTL級設(shè)計者的實現(xiàn)思路來驗證RTL級設(shè)計的情況。黑盒法的主要缺點是可觀測性差。由于驗證人員對內(nèi)部的實現(xiàn)細節(jié)不了解,無法插入內(nèi)部測試點,因此很難對錯誤進行迅速定位,在大規(guī)模設(shè)計中難以跟蹤錯誤的根源。黑盒法一般適用于中小規(guī)模電路的驗證。2)白盒法白盒法也稱結(jié)構(gòu)測試或邏輯驅(qū)動測試,它是按照RTL級代碼內(nèi)部結(jié)構(gòu)進行測試的,通過測試來檢測RTL級代碼內(nèi)部實現(xiàn)是否按照設(shè)計規(guī)格說明書的規(guī)定正常執(zhí)行,檢驗RTL級代碼中的每條路徑是否都能按預(yù)定要求正確工作。驗證人員是在對內(nèi)部的設(shè)計細節(jié)熟悉且能夠?qū)?nèi)部信號完全控制和觀察的情況下進行驗證的。白盒法的優(yōu)點在于容易觀察和控制驗證的進展狀況,可以根據(jù)事先設(shè)置的觀測點,在錯誤出現(xiàn)后很快定位問題的根源。其缺點則是需要耗費很長的時間了解RTL級的實現(xiàn)細節(jié),且難以實現(xiàn)設(shè)計與驗證的分離,驗證團隊可能會受設(shè)計團隊思路的影響,出現(xiàn)沿著設(shè)計思路驗證的現(xiàn)象,結(jié)果是無法證明設(shè)計的功能是否正確。3)灰盒法灰盒法是介于黑盒法和白盒法之間的一種測試方法?;液袦y試關(guān)注輸出對于輸入正確性的影響,同時也關(guān)注內(nèi)部表現(xiàn),但這種關(guān)注沒有白盒法那樣詳細、完整,只是通過一些表征性的現(xiàn)象、事件、標志來判斷內(nèi)部的運行狀況。在很多測試中經(jīng)常會出現(xiàn)輸出正確、內(nèi)部錯誤的情況,如果每次都通過白盒測試來操作,則效率會很低,因此可采取灰盒法。2.驗證技術(shù)在功能驗證中主要采用的技術(shù)包括動態(tài)仿真、形式驗證和硬件加速驗證。1)動態(tài)仿真動態(tài)仿真是功能驗證中最常用的方式,該方式是將編寫好的激勵序列送入被測電路輸入端,檢測輸出是否符合期望值。根據(jù)激勵產(chǎn)生的方式,動態(tài)仿真可以劃分為定向測試和隨機測試。定向測試是為了驗證某個具體功能而專門設(shè)計激勵信號。由于在仿真前就已知激勵內(nèi)容和期望的輸出內(nèi)容,因此分析輸出結(jié)果較為容易,它一般用在驗證前期對電路基本功能的驗證上。定向測試的缺點也很明顯,就是每個測試用例只能用一次,無法產(chǎn)生新的測試序列,因此不會提高代碼或功能覆蓋率。隨機測試特別是覆蓋率驅(qū)動的隨機測試正是用來解決定向測試這一缺陷的。在驗證環(huán)境中,隨機可以得到更多的數(shù)值集,減少了編寫激勵的工作量,提高了覆蓋率和驗證效率;不同的隨機交叉組合可能驗證到計劃中沒有指定的功能,提高了驗證完備性。在VerilogHDL中隨機序列可以通過系統(tǒng)函數(shù)產(chǎn)生(見5.3.6節(jié))。檢測輸出的方法除了本章即將介紹的波形觀測和文本輸出方式外,還有斷言檢測、自動化檢測和覆蓋率統(tǒng)計等。斷言來源于設(shè)計規(guī)范,用來評估一個設(shè)計屬性是否和期望值一致。在隨機測試中,由于仿真前無法得到激勵內(nèi)容,導(dǎo)致對輸出的判斷非常困難,因此需要用自動化的檢測方式,如編寫抽象的行為級模型,將隨機信號同時送入模型和設(shè)計中,將兩個輸出作比較,從而驗證電路設(shè)計的正確性。雖然隨機驗證和自動化檢測技術(shù)提高了驗證效率,但需要一個客觀標準衡量驗證是否完備,因此引入了“覆蓋率”這一概念。覆蓋率定義為已達到驗證目標的百分比,它被用作評估驗證項目進展的指標。覆蓋率分為功能覆蓋率和代碼覆蓋率。功能覆蓋率用來衡量哪些設(shè)計特征已經(jīng)被測試程序驗證到,它只關(guān)心電路功能,不關(guān)心具體的代碼如何實現(xiàn),因此也稱為黑盒覆蓋率。顯而易見,代碼覆蓋率用于衡量RTL代碼是否被執(zhí)行到,因此也稱為白盒覆蓋率。代碼覆蓋率具體又可分為分支覆蓋率、語句覆蓋率、翻轉(zhuǎn)覆蓋率、條件覆蓋率和狀態(tài)機覆蓋率。一般仿真工具都具有自動統(tǒng)計代碼覆蓋率的功能(見7.2.1節(jié))。需要注意的是:如果代碼覆蓋率為100%,并不能代表功能沒問題。如果功能覆蓋率低,但是代碼覆蓋率高,說明測試用例沒有涉及一些功能點,需要修改并增加測試用例;反之,功能覆蓋率高,但是代碼覆蓋率低,需要分析未覆蓋到的代碼,推斷仿真是否有遺漏的功能點,代碼是否為冗余或不可達到。2)形式驗證與動態(tài)仿真相比,形式驗證是一種靜態(tài)驗證方法,它不需要激勵輸入,而是通過數(shù)學(xué)方法來驗證設(shè)計的正確性。形式驗證工具通過嚴密的數(shù)學(xué)邏輯算法窮盡所有輸入可能,所以它容易實現(xiàn)驗證的完備性。形式驗證分為兩種方式:等價檢查和屬性檢查。等價檢查是驗證兩個設(shè)計在功能上是否相同的過程,可以用來檢查不同抽象層次的電路是否一致,如RTL級和網(wǎng)表的等價檢查可以保證綜合過程沒有邏輯錯誤。屬性檢查,首先通過專用驗證語言描述電路的功能屬性,屬性被轉(zhuǎn)換成等價表達式來評估對錯,隨后驗證工具用靜態(tài)方式證明在所有測試狀態(tài)下的設(shè)計都滿足這個屬性;如果不滿足,會列舉出錯誤的例子。3)硬件加速驗證動態(tài)仿真和形式驗證技術(shù)是純軟件的模擬方式。隨著驗證規(guī)模越來越大,限制驗證效率的最大因素就是仿真速度,軟件模擬已不能滿足像SoC這樣大規(guī)模軟硬件協(xié)同仿真驗證了。因此,利用硬件輔助加速技術(shù)來縮短驗證時間、提高驗證效率的方法被提了出來。硬件輔助加速的基本思想是:編寫好的驗證平臺(Testbench)在主機中運行,將設(shè)計映射或下載到可配置的硬件加速器中,驗證平臺產(chǎn)生的激勵通過實際物理接口連接到硬件加速器,這樣設(shè)計在接近最終產(chǎn)品的應(yīng)用環(huán)境下全速運行;同時,通過軟件和硬件的檢測機制對驗證過程進行監(jiān)測和調(diào)試。之前,硬件加速方式是基于FPGA平臺的。采用FPGA驗證,雖然整體驗證可以全速運行,但是能夠觀察的信號會急劇減少,如果發(fā)生運行異常而需要尋找設(shè)計錯誤時,必須修改觀測信號,而每次修改都意味著重新編譯綜合整個設(shè)計,這將之前驗證運行節(jié)省的時間都用在了重新修改編譯下載上。現(xiàn)在主流的硬件加速方式是基于專用模擬器(Emulation)的,相對FPGA驗證方式,它具備更準確的分析能力和更高的信號可見性。在仿真時能清楚地觀測到內(nèi)部信號的變化過程,并能對內(nèi)部不同模塊進行功耗等性能分析,從而更好地幫助設(shè)計者進行電路修正及優(yōu)化。隨著設(shè)計規(guī)模的不斷增大和復(fù)雜性的不斷提高,驗證面臨巨大的挑戰(zhàn)。僅僅用一種驗證技術(shù)無法實現(xiàn)驗證的完備性、高可靠性、可重用性及高效率。因此需要結(jié)合多種驗證方法來對設(shè)計進行全方位的驗證,從而讓設(shè)計的產(chǎn)品更加完善。5.2VerilogHDL測試程序設(shè)計基礎(chǔ)5.2.1Testbench及其結(jié)構(gòu)在VerilogHDL中,通常采用測試平臺(Testbench)進行仿真和驗證。在仿真時,Testbench用來產(chǎn)生測試激勵信號給待驗證設(shè)計,或者稱為待測試設(shè)計,同時檢查DUV/DUT的輸出是否與預(yù)期的一致,從而達到驗證設(shè)計功能的目的,如圖5.2-1所示。應(yīng)該指出的是,由于Testbench是一個測試平臺,信號集成在模塊內(nèi)部,因此沒有輸入、輸出。在Testbench模塊內(nèi),例化待測試設(shè)計的頂層模塊,并把測試行為的代碼封裝在內(nèi),直接對待測試系統(tǒng)提供測試激勵。圖5.2-2給出了一個典型的Testbench程序結(jié)構(gòu)。5.2.2測試平臺舉例為了驗證設(shè)計模塊功能的正確性,需要在Testbench中輸入激勵信號給設(shè)計模塊,同時觀察這些激勵信號在設(shè)計模塊中的響應(yīng)是否與設(shè)計目標值一致。圖5.2-5中給出了一個DUT的仿真平臺。測試平臺會產(chǎn)生時鐘信號、復(fù)位信號和一系列的仿真向量,試觀察DUT的響應(yīng),并確認仿真結(jié)果。建立Testbench進行仿真的流程分為編寫仿真激勵、搭建仿真環(huán)境和確認仿真結(jié)果三個步驟。為一個設(shè)計建立仿真平臺,將這個設(shè)計在該平臺中實例化,然后將在平臺中產(chǎn)生的測試激勵信號輸入給設(shè)計模塊,再觀察DUT的響應(yīng)是否與期望值相同。下面介紹組合邏輯電路和時序邏輯電路測試仿真環(huán)境的搭建。圖5.2-5

DUT仿真平臺1.組合邏輯電路仿真環(huán)境的搭建組合邏輯電路的設(shè)計驗證主要是檢查設(shè)計結(jié)果是否符合該電路真值表的功能,因此在搭建組合邏輯電路仿真環(huán)境時,用initial語句塊把被測電路的輸入信號按照真值表提供的數(shù)據(jù)變化情況作為測試條件。組合邏輯電路的特點決定了仿真中只需對輸入信號進行設(shè)計即可,沒有時序、定時信息和全局復(fù)位、置位等信號要求。2.時序邏輯電路仿真環(huán)境的搭建時序邏輯電路仿真環(huán)境的搭建要求與組合邏輯電路基本相同,主要區(qū)別在于時序邏輯電路的仿真環(huán)境中,需要考慮時序、定時信息和全局復(fù)位、置位等信號要求,并定義這些信號。5.2.3VerilogHDL仿真結(jié)果確認VerilogHDL仿真結(jié)果的正確性可以通過觀察波形、觀察文本輸出、自動檢查仿真結(jié)果和使用VCD文件等方式來確認。1.觀察波形觀察波形即通過直接觀察各信號波形的輸出,比較測試值和期望值的大小,來確定仿真結(jié)果的正確性。圖5.2-8是ModelSim信號波形觀察窗口。這種方式的優(yōu)勢在于觀測信號比較直觀,適用于觀測時間較短的測試信號。2.觀察文本輸出VerilogHDL語法中規(guī)定了一系列系統(tǒng)任務(wù),其中的打印任務(wù)主要用來協(xié)助查看仿真結(jié)果。3.自動檢查仿真結(jié)果自動檢查仿真結(jié)果是通過在設(shè)計代碼中的關(guān)鍵節(jié)點添加斷言監(jiān)控器,形成對電路邏輯綜合的注釋或是對設(shè)計特點的說明,以提高設(shè)計模塊的可觀察性。在行為約束時觀察設(shè)計的關(guān)鍵節(jié)點是否達到預(yù)期值,如果斷言監(jiān)控器檢查到信號沒有達到其預(yù)期值,則會產(chǎn)生相應(yīng)的信息及差異的時間,這類信息通常出現(xiàn)在仿真報告、腳本或者控制信息里。4.使用VCD文件VerilogHDL提供了一系列系統(tǒng)任務(wù),用于記錄信號值的變化并保存到標準的VCD(ValueChangeDump)格式的數(shù)據(jù)庫中。VCD文件是一種標準格式的波形記錄文件,只記錄發(fā)生變化的波形。可以將仿真器中的仿真結(jié)果輸出成一個VCD文件,然后將該VCD文件輸入給其他第三方分析工具進行分析。5.2.4VerilogHDL仿真效率與C/C++?等軟件語言相比,VerilogHDL行為級仿真代碼的執(zhí)行時間比較長,其主要原因就是要通過串行軟件代碼完成并行語義的轉(zhuǎn)換。隨著代碼的增加,仿真驗證過程會非常漫長,從而導(dǎo)致仿真效率降低。這成為整體設(shè)計的瓶頸。即便如此,不同的設(shè)計代碼其仿真效率也是不同的。鑒于此,提出了以下幾點建議,可幫助設(shè)計人員提高VerilogHDL代碼的仿真效率。1.減小層次結(jié)構(gòu)仿真代碼的層次越少,執(zhí)行時間就越短。這主要是因為參數(shù)在模塊端口之間傳遞時需要消耗仿真器的執(zhí)行時間。2.減少門級代碼的使用由于門級建模屬于結(jié)構(gòu)化建模,自身參數(shù)建模較復(fù)雜,需要通過建模調(diào)用的方式來實現(xiàn),因此仿真代碼應(yīng)盡量使用行為級語句;建模層次越抽象,執(zhí)行時間就越短。3.仿真精度越高,效率越低VerilogHDL語法中提供了計時單位值和計時精度值,并且要求計時單位值大于等于計時精度值。由于在VerilogHDL模型中,所有時延都是通過單位時間進行描述的,并且是一個相對的概念,所以計時單位值與計時精度值的差值越大,模擬時間越長。例如包含`timescale1ns/1ps定義的代碼執(zhí)行時間就比包含`timescale1ns/1ns定義的代碼執(zhí)行時間長。因此在仿真中,需要通過具體的仿真要求,設(shè)定合適的仿真時間和分辨率,提高仿真效率。4.進程越少,效率越高代碼中的語句塊越少,仿真越快。例如:將相同的邏輯功能分布在兩個always語句塊中,其仿真執(zhí)行時間就比利用一個always語句來實現(xiàn)要長。這是因為仿真器在不同進程之間進行切換也需要時間。5.減少仿真器的輸出顯示信息VerilogHDL中包含了一些系統(tǒng)任務(wù),可以在仿真器的控制臺顯示窗口中輸出一些提示信息。雖然它對于軟件調(diào)試是非常有用的,但會降低仿真器的執(zhí)行效率,因此在代碼中不要隨意使用這類系統(tǒng)任務(wù)。從本質(zhì)上來講,減少代碼執(zhí)行時間并不一定會提高代碼的驗證效率,因此上述建議需要和代碼的可讀性、可維護性以及驗證覆蓋率等方面結(jié)合起來考慮。5.3與仿真相關(guān)的系統(tǒng)任務(wù)5.3.1$display和?$writeVerilogHDL中兩個主要的標準輸出任務(wù)是$display和?$write,這兩個系統(tǒng)函數(shù)都用于輸出信息且語法格式相同。其語法格式分別如下:$display("<format_specifiers>",<signal1,signal2,…,signaln>);$write("<format_specifiers>",<signal1,signal2,…,signaln>);其中,<format_specifiers>用于控制格式,而<signal1,signal2,…,signaln>則為“信號輸出列表”。雖然?$display和?$write的作用相同,但$display是將特定信息輸出到標準輸出設(shè)備,并且?guī)в行薪Y(jié)束字符,即自動地在輸出后進行換行;而$write輸出特定信息時不自動換行。如果想在一行里輸出多個信息,則可以使用?$write。輸出格式說明由“%”和格式字符組成,其作用是將輸出的數(shù)據(jù)轉(zhuǎn)換成指定的格式輸出。格式說明總是由“%”字符開始。對于不同類型的數(shù)據(jù),用不同的格式輸出。表5.3-1中給出了常用的幾種輸出格式,無論何種格式,都以較短的結(jié)果輸出。需要原樣輸出的字符,即普通字符,其中一些特殊的字符可以通過表5.3-2中的轉(zhuǎn)換序列來輸出。表中的字符形式用于格式字符串參數(shù)中,用來顯示特殊的字符。5.3.2$monitor和?$strobe$monitor、$strobe與?$display、$write一樣,屬于信號的輸出顯示的系統(tǒng)任務(wù)。同時,$monitor與?$strobe都提供了監(jiān)控和輸出參數(shù)列表中字符或變量的值的功能。(1)?$monitor的語法格式如下:$monitor("<format_specifiers>",<signal1,signal2,…,signaln>);5.3.3$time和?$realtime在VerilogHDL中有兩種類型的時間系統(tǒng)函數(shù),即$time和?$realtime,這兩個時間系統(tǒng)函數(shù)用于得到當前的仿真時刻。這兩個函數(shù)被調(diào)用后都返回當前時刻相對仿真開始時刻的時間量值。所不同的是,$time函數(shù)以64bit整數(shù)值的形式返回仿真時間,而?$realtime函數(shù)則以實型數(shù)據(jù)的形式返回仿真時間。(1)系統(tǒng)函數(shù)?$time。$time可以返回一個64bit整數(shù)表示的當前仿真時刻值,該時刻值是以模塊的開始仿真時間為基準的。5.3.4$finish和?$stop系統(tǒng)任務(wù)?$finish和?$stop用于對仿真過程的控制,分別表示結(jié)束仿真和中斷仿真。其語法格式分別如下:其中,n是參數(shù),可以取0、1或2幾個值,含義如表5.3-3所示。$finish的作用是退出仿真器,返回主操作系統(tǒng),也就是結(jié)束仿真過程。$finish可以帶參數(shù),根據(jù)參數(shù)的值輸出不同的特征信息;如果不帶參數(shù),則默認?$finish的參數(shù)值為1。$stop的作用是把EDA工具(如仿真器)置成暫停模式,在仿真環(huán)境下給出一個交互式的命令提示符,將控制權(quán)交給用戶。該任務(wù)可以帶有參數(shù)表達式。根據(jù)參數(shù)值(0、1或2)的不同,輸出不同的信息。參數(shù)值越大,輸出的信息越多。5.3.5$readmemb和?$readmemhVerilogHDL程序中的系統(tǒng)任務(wù)?$readmemb和?$readmemh用來從文件中讀取數(shù)據(jù)到存儲器中。這兩個系統(tǒng)任務(wù)可以在仿真的任何時刻被執(zhí)行使用。其語法格式分別如下:在這兩個系統(tǒng)任務(wù)中,被讀取的數(shù)據(jù)文件的內(nèi)容只能包含空白位置(空格、換行符、制表符(tab)和form-feeds)、注釋行(//形式的和/*…*/形式的都允許)、二進制或十六進制的數(shù)字。數(shù)字中不能包含位寬說明和格式說明,對于$readmemb系統(tǒng)任務(wù),每個數(shù)字必須是二進制數(shù)字;對于?$readmemh系統(tǒng)任務(wù),每個數(shù)字必須是十六進制數(shù)字。數(shù)據(jù)文件中的不定值(x或X)、高阻值(z或Z)和下畫線(_)的使用方法及代表的意義與一般VerilogHDL程序中的使用方法及代表的意義是一樣的。另外,數(shù)字必須用空白位置或注釋行分隔開。數(shù)據(jù)文件中允許出現(xiàn)十六進制地址說明@hhh,表示將該地址說明后的數(shù)據(jù)內(nèi)容存放到存儲器相應(yīng)地址的后續(xù)單元中。5.3.6$random$random是產(chǎn)生隨機數(shù)的系統(tǒng)函數(shù),每次調(diào)用該函數(shù)將返回一個32bit的隨機數(shù),該隨機數(shù)是一個帶符號的整型數(shù)。其語法格式如下:$random%<number>;該系統(tǒng)函數(shù)提供了一個產(chǎn)生隨機數(shù)的手段。當函數(shù)被調(diào)用時,返回一個32bit的隨機數(shù)。它是一個帶符號的整型數(shù)。$random的一般用法如下:$random%b;其中,b為一常數(shù)且要求大于零,它給出了一個范圍為?-b+1~b-1的隨機數(shù)。利用位拼接操作符“{?}”可將函數(shù)?$random返回的有符號整數(shù)變換為無符號數(shù),其用法如下:{$random}%b;其中,b為一常數(shù)且要求大于零,它給出了一個范圍為0~b-1的隨機數(shù)。5.4信號時間賦值語句在集成電路設(shè)計和驗證階段,經(jīng)常需要對特定信號進行延時來實現(xiàn)相應(yīng)的時序控制,或者避免信號沖突形成電路中的熱點。信號的時間延遲可以通過兩類方式來完成:一類是延時控制,它是為行為語句的執(zhí)行指定一個延遲時間的信號時間延遲方式,可以分為串行延時控制、并行延時控制、阻塞式延時控制和非阻塞式延時控制;另一類是事件控制,它是為行為語句的執(zhí)行指定觸發(fā)事件的信號時間控制方式,可以分為邊沿觸發(fā)事件控制和電平敏感事件控制。5.4.1時間延遲的語法說明延時語句用于對各條語句的執(zhí)行時間進行控制,從而快速滿足用戶的時序要求。VerilogHDL中延時控制的語法格式有如下兩類:其中,符號“#”是延時控制的關(guān)鍵字符,“延遲時間”可以是直接指定的延遲時間量,或者以參數(shù)的形式給出。在仿真過程中,所有的延遲時間都根據(jù)時間單位定義。圖5.4-1為信號的時間延遲分類。5.4.2時間延遲的描述形式此處,時間延遲的描述形式是指延時控制的描述形式,分為串行延時控制、并行延時控制、阻塞式延時控制和非阻塞式延時控制四種形式。下面以實現(xiàn)兩組不同波形的信號為例(圖5.4-2中的q0_out和q1_out)來說明四種不同時間延遲的描述形式。1.串行延時控制串行延時控制是最為常見的信號延時控制,它是由begin-end過程塊加上延時賦值語句構(gòu)成的,其中延時賦值語句可以為外部時間控制方式,也可以為內(nèi)部時間控制方式。在“延遲時間”之后也可根據(jù)實際情況來確定是否執(zhí)行相應(yīng)的行為語句。若在“延遲時間”后面有相應(yīng)的行為語句,則仿真進程遇到這條帶有延時控制的行為語句后并不立即執(zhí)行行為語句指定的操作,而是等到“延遲時間”所指定的時間量過去后才真正開始執(zhí)行行為語句指定的操作。2.并行延時控制并行延時控制是通過fork-join過程塊加上延時賦值語句構(gòu)成的,其中延時賦值語句同串行延時控制一樣,既可以是外部時間控制方式,也可以是內(nèi)部時間控制方式。在“延遲時間”之后也可根據(jù)實際情況來確定是否執(zhí)行相應(yīng)的行為語句。在“延遲時間”后面有相應(yīng)的行為語句,則仿真進程遇到這條帶有延時控制的行為語句后并不立即執(zhí)行行為語句指定的操作,而是等到“延遲時間”所指定的時間量過去后才真正開始執(zhí)行行為語句指定的操作。但并行延時控制方式與串行延時控制方式的不同之處在于,并行延時控制方式中的多條延時語句是并行執(zhí)行的,并不需要等待上一條語句執(zhí)行完成后才開始執(zhí)行當前的語句。3.阻塞式延時控制以賦值操作符“=”來標識的賦值操作稱為“阻塞式過程賦值”,阻塞式過程賦值前面已經(jīng)介紹過,在此介紹阻塞式延時控制。阻塞式延時控制是在阻塞式過程賦值基礎(chǔ)上帶有延時控制的情況。4.非阻塞式延時控制以賦值操作符“<=”來標識的賦值操作稱為“非阻塞式過程賦值”,非阻塞式過程賦值也在前面介紹過,在此主要介紹非阻塞式延時控制。非阻塞式延時控制是在非阻塞式過程賦值基礎(chǔ)上帶有延時控制的情況。5.4.3邊沿觸發(fā)事件控制邊沿觸發(fā)事件控制是在指定的信號變化時刻,即指定的信號跳變邊沿才觸發(fā)語句的執(zhí)行,而當信號處于穩(wěn)定狀態(tài)時則不會觸發(fā)語句的執(zhí)行。邊沿觸發(fā)事件控制的語法格式有如下四種形式:@(<事件表達式>)行為語句;@(<事件表達式>);@(<事件表達式1>or<事件表達式2>or…or<事件表達式n>)行為語句;@(<事件表達式1>or<事件表達式2>or…or<事件表達式n>);在以上四種格式中,符號“@”是邊沿觸發(fā)事件控制的標識符;“事件表達式”代表著觸發(fā)語句執(zhí)行的觸發(fā)事件;“行為語句”則指出了觸發(fā)事件所要觸發(fā)執(zhí)行的具體操作。格式中的事件表達式部分,即(<事件表達式>)和(<事件表達式1>or<事件表達式2>or…or<事件表達式n>)被稱為“敏感事件列表”。1.事件表達式事件表達式中可以出現(xiàn)以下三種形式:形式1:<信號名>形式2:posedge<信號名>形式3:negedge<信號名>其中,“信號名”可以是任何數(shù)據(jù)類型的標量或矢量。說明:(1)形式1中,代表觸發(fā)事件的“信號名”在指定的信號發(fā)生邏輯變化時,執(zhí)行下面的語句(示例):@(in)out=in;當敏感事件in發(fā)生邏輯變化(包括正跳變和負跳變)時,執(zhí)行對應(yīng)的賦值語句,將in的值賦給out。(2)形式2中,代表觸發(fā)事件的“posedge<信號名>”在指定的信號發(fā)生了正跳變時,執(zhí)行下面的語句(示例):@(posedgein)out=in;當敏感事件in發(fā)生正跳變時,執(zhí)行對應(yīng)的賦值語句,將in的值賦給out。(3)形式3中,代表觸發(fā)事件的“negedge<信號名>”在指定的信號發(fā)生了負跳變時,執(zhí)行下面的語句(示例):@(negedgein)out=in;當敏感事件in發(fā)生負跳變時,執(zhí)行對應(yīng)的賦值語句,將in的值賦給out。在信號發(fā)生邏輯變化(正跳變或負跳變)的過程中,信號的值是從0、1、x、z四個值中的一個值變化到另一個值;而信號發(fā)生正跳變的過程是信號由低電平向高電平的轉(zhuǎn)變,負跳變是信號由高電平向低電平的轉(zhuǎn)變。表5.4-1為VerilogHDL中規(guī)定的邏輯信號的正跳變和負跳變。2.邊沿觸發(fā)語法格式形式1:@(<事件表達式>)行為語句;這種語法格式的“敏感事件列表”內(nèi)只包含了一個觸發(fā)事件,只有當這個指定的觸發(fā)事件發(fā)生之后,后面的行為語句才能啟動執(zhí)行。在仿真進程中遇到這種帶有事件控制的行為語句時,如果指定的觸發(fā)事件還沒有發(fā)生,則仿真進程就會停留在此處等待,直到指定的觸發(fā)事件發(fā)生后才啟動執(zhí)行后面的行為語句,仿真進程繼續(xù)向下進行。5.4.4電平敏感事件控制電平敏感事件控制是另一種事件控制方式,與邊沿觸發(fā)事件控制不同,它是在指定的條件表達式為真時啟動需要執(zhí)行的語句。電平敏感事件控制是用關(guān)鍵詞wait來表示的。電平敏感事件控制的語法格式有如下兩種:形式1:wait(條件表達式)行為語句;形式2:wait(條件表達式);說明:(1)電平敏感事件控制的第1種形式中包含了“行為語句”,它可以是串行塊(begin-end)語句或并行塊(fork-join)語句,也可以是單條行為語句。在這種事件控制語句形式下,行為語句啟動執(zhí)行的觸發(fā)條件是條件表達式的值為“真(邏輯1)”。如果當仿真進程執(zhí)行到這條電平敏感事件控制語句時條件表達式的值是“真”,那么語句塊立即執(zhí)行,否則語句塊要一直等到條件表達式的值變?yōu)椤罢妗睍r再開始執(zhí)行。(2)電平敏感事件控制的第2種形式中沒有包含“行為語句”。在這種電平敏感事件控制語句形式下,如果仿真進程執(zhí)行到該wait控制語句時,條件表達式的值是“真”,那么立即結(jié)束該wait事件控制語句的執(zhí)行,仿真進程繼續(xù)往下進行;而如果仿真進程執(zhí)行到這條wait控制語句時,條件表達式的值是“假”,則仿真進程進入等待狀態(tài),一直等到條件表達式取值變?yōu)椤罢妗睍r才退出等待狀態(tài),同時結(jié)束該wait語句的執(zhí)行,仿真進程繼續(xù)向下進行。這種形式的電平敏感事件控制常常用來對串行塊中各條語句的執(zhí)行時序進行控制。5.5任

務(wù)

數(shù)在行為級設(shè)計中,設(shè)計者經(jīng)常需要在程序的多個不同地方實現(xiàn)同樣的功能。因此有必要把這些公共部分提取出來組成子程序,然后在需要的地方調(diào)用這些子程序,這樣就可以避免重復(fù)編碼。VerilogHDL中提供了任務(wù)和函數(shù),可以將較大的行為級設(shè)計劃分為較小的代碼段,允許設(shè)計者將需要在多個地方重復(fù)使用的相同代碼提取出來,編寫成任務(wù)和函數(shù),這樣可以使代碼更加簡潔和易懂。任務(wù)具有輸入、輸出和輸入/輸出(雙向)變量,而函數(shù)具有輸入變量,這樣數(shù)據(jù)就能夠傳入任務(wù)和函數(shù),并且能夠?qū)⒔Y(jié)果輸出。5.5.1任務(wù)VerilogHDL使用關(guān)鍵字task和endtask對任務(wù)進行聲明。VerilogHDL中規(guī)定,如果子程序滿足以下任一條件,則公共子程序的描述必須使用任務(wù)而不能使用函數(shù):(1)子程序中包含有延時、時序或者事件控制結(jié)構(gòu)。(2)沒有輸出或者輸出變量的數(shù)量大于1。(3)沒有輸入變量。任務(wù)(task)類似于其他高級程序編程語言中的“過程”。任務(wù)的使用包括任務(wù)的定義和任務(wù)的調(diào)用。1.任務(wù)的定義任務(wù)定義的語法格式如下:說明:(1)任務(wù)定義是嵌入在關(guān)鍵字task和endtask之間的,其中關(guān)鍵詞task標志著一個任務(wù)定義結(jié)構(gòu)的開始,endtask標志著一個任務(wù)定義結(jié)構(gòu)的結(jié)束。“任務(wù)名”是所定義任務(wù)的名稱。在“任務(wù)名”后面不能出現(xiàn)輸入、輸出端口列表。(2)“端口和類型聲明”用于對任務(wù)各個端口的寬度和類型進行聲明,其中使用關(guān)鍵詞input、output或inout對任務(wù)的端口進行聲明。input類型和inout類型的變量從外部傳遞到任務(wù)中,input類型的變量在任務(wù)所包含的語句中進行處理。當任務(wù)完成時,output類型和inout類型的變量傳回給任務(wù)調(diào)用語句中相應(yīng)的變量。在任務(wù)中使用關(guān)鍵字input、output或inout對輸入/輸出變量進行聲明,其聲明語句的語法與模塊中端口聲明的語法一樣,但是兩者在本質(zhì)上是有區(qū)別的:模塊的端口用來和外部信號相連接,而任務(wù)的輸入/輸出變量則用來向任務(wù)中傳入或從中傳出變量。(3)“局部變量聲明”用來對任務(wù)內(nèi)用到的局部變量進行寬度和類型聲明,該聲明語句的語法與進行模塊定義時相應(yīng)聲明語句的語法一致。(4)任務(wù)中由begin與end關(guān)鍵詞界定的一系列語句指明了任務(wù)被調(diào)用時需要進行的操作,在任務(wù)被調(diào)用時這些語句將以串行方式執(zhí)行。2.任務(wù)的調(diào)用任務(wù)的調(diào)用是通過“任務(wù)調(diào)用語句”來實現(xiàn)的。任務(wù)調(diào)用語句列出了傳入任務(wù)和傳出任務(wù)的參數(shù)值。任務(wù)的調(diào)用格式如下:<任務(wù)名>(端口1,端口2,…,端口n);在任務(wù)調(diào)用時,任務(wù)調(diào)用語句只能出現(xiàn)在過程塊內(nèi),任務(wù)調(diào)用語句就像普通的行為語句一樣得到處理。當被調(diào)用的任務(wù)具有輸入或輸出端口時,任務(wù)調(diào)用語句必須包含端口名列表,這個列表內(nèi)各個端口名出現(xiàn)的順序和類型,必須與任務(wù)定義結(jié)構(gòu)中端口說明部分的端口順序和類型一致。注意,只有寄存器類的變量才能與任務(wù)的輸出端口相對應(yīng)。5.5.2函數(shù)VerilogHDL使用關(guān)鍵字function和endfunction對函數(shù)進行聲明。

對于一個子程序來說,如果下面的所有條件全部成立,則可以使用函數(shù)來完成:(1)子程序內(nèi)不含有延時、時序或者事件控制結(jié)構(gòu)。(2)子程序只有一個返回值。(3)至少有一個輸入變量。(4)沒有輸出或者雙向變量。(5)不含有非阻塞式賦值語句。VerilogHDL的函數(shù)類似于其他編程語言中的函數(shù),其目的都是通過函數(shù)運算返回一個值。與任務(wù)一樣,函數(shù)也包括函數(shù)的定義與函數(shù)的調(diào)用。1.函數(shù)的定義函數(shù)定義的語法格式如下:說明:(1)函數(shù)定義是嵌入在關(guān)鍵字function和endfunction之間的,其中關(guān)鍵字function標志著一個函數(shù)定義結(jié)構(gòu)的開始,endfunction標志著一個函數(shù)定義結(jié)構(gòu)的結(jié)束?!昂瘮?shù)名”是給被定義函數(shù)取的名稱,該函數(shù)名在函數(shù)定義結(jié)構(gòu)內(nèi)部還代表著一個內(nèi)部變量,函數(shù)調(diào)用后的返回值是通過這個函數(shù)名變量傳遞給調(diào)用語句的。(2)“返回值類型或位寬”是一個可選項,用來對函數(shù)調(diào)用返回數(shù)據(jù)的類型或?qū)挾冗M行說明,它可以有如下三種形式:①?[msb:lsb]:這種形式說明函數(shù)名所代表的返回變量是一個多位的寄存器變量,它的位寬由[msb:lsb]指定。比如函數(shù)定義語句function[7:0]adder;就定義了一個函數(shù)adder,其函數(shù)名adder還代表著一個8位寬的寄存器變量,其中最高位為第7位,最低位為第0位。②?integer:這種形式說明函數(shù)名所代表的返回變量是一個整型變量。③?real:這種形式說明函數(shù)名所代表的返回變量是一個實型變量。如果在函數(shù)聲明語句中缺省“返回值類型或位寬”項,則認為函數(shù)名所代表的返回值是一個寄存器類型的數(shù)據(jù)。(3)“輸入?yún)⒘颗c類型聲明”是對函數(shù)各輸入端口的寬度和類型進行聲明。在函數(shù)定義中,至少有一個輸入端口(input)的聲明,不能有輸出端口(output)的聲明。數(shù)據(jù)類型聲明語句用來對函數(shù)內(nèi)用到的局部變量進行寬度和類型聲明,該聲明語句的語法與進行模塊定義時相應(yīng)聲明語句的語法一致。(4)“局部變量聲明”是對函數(shù)內(nèi)部局部變量進行寬度和類型的聲明。(5)由begin與end關(guān)鍵詞界定的一系列語句同任務(wù)中的一樣,用來指明函數(shù)被調(diào)用時要執(zhí)行的操作。在函數(shù)被調(diào)用時,這些語句將以串行方式執(zhí)行。2.函數(shù)的調(diào)用函數(shù)的調(diào)用是通過將函數(shù)作為表達式中的操作數(shù)來實現(xiàn)的。函數(shù)的調(diào)用格式如下:<函數(shù)名>(<輸入表達式1>,<輸入表達式2>,…,<輸入表達式n>);其中,“輸入表達式”應(yīng)與函數(shù)定義結(jié)構(gòu)中說明的輸入端口一一對應(yīng),它們代表著各輸入端口的輸入數(shù)據(jù)。函數(shù)調(diào)用時的注意事項如下:(1)函數(shù)的調(diào)用不能單獨作為一條語句出現(xiàn),它只能作為一個操作數(shù)出現(xiàn)在賦值語句內(nèi)。(2)函數(shù)的調(diào)用既能出現(xiàn)在過程塊中,也能出現(xiàn)在assign連續(xù)賦值語句中。(3)函數(shù)定義中聲明的所有局部寄存器都是靜態(tài)的,即函數(shù)中的局部寄存器在函數(shù)的多個調(diào)用之間保持它們的值。5.5.3任務(wù)與函數(shù)的區(qū)別在VerilogHDL中,任務(wù)和函數(shù)用于不同的目的,表5.5-1列出了任務(wù)和函數(shù)的區(qū)別。任務(wù)和函數(shù)都必須在模塊內(nèi)進行定義,其作用范圍僅局限于定義它們的模塊。任務(wù)用于代替普通的VerilogHDL代碼,其中可以包括延時、時序、事件等語法結(jié)構(gòu),并且可以具有多個輸出變量。函數(shù)用于代替表示純邏輯的VerilogHDL代碼,在仿真時刻0就開始執(zhí)行,只能有一個輸出。因此,函數(shù)一般用于完成各類轉(zhuǎn)換和常用的計算。任務(wù)可以有輸入、輸出和輸入/輸出(雙向)變量,而函數(shù)只有輸入變量。另外,可以在任務(wù)和函數(shù)中聲明局部變量,如寄存器、整數(shù)、實數(shù)和時間,但是不能聲明線網(wǎng)類型的變量。在任務(wù)和函數(shù)中只能使用行為級語句,但是不能包含always和initial塊。設(shè)計者可以在always塊、initial塊以及其他的任務(wù)和函數(shù)中調(diào)用任務(wù)和函數(shù)。在VerilogHDL語法中,任務(wù)和函數(shù)是從高級程序語言中繼承過來的,其語法使用范圍具有一定的局限性,對于初學(xué)者而言,掌握起來較為困難。實際上,在對數(shù)字電路的設(shè)計中,VerilogHDL更傾向于使用模塊來解決代碼的重復(fù)問題,這種表示方法和電路的實際組成相近,在描述方式上也更加直觀。5.6典型測試向量的設(shè)計5.6.1變量初始化在VerilogHDL中,有兩種方法可以初始化變量:一種是利用初始化過程塊;另一種是在定義變量時直接賦值初始化。這兩種初始化任務(wù)是不可綜合的,主要用于仿真過程。1.?initial初始化方式在大多數(shù)情況下,Testbench中變量初始化的工作通過initial過程塊來完成,可以產(chǎn)生豐富的仿真激勵。initial語句只執(zhí)行一次,即自設(shè)計被開始模擬執(zhí)行時開始(0時刻),直到過程結(jié)束,專門用于對輸入信號進行初始化和產(chǎn)生特定的信號波形。一個Testbench可以包含多個initial過程語句塊,所有的initial過程都同時執(zhí)行。需要注意的是,initial語句中的變量必須為reg類型。2.定義變量時初始化定義變量時進行初始化的語法非常簡單,直接用“=”在變量右端賦值即可,例如:reg[7:0]cnt=8'b00000000;就將8bit的寄存器變量cnt初始化為0。5.6.2數(shù)據(jù)信號測試向量的產(chǎn)生數(shù)據(jù)信號測試向量既可以通過VerilogHDL的時間控制功能(#、initial、always語句)來產(chǎn)生各類驗證數(shù)據(jù),也可以通過系統(tǒng)任務(wù)來讀取計算機上已存在的數(shù)據(jù)文件。數(shù)據(jù)信號的產(chǎn)生有兩種形式:其一是初始化和產(chǎn)生都在單個initial塊中進行;其二是初始化在initial語句中完成,而產(chǎn)生在always語句中完成。前者適合不規(guī)則數(shù)據(jù)序列,并且要求長度較短;后者適合具有一定規(guī)律的數(shù)據(jù)序列,長度不限。5.6.3時鐘信號測試向量的產(chǎn)生時序電路應(yīng)用廣泛,其中,時鐘信號是時序電路設(shè)計中最關(guān)鍵的參數(shù)之一,因此本小節(jié)專門介紹如何產(chǎn)生仿真驗證過程所需要的各類時鐘信號。5.6.4數(shù)據(jù)的同步產(chǎn)生和輸出在前面的例子中,數(shù)據(jù)向量的產(chǎn)生和時鐘均采用獨立的時序。但在實際的電路工作環(huán)境中,輸入數(shù)據(jù)(除頂層端口)總是來自其他模塊的輸出,一般模塊的數(shù)據(jù)輸出是和時鐘同步的,因此測試中的輸入數(shù)據(jù)也應(yīng)該和時鐘同步產(chǎn)生,這樣的測試平臺更符合電路實際工作情況。同時,時鐘頻率發(fā)生改變,輸入信號時序也隨之改變。采用事件控制語句可實現(xiàn)數(shù)據(jù)和時鐘的同步。5.6.5數(shù)據(jù)緩存的應(yīng)用前面介紹了用循環(huán)結(jié)構(gòu)產(chǎn)生具有周期性的測試向量(如時鐘);用initial過程塊和延時控制產(chǎn)生不規(guī)則的數(shù)據(jù)序列。如果不規(guī)則的數(shù)據(jù)序列特別長,就要寫許多條延時賦值語句,從而會使測試代碼編寫量大大增加。這里介紹一種利用數(shù)據(jù)緩存器保存序列數(shù)據(jù),之后在時鐘控制下將其逐個送給被測模塊的技術(shù)。5.6.6總線信號測試向量的產(chǎn)生總線是運算部件之間數(shù)據(jù)流通的公共通道。在RTL級描述中,總線指的是由邏輯單元、寄存器、存儲器、電路輸入或其他總線驅(qū)動的一個共享向量??偩€功能模型則是一種將物理的接口時序操作轉(zhuǎn)化成更高抽象層次接口的總線模型,如圖5.6-4所示。在總線中,對于每個請求端,有一個輸入來選擇驅(qū)動該總線所對應(yīng)的請求端。選擇多個請求端時會產(chǎn)生總線沖突;根據(jù)不同的總線類型,會產(chǎn)生不同的沖突結(jié)果。當有多個請求端發(fā)出請求時,相應(yīng)的操作由總線的類型決定。在VerilogHDL測試中,總線測試信號通常是通過將片選信號、讀(或者寫)使能信號、地址信號以及數(shù)據(jù)信號以task任務(wù)的形式來描述,并通過調(diào)用task形式的總線信號測試向量來完成相應(yīng)的總線功能。

圖5.6-5是AHB總線寫操作的時序圖。其中,在完成數(shù)據(jù)的寫操作后將片選和寫使能信號置為無效(低電平有效)。5.7基本門級元件和模塊的延時建模為了有效驗證數(shù)字集成電路的功能,VerilogHDL規(guī)定了模塊和基本元件的延時模型。這樣,設(shè)計者可以對所調(diào)用的門級或所設(shè)計的模塊進行時序設(shè)計,完成對目標電路功能的驗證。5.7.1門級延時建模在實際的電路中,任何一個邏輯門都具有延時功能,信號從邏輯門的輸入到輸出的傳輸延時可以通過門延時來定義。用戶可以通過門延時來說明邏輯電路中的延時,同時也可以指定輸入端到輸出端的延時。門級延時可以分為如下四類:(1)上升延時:表示信號由0、x或z狀態(tài)變化到1狀態(tài)時受到的門傳輸延時。(2)下降延時:表示信號由1、x或z狀態(tài)變化到0狀態(tài)時受到的門傳輸延時。(3)到不定態(tài)的延時:表示信號由0、1或z狀態(tài)變化到x狀態(tài)時受到的門傳輸延時。(4)截止延時:表示信號由0、1或x狀態(tài)變化到z狀態(tài)時受到的門傳輸延時。由于多輸入門(and、nand、or、nor、xor和xnor)及多輸出門(buf和not)的輸出不可能是高阻態(tài)z,所以這兩類元件沒有“到不定態(tài)的延時”這類門級延時,只有“上升延時”“下降延時”和“截止延時”這三種。對于三態(tài)門(bufif1、bufif0、notif1和notif0),由于其輸出可以取四種可能的邏輯狀態(tài)(0、1、x和z),所以具有全部門級延時種類。而對于上拉電阻(pullup)和下拉電阻(pulldown),由于它們沒有輸入端口,所以不存在輸入到輸出的延時,因此就不存在任何形式的門級延時。實例引用帶延時參數(shù)門的語法格式如下:其中,delay規(guī)定了門的延時,即從門的輸入端到輸出端的傳輸延時。若沒有指定門延時值,則默認的延時值為0。同時delay是由一個或多個延時值組成的,可以有基本延時表達和“最小:典型:最大”延時表達兩種形式。1.門級延時的基本延時表達形式在門級延時的基本延時表達形式下,delay內(nèi)可以包含0~3個延時值,表5.7-1給出了指定的不同延時值個數(shù)時delay的四種表示形式。說明:(1)當delay沒有指定門延時值時,默認的延時值為0。這意味著元件實例的“上升延時值”“下降延時值”“截止延時值”和“到不定態(tài)的延時值”均為0。(2)當delay內(nèi)只包含1個延時值時,給定的延時值d將同時代表著元件實例的“上升延時值”“下降延時值”“截止延時值”和“到不定態(tài)的延時值”。(3)當delay內(nèi)包含了2個延時值時,元件實例的“上升延時值”由給定的d1指定,“下降延時值”由給定的d2指定,而“截止延時值”和“到不定態(tài)的延時值”將由d1和d2中的最小值指定。(4)當delay內(nèi)包含了3個延時值時,元件實例的“上升延時值”由給定的dA指定,“下降延時值”由給定的dB指定,“截止延時值”由給定的dC指定,而它的“到不定態(tài)的延時值”將由dA、dB和dC中的最小值指定。2.門級延時的“最?。旱湫停鹤畲蟆毖訒r表達形式除了基本延時表達形式外,門級延時量還可以采用“最小:典型:最大”延時表達形式;采用這種表達形式時,門級延時量中的每一項將由“最小延時值”“典型延時值”和“最大延時值”3個值來表示,其語法格式如下:采用“最小:典型:最大”延時表達形式時,delay內(nèi)可以包含1~3個延時值。5.7.2模塊延時建模對于由用戶自己定義設(shè)計的模塊,可以采用“加入門級延時說明”的辦法,通過“延時說明塊(SpecifyBlock)”的結(jié)構(gòu)來對模塊的傳輸延時進行說明。注意,延時說明塊既可以出現(xiàn)在行為描述模塊內(nèi),也可以出現(xiàn)在結(jié)構(gòu)描述模塊內(nèi)。1.延時說明塊

在模塊輸入和輸出引腳之間的延時稱為模塊路徑延時。在VerilogHDL中,在關(guān)鍵字specify和endspecify之間給路徑延時賦值,關(guān)鍵字之間的語句組成specify塊(即指定塊)。specify與endspecify分別是延時說明塊的起始標識符和終止標識符。specify塊中包含下列操作語句:(1)定義穿過模塊的所有路徑延時;(2)在電路中設(shè)置時序檢查;(2)定義specparam常量。2.路徑延時描述方式1)并行連接每條路徑延時語句都有一個源域或一個目標域。在例5.7-2的路徑延時語句中,a、b、c和d在源域位置,而out是目標域。在specify塊中,用符號“=>”說明并行連接,其語法格式如下:其中,<delay_value>可以包含1~3個延時量,也可以采用“最?。旱湫停鹤畲蟆毖訒r表達形式。在延時量由多個值組成的情況下,應(yīng)在延時量的外面加上一對括號。表示的是輸入a到輸出out的最小、典型、最大延時值分別是8、9、10個時間單位。在并行連接中,源域中的每一位與目標域中相應(yīng)的位連接。如果源域和目標域是向量,則必須有相同的位數(shù),否則會出現(xiàn)不匹配的情況。因此,并行連接說明了源域的每一位到目標域的每一位之間的延時。圖5.7-4顯示了源域和目標域之間的位是如何并行連接的。2)全連接在specify塊中,用符號“*>”表示全連接,其語法格式如下:在全連接中,源域中的每一位與目標域中的每一位相連接。如果源域和目標域是向量,則它們的位數(shù)不必相同。全連接描述源域中的每一位和目標域中的每一位之間的延時,如圖5.7-5所示。3.specparam聲明語句specparam用來定義specify塊中的參數(shù),specparam語句的格式和作用都類似于parameter參數(shù)說明語句,但兩者又有不同:(1)specparam語句只能在延時說明塊(specify塊)中出現(xiàn),而parameter語句則不能在延時說明塊內(nèi)出現(xiàn)。(2)由specparam語句進行定義的參數(shù)只能是延時參數(shù),而由parameter語句定義的參數(shù)可以是任何數(shù)據(jù)類型的常數(shù)參數(shù)。(3)由specparam語句定義的延時參數(shù)只能在延時說明塊內(nèi)使用,而parameter語句定義的參數(shù)則可以在模塊內(nèi)的任意位置使用。在模塊中提供specify參數(shù)是為了方便給延時賦值,因此建議用specify參數(shù)而不是數(shù)值來表示延時。這樣,如果電路的時序說明變化了,則用戶只需要改變specify的參數(shù)值,而不必逐個修改每條路徑的延時值。5.7.3與時序檢查相關(guān)的系統(tǒng)任務(wù)VerilogHDL提供了系統(tǒng)任務(wù)來進行時序檢查。該類任務(wù)很多,表5.7-5列舉了部分與時序檢查相關(guān)的系統(tǒng)任務(wù)。下面介紹兩種最常用的時序檢查系統(tǒng)任務(wù)?$setup和?$hold。所有的時序檢查只能用在specify塊里。為了簡化討論,此處省略了這些時序檢查系統(tǒng)任務(wù)的一些可選參數(shù)。1)?$setup建立時間檢查可以使用系統(tǒng)任務(wù)?$setup。其語法格式如下:$setup(data_event,reference_event,limit);其中,data_event是被檢查的信號,需檢查它是否違反約束;reference_event用于檢查data_event信號的參考信號;limit是data_event需要的最小建立時間。如果(time_of_reference_event-time_of_data_event)<limit,則報告時序沖突。2)?$hold保持時間檢查可以使用系統(tǒng)任務(wù)$hold。其語法格式如下:$hold(reference_event,data_event,limit);其中:reference_event用于檢查data_event信號的參考信號;data_event是被檢查的信號,需檢查它是否違反約束;limit是data_event需要的最小保持時間。如果(time_of_data_event-time_of_reference_event)<limit,則報告數(shù)據(jù)保持時間時序沖突。5.8編譯預(yù)處理語句編譯預(yù)處理是VerilogHDL編譯系統(tǒng)的一個組成部分,指編譯系統(tǒng)會對一些特殊命令進行預(yù)處理,然后將預(yù)處理結(jié)果和源程序一起再進行通常的編譯處理。以“`”(反引號)開始的某些標識符是編譯預(yù)處理語句。在VerilogHDL編譯時,特定的編譯指令在整個編譯過程中有效(編譯過程可跨越多個文件),直到遇到其他不同的編譯程序指令。常用的編譯預(yù)處理命令如下:5.8.1宏定義`define指令是一個宏定義命令,通過一個指定的標識符來代表一個字符串,可以增加VerilogHDL代碼的可讀性和可維護性,找出參數(shù)或函數(shù)不正確或不被允許的地方。`define指令類似于C語言中的#define指令,可以在模塊的內(nèi)部或外部定義,編譯器在編譯過程中遇到該語句將把宏文本替換為宏的名字。`define聲明的語法格式如下:`define<macro_name><Text>對于已聲明的語句,在代碼中的應(yīng)用格式如下(不要漏掉宏名稱前的符號“`”):`macro_name宏定義指令的有關(guān)注意事項:(1)宏定義的名稱可以是大寫,也可以是小寫,但要注意不要和變量名重復(fù)。(2)和所有編譯器偽指令一樣,宏定義在超過單個文件邊界時仍有效(對工程中的其他源文件),除非被后面的`define、`undef或`resetall偽指令覆蓋,否則`define不受范圍限制。(3)當用變量定義宏時,變量可以在宏正文中使用,并且在使用宏的時候可以用實際的變量表達式代替。(4)通過用反斜杠“\”轉(zhuǎn)義中間換行符,宏定義可以跨越幾行,新的行是宏正文的一部分。(5)宏定義行末不需要添加分號來表示結(jié)束。(6)宏正文不能分離的語言記號包括注釋、數(shù)字、字符串、保留的關(guān)鍵字和運算符。(7)編譯器偽指令不允許作為宏的名字。(8)宏定義中的文本也可以是一個表達式,并不僅僅用于變量名稱的替換。`define和parameter是有區(qū)別的。`define和parameter都可以用于文本替換,但其存在本質(zhì)上的不同,前者是編譯之前就預(yù)處理,而后者是在正常編譯過程中完成替換的。此外,`

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論