版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
5.1VerilogHDL電路仿真和驗(yàn)證概述
5.2VerilogHDL測(cè)試程序設(shè)計(jì)基礎(chǔ)
5.3與仿真相關(guān)的系統(tǒng)任務(wù)
5.4信號(hào)時(shí)間賦值語句
5.5任務(wù)和函數(shù)
5.6典型測(cè)試向量的設(shè)計(jì)
5.7基本門級(jí)元件和模塊的延時(shí)建模
5.8編譯預(yù)處理語句5.1VerilogHDL電路仿真和驗(yàn)證概述在VerilogHDL集成電路設(shè)計(jì)過程中,設(shè)計(jì)者完成RTL級(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ì)帶來缺陷。因此,設(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)輸入測(cè)試信號(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í)序,并未包含門延時(shí)和線延時(shí)。因此,RTL仿真對(duì)于時(shí)鐘來說是正確的,并且不用考慮競(jìng)爭(zhēng)冒險(xiǎn)、毛刺、建立和保持時(shí)間以及其他一些詳細(xì)的時(shí)序問題,這樣RTL仿真就具有較快的速度。驗(yàn)證是一系列測(cè)試平臺(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)證。在測(cè)試驗(yàn)證環(huán)節(jié),要求測(cè)試需具備高效、完備的特性。高效是指以最短的時(shí)間發(fā)現(xiàn)錯(cuò)誤,從而能以最短的時(shí)間上市;完備是指發(fā)現(xiàn)全部的錯(cuò)誤,要求測(cè)試達(dá)到一定的覆蓋率,包括代碼的覆蓋率和功能的覆蓋率。1.驗(yàn)證方法對(duì)于功能驗(yàn)證,根據(jù)驗(yàn)證的透明度,可以分為黑盒法、白盒法和灰盒法。1)黑盒法黑盒法就是把測(cè)試代碼看作一個(gè)黑盒子,測(cè)試人員完全不考慮代碼內(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):①
簡(jiǎn)單。驗(yàn)證者無須了解RTL級(jí)設(shè)計(jì)的細(xì)節(jié),只需根據(jù)規(guī)格說明書搭建Testbench(測(cè)試平臺(tái))。②
易于實(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)是可觀測(cè)性差。由于驗(yàn)證人員對(duì)內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)不了解,無法插入內(nèi)部測(cè)試點(diǎn),因此很難對(duì)錯(cuò)誤進(jìn)行迅速定位,在大規(guī)模設(shè)計(jì)中難以跟蹤錯(cuò)誤的根源。黑盒法一般適用于中小規(guī)模電路的驗(yàn)證。2)白盒法白盒法也稱結(jié)構(gòu)測(cè)試或邏輯驅(qū)動(dòng)測(cè)試,它是按照RTL級(jí)代碼內(nèi)部結(jié)構(gòu)進(jìn)行測(cè)試的,通過測(cè)試來檢測(cè)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è)置的觀測(cè)點(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)灰盒法灰盒法是介于黑盒法和白盒法之間的一種測(cè)試方法?;液袦y(cè)試關(guān)注輸出對(duì)于輸入正確性的影響,同時(shí)也關(guān)注內(nèi)部表現(xiàn),但這種關(guān)注沒有白盒法那樣詳細(xì)、完整,只是通過一些表征性的現(xiàn)象、事件、標(biāo)志來判斷內(nèi)部的運(yùn)行狀況。在很多測(cè)試中經(jīng)常會(huì)出現(xiàn)輸出正確、內(nèi)部錯(cuò)誤的情況,如果每次都通過白盒測(cè)試來操作,則效率會(huì)很低,因此可采取灰盒法。2.驗(yàn)證技術(shù)在功能驗(yàn)證中主要采用的技術(shù)包括動(dòng)態(tài)仿真、形式驗(yàn)證和硬件加速驗(yàn)證。1)動(dòng)態(tài)仿真動(dòng)態(tài)仿真是功能驗(yàn)證中最常用的方式,該方式是將編寫好的激勵(lì)序列送入被測(cè)電路輸入端,檢測(cè)輸出是否符合期望值。根據(jù)激勵(lì)產(chǎn)生的方式,動(dòng)態(tài)仿真可以劃分為定向測(cè)試和隨機(jī)測(cè)試。定向測(cè)試是為了驗(yàn)證某個(gè)具體功能而專門設(shè)計(jì)激勵(lì)信號(hào)。由于在仿真前就已知激勵(lì)內(nèi)容和期望的輸出內(nèi)容,因此分析輸出結(jié)果較為容易,它一般用在驗(yàn)證前期對(duì)電路基本功能的驗(yàn)證上。定向測(cè)試的缺點(diǎn)也很明顯,就是每個(gè)測(cè)試用例只能用一次,無法產(chǎn)生新的測(cè)試序列,因此不會(huì)提高代碼或功能覆蓋率。隨機(jī)測(cè)試特別是覆蓋率驅(qū)動(dòng)的隨機(jī)測(cè)試正是用來解決定向測(cè)試這一缺陷的。在驗(yàn)證環(huán)境中,隨機(jī)可以得到更多的數(shù)值集,減少了編寫激勵(lì)的工作量,提高了覆蓋率和驗(yàn)證效率;不同的隨機(jī)交叉組合可能驗(yàn)證到計(jì)劃中沒有指定的功能,提高了驗(yàn)證完備性。在VerilogHDL中隨機(jī)序列可以通過系統(tǒng)函數(shù)產(chǎn)生(見5.3.6節(jié))。檢測(cè)輸出的方法除了本章即將介紹的波形觀測(cè)和文本輸出方式外,還有斷言檢測(cè)、自動(dòng)化檢測(cè)和覆蓋率統(tǒng)計(jì)等。斷言來源于設(shè)計(jì)規(guī)范,用來評(píng)估一個(gè)設(shè)計(jì)屬性是否和期望值一致。在隨機(jī)測(cè)試中,由于仿真前無法得到激勵(lì)內(nèi)容,導(dǎo)致對(duì)輸出的判斷非常困難,因此需要用自動(dòng)化的檢測(cè)方式,如編寫抽象的行為級(jí)模型,將隨機(jī)信號(hào)同時(shí)送入模型和設(shè)計(jì)中,將兩個(gè)輸出作比較,從而驗(yàn)證電路設(shè)計(jì)的正確性。雖然隨機(jī)驗(yàn)證和自動(dòng)化檢測(cè)技術(shù)提高了驗(yàn)證效率,但需要一個(gè)客觀標(biāo)準(zhǔn)衡量驗(yàn)證是否完備,因此引入了“覆蓋率”這一概念。覆蓋率定義為已達(dá)到驗(yàn)證目標(biāo)的百分比,它被用作評(píng)估驗(yàn)證項(xiàng)目進(jìn)展的指標(biāo)。覆蓋率分為功能覆蓋率和代碼覆蓋率。功能覆蓋率用來衡量哪些設(shè)計(jì)特征已經(jīng)被測(cè)試程序驗(yàn)證到,它只關(guān)心電路功能,不關(guān)心具體的代碼如何實(shí)現(xiàn),因此也稱為黑盒覆蓋率。顯而易見,代碼覆蓋率用于衡量RTL代碼是否被執(zhí)行到,因此也稱為白盒覆蓋率。代碼覆蓋率具體又可分為分支覆蓋率、語句覆蓋率、翻轉(zhuǎn)覆蓋率、條件覆蓋率和狀態(tài)機(jī)覆蓋率。一般仿真工具都具有自動(dòng)統(tǒng)計(jì)代碼覆蓋率的功能(見7.2.1節(jié))。需要注意的是:如果代碼覆蓋率為100%,并不能代表功能沒問題。如果功能覆蓋率低,但是代碼覆蓋率高,說明測(cè)試用例沒有涉及一些功能點(diǎn),需要修改并增加測(cè)試用例;反之,功能覆蓋率高,但是代碼覆蓋率低,需要分析未覆蓋到的代碼,推斷仿真是否有遺漏的功能點(diǎn),代碼是否為冗余或不可達(dá)到。2)形式驗(yàn)證與動(dòng)態(tài)仿真相比,形式驗(yàn)證是一種靜態(tài)驗(yàn)證方法,它不需要激勵(lì)輸入,而是通過數(shù)學(xué)方法來驗(yàn)證設(shè)計(jì)的正確性。形式驗(yàn)證工具通過嚴(yán)密的數(shù)學(xué)邏輯算法窮盡所有輸入可能,所以它容易實(shí)現(xiàn)驗(yàn)證的完備性。形式驗(yàn)證分為兩種方式:等價(jià)檢查和屬性檢查。等價(jià)檢查是驗(yàn)證兩個(gè)設(shè)計(jì)在功能上是否相同的過程,可以用來檢查不同抽象層次的電路是否一致,如RTL級(jí)和網(wǎng)表的等價(jià)檢查可以保證綜合過程沒有邏輯錯(cuò)誤。屬性檢查,首先通過專用驗(yàn)證語言描述電路的功能屬性,屬性被轉(zhuǎn)換成等價(jià)表達(dá)式來評(píng)估對(duì)錯(cuò),隨后驗(yàn)證工具用靜態(tài)方式證明在所有測(cè)試狀態(tài)下的設(shè)計(jì)都滿足這個(gè)屬性;如果不滿足,會(huì)列舉出錯(cuò)誤的例子。3)硬件加速驗(yàn)證動(dòng)態(tài)仿真和形式驗(yàn)證技術(shù)是純軟件的模擬方式。隨著驗(yàn)證規(guī)模越來越大,限制驗(yàn)證效率的最大因素就是仿真速度,軟件模擬已不能滿足像SoC這樣大規(guī)模軟硬件協(xié)同仿真驗(yàn)證了。因此,利用硬件輔助加速技術(shù)來縮短驗(yàn)證時(shí)間、提高驗(yàn)證效率的方法被提了出來。硬件輔助加速的基本思想是:編寫好的驗(yàn)證平臺(tái)(Testbench)在主機(jī)中運(yùn)行,將設(shè)計(jì)映射或下載到可配置的硬件加速器中,驗(yàn)證平臺(tái)產(chǎn)生的激勵(lì)通過實(shí)際物理接口連接到硬件加速器,這樣設(shè)計(jì)在接近最終產(chǎn)品的應(yīng)用環(huán)境下全速運(yùn)行;同時(shí),通過軟件和硬件的檢測(cè)機(jī)制對(duì)驗(yàn)證過程進(jìn)行監(jiān)測(cè)和調(diào)試。之前,硬件加速方式是基于FPGA平臺(tái)的。采用FPGA驗(yàn)證,雖然整體驗(yàn)證可以全速運(yùn)行,但是能夠觀察的信號(hào)會(huì)急劇減少,如果發(fā)生運(yùn)行異常而需要尋找設(shè)計(jì)錯(cuò)誤時(shí),必須修改觀測(cè)信號(hào),而每次修改都意味著重新編譯綜合整個(gè)設(shè)計(jì),這將之前驗(yàn)證運(yùn)行節(jié)省的時(shí)間都用在了重新修改編譯下載上。現(xiàn)在主流的硬件加速方式是基于專用模擬器(Emulation)的,相對(duì)FPGA驗(yàn)證方式,它具備更準(zhǔn)確的分析能力和更高的信號(hào)可見性。在仿真時(shí)能清楚地觀測(cè)到內(nèi)部信號(hào)的變化過程,并能對(duì)內(nèi)部不同模塊進(jìn)行功耗等性能分析,從而更好地幫助設(shè)計(jì)者進(jìn)行電路修正及優(yōu)化。隨著設(shè)計(jì)規(guī)模的不斷增大和復(fù)雜性的不斷提高,驗(yàn)證面臨巨大的挑戰(zhàn)。僅僅用一種驗(yàn)證技術(shù)無法實(shí)現(xiàn)驗(yàn)證的完備性、高可靠性、可重用性及高效率。因此需要結(jié)合多種驗(yàn)證方法來對(duì)設(shè)計(jì)進(jìn)行全方位的驗(yàn)證,從而讓設(shè)計(jì)的產(chǎn)品更加完善。5.2VerilogHDL測(cè)試程序設(shè)計(jì)基礎(chǔ)5.2.1Testbench及其結(jié)構(gòu)在VerilogHDL中,通常采用測(cè)試平臺(tái)(Testbench)進(jìn)行仿真和驗(yàn)證。在仿真時(shí),Testbench用來產(chǎn)生測(cè)試激勵(lì)信號(hào)給待驗(yàn)證設(shè)計(jì),或者稱為待測(cè)試設(shè)計(jì),同時(shí)檢查DUV/DUT的輸出是否與預(yù)期的一致,從而達(dá)到驗(yàn)證設(shè)計(jì)功能的目的,如圖5.2-1所示。應(yīng)該指出的是,由于Testbench是一個(gè)測(cè)試平臺(tái),信號(hào)集成在模塊內(nèi)部,因此沒有輸入、輸出。在Testbench模塊內(nèi),例化待測(cè)試設(shè)計(jì)的頂層模塊,并把測(cè)試行為的代碼封裝在內(nèi),直接對(duì)待測(cè)試系統(tǒng)提供測(cè)試激勵(lì)。圖5.2-2給出了一個(gè)典型的Testbench程序結(jié)構(gòu)。5.2.2測(cè)試平臺(tái)舉例為了驗(yàn)證設(shè)計(jì)模塊功能的正確性,需要在Testbench中輸入激勵(lì)信號(hào)給設(shè)計(jì)模塊,同時(shí)觀察這些激勵(lì)信號(hào)在設(shè)計(jì)模塊中的響應(yīng)是否與設(shè)計(jì)目標(biāo)值一致。圖5.2-5中給出了一個(gè)DUT的仿真平臺(tái)。測(cè)試平臺(tái)會(huì)產(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)生的測(cè)試激勵(lì)信號(hào)輸入給設(shè)計(jì)模塊,再觀察DUT的響應(yīng)是否與期望值相同。下面介紹組合邏輯電路和時(shí)序邏輯電路測(cè)試仿真環(huán)境的搭建。圖5.2-5
DUT仿真平臺(tái)1.組合邏輯電路仿真環(huán)境的搭建組合邏輯電路的設(shè)計(jì)驗(yàn)證主要是檢查設(shè)計(jì)結(jié)果是否符合該電路真值表的功能,因此在搭建組合邏輯電路仿真環(huán)境時(shí),用initial語句塊把被測(cè)電路的輸入信號(hào)按照真值表提供的數(shù)據(jù)變化情況作為測(cè)試條件。組合邏輯電路的特點(diǎn)決定了仿真中只需對(duì)輸入信號(hào)進(jìn)行設(shè)計(jì)即可,沒有時(shí)序、定時(shí)信息和全局復(fù)位、置位等信號(hào)要求。2.時(shí)序邏輯電路仿真環(huán)境的搭建時(shí)序邏輯電路仿真環(huán)境的搭建要求與組合邏輯電路基本相同,主要區(qū)別在于時(shí)序邏輯電路的仿真環(huán)境中,需要考慮時(shí)序、定時(shí)信息和全局復(fù)位、置位等信號(hào)要求,并定義這些信號(hào)。5.2.3VerilogHDL仿真結(jié)果確認(rèn)VerilogHDL仿真結(jié)果的正確性可以通過觀察波形、觀察文本輸出、自動(dòng)檢查仿真結(jié)果和使用VCD文件等方式來確認(rèn)。1.觀察波形觀察波形即通過直接觀察各信號(hào)波形的輸出,比較測(cè)試值和期望值的大小,來確定仿真結(jié)果的正確性。圖5.2-8是ModelSim信號(hào)波形觀察窗口。這種方式的優(yōu)勢(shì)在于觀測(cè)信號(hào)比較直觀,適用于觀測(cè)時(shí)間較短的測(cè)試信號(hào)。2.觀察文本輸出VerilogHDL語法中規(guī)定了一系列系統(tǒng)任務(wù),其中的打印任務(wù)主要用來協(xié)助查看仿真結(jié)果。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ù)期值,則會(huì)產(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)行分析。5.2.4VerilogHDL仿真效率與C/C++?等軟件語言相比,VerilogHDL行為級(jí)仿真代碼的執(zhí)行時(shí)間比較長,其主要原因就是要通過串行軟件代碼完成并行語義的轉(zhuǎn)換。隨著代碼的增加,仿真驗(yàn)證過程會(huì)非常漫長,從而導(dǎo)致仿真效率降低。這成為整體設(shè)計(jì)的瓶頸。即便如此,不同的設(shè)計(jì)代碼其仿真效率也是不同的。鑒于此,提出了以下幾點(diǎn)建議,可幫助設(shè)計(jì)人員提高VerilogHDL代碼的仿真效率。1.減小層次結(jié)構(gòu)仿真代碼的層次越少,執(zhí)行時(shí)間就越短。這主要是因?yàn)閰?shù)在模塊端口之間傳遞時(shí)需要消耗仿真器的執(zhí)行時(shí)間。2.減少門級(jí)代碼的使用由于門級(jí)建模屬于結(jié)構(gòu)化建模,自身參數(shù)建模較復(fù)雜,需要通過建模調(diào)用的方式來實(shí)現(xiàn),因此仿真代碼應(yīng)盡量使用行為級(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í)間和分辨率,提高仿真效率。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與仿真相關(guān)的系統(tǒng)任務(wù)5.3.1$display和?$writeVerilogHDL中兩個(gè)主要的標(biāo)準(zhǔn)輸出任務(wù)是$display和?$write,這兩個(gè)系統(tǒng)函數(shù)都用于輸出信息且語法格式相同。其語法格式分別如下:$display("<format_specifiers>",<signal1,signal2,…,signaln>);$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-2中的轉(zhuǎn)換序列來輸出。表中的字符形式用于格式字符串參數(shù)中,用來顯示特殊的字符。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>);5.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ù)以64bit整數(shù)值的形式返回仿真時(shí)間,而?$realtime函數(shù)則以實(shí)型數(shù)據(jù)的形式返回仿真時(shí)間。(1)系統(tǒng)函數(shù)?$time。$time可以返回一個(gè)64bit整數(shù)表示的當(dāng)前仿真時(shí)刻值,該時(shí)刻值是以模塊的開始仿真時(shí)間為基準(zhǔn)的。5.3.4$finish和?$stop系統(tǒng)任務(wù)?$finish和?$stop用于對(duì)仿真過程的控制,分別表示結(jié)束仿真和中斷仿真。其語法格式分別如下:其中,n是參數(shù),可以取0、1或2幾個(gè)值,含義如表5.3-3所示。$finish的作用是退出仿真器,返回主操作系統(tǒng),也就是結(jié)束仿真過程。$finish可以帶參數(shù),根據(jù)參數(shù)的值輸出不同的特征信息;如果不帶參數(shù),則默認(rèn)?$finish的參數(shù)值為1。$stop的作用是把EDA工具(如仿真器)置成暫停模式,在仿真環(huán)境下給出一個(gè)交互式的命令提示符,將控制權(quán)交給用戶。該任務(wù)可以帶有參數(shù)表達(dá)式。根據(jù)參數(shù)值(0、1或2)的不同,輸出不同的信息。參數(shù)值越大,輸出的信息越多。5.3.5$readmemb和?$readmemhVerilogHDL程序中的系統(tǒng)任務(wù)?$readmemb和?$readmemh用來從文件中讀取數(shù)據(jù)到存儲(chǔ)器中。這兩個(gè)系統(tǒng)任務(wù)可以在仿真的任何時(shí)刻被執(zhí)行使用。其語法格式分別如下:在這兩個(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ù)字必須用空白位置或注釋行分隔開。數(shù)據(jù)文件中允許出現(xiàn)十六進(jìn)制地址說明@hhh,表示將該地址說明后的數(shù)據(jù)內(nèi)容存放到存儲(chǔ)器相應(yīng)地址的后續(xù)單元中。5.3.6$random$random是產(chǎn)生隨機(jī)數(shù)的系統(tǒng)函數(shù),每次調(diào)用該函數(shù)將返回一個(gè)32bit的隨機(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的一般用法如下:$random%b;其中,b為一常數(shù)且要求大于零,它給出了一個(gè)范圍為?-b+1~b-1的隨機(jī)數(shù)。利用位拼接操作符“{?}”可將函數(shù)?$random返回的有符號(hào)整數(shù)變換為無符號(hào)數(shù),其用法如下:{$random}%b;其中,b為一常數(shù)且要求大于零,它給出了一個(gè)范圍為0~b-1的隨機(jī)數(shù)。5.4信號(hào)時(shí)間賦值語句在集成電路設(shè)計(jì)和驗(yàn)證階段,經(jīng)常需要對(duì)特定信號(hào)進(jìn)行延時(shí)來實(shí)現(xiàn)相應(yīng)的時(shí)序控制,或者避免信號(hào)沖突形成電路中的熱點(diǎn)。信號(hào)的時(shí)間延遲可以通過兩類方式來完成:一類是延時(shí)控制,它是為行為語句的執(zhí)行指定一個(gè)延遲時(shí)間的信號(hào)時(shí)間延遲方式,可以分為串行延時(shí)控制、并行延時(shí)控制、阻塞式延時(shí)控制和非阻塞式延時(shí)控制;另一類是事件控制,它是為行為語句的執(zhí)行指定觸發(fā)事件的信號(hào)時(shí)間控制方式,可以分為邊沿觸發(fā)事件控制和電平敏感事件控制。5.4.1時(shí)間延遲的語法說明延時(shí)語句用于對(duì)各條語句的執(zhí)行時(shí)間進(jìn)行控制,從而快速滿足用戶的時(shí)序要求。VerilogHDL中延時(shí)控制的語法格式有如下兩類:其中,符號(hào)“#”是延時(shí)控制的關(guān)鍵字符,“延遲時(shí)間”可以是直接指定的延遲時(shí)間量,或者以參數(shù)的形式給出。在仿真過程中,所有的延遲時(shí)間都根據(jù)時(shí)間單位定義。圖5.4-1為信號(hào)的時(shí)間延遲分類。5.4.2時(shí)間延遲的描述形式此處,時(shí)間延遲的描述形式是指延時(shí)控制的描述形式,分為串行延時(shí)控制、并行延時(shí)控制、阻塞式延時(shí)控制和非阻塞式延時(shí)控制四種形式。下面以實(shí)現(xiàn)兩組不同波形的信號(hào)為例(圖5.4-2中的q0_out和q1_out)來說明四種不同時(shí)間延遲的描述形式。1.串行延時(shí)控制串行延時(shí)控制是最為常見的信號(hào)延時(shí)控制,它是由begin-end過程塊加上延時(shí)賦值語句構(gòu)成的,其中延時(shí)賦值語句可以為外部時(shí)間控制方式,也可以為內(nèi)部時(shí)間控制方式。在“延遲時(shí)間”之后也可根據(jù)實(shí)際情況來確定是否執(zhí)行相應(yīng)的行為語句。若在“延遲時(shí)間”后面有相應(yīng)的行為語句,則仿真進(jìn)程遇到這條帶有延時(shí)控制的行為語句后并不立即執(zhí)行行為語句指定的操作,而是等到“延遲時(shí)間”所指定的時(shí)間量過去后才真正開始執(zhí)行行為語句指定的操作。2.并行延時(shí)控制并行延時(shí)控制是通過fork-join過程塊加上延時(shí)賦值語句構(gòu)成的,其中延時(shí)賦值語句同串行延時(shí)控制一樣,既可以是外部時(shí)間控制方式,也可以是內(nèi)部時(shí)間控制方式。在“延遲時(shí)間”之后也可根據(jù)實(shí)際情況來確定是否執(zhí)行相應(yīng)的行為語句。在“延遲時(shí)間”后面有相應(yīng)的行為語句,則仿真進(jìn)程遇到這條帶有延時(shí)控制的行為語句后并不立即執(zhí)行行為語句指定的操作,而是等到“延遲時(shí)間”所指定的時(shí)間量過去后才真正開始執(zhí)行行為語句指定的操作。但并行延時(shí)控制方式與串行延時(shí)控制方式的不同之處在于,并行延時(shí)控制方式中的多條延時(shí)語句是并行執(zhí)行的,并不需要等待上一條語句執(zhí)行完成后才開始執(zhí)行當(dāng)前的語句。3.阻塞式延時(shí)控制以賦值操作符“=”來標(biāo)識(shí)的賦值操作稱為“阻塞式過程賦值”,阻塞式過程賦值前面已經(jīng)介紹過,在此介紹阻塞式延時(shí)控制。阻塞式延時(shí)控制是在阻塞式過程賦值基礎(chǔ)上帶有延時(shí)控制的情況。4.非阻塞式延時(shí)控制以賦值操作符“<=”來標(biāo)識(shí)的賦值操作稱為“非阻塞式過程賦值”,非阻塞式過程賦值也在前面介紹過,在此主要介紹非阻塞式延時(shí)控制。非阻塞式延時(shí)控制是在非阻塞式過程賦值基礎(chǔ)上帶有延時(shí)控制的情況。5.4.3邊沿觸發(fā)事件控制邊沿觸發(fā)事件控制是在指定的信號(hào)變化時(shí)刻,即指定的信號(hào)跳變邊沿才觸發(fā)語句的執(zhí)行,而當(dāng)信號(hào)處于穩(wěn)定狀態(tài)時(shí)則不會(huì)觸發(fā)語句的執(zhí)行。邊沿觸發(fā)事件控制的語法格式有如下四種形式:@(<事件表達(dá)式>)行為語句;@(<事件表達(dá)式>);@(<事件表達(dá)式1>or<事件表達(dá)式2>or…or<事件表達(dá)式n>)行為語句;@(<事件表達(dá)式1>or<事件表達(dá)式2>or…or<事件表達(dá)式n>);在以上四種格式中,符號(hào)“@”是邊沿觸發(fā)事件控制的標(biāo)識(shí)符;“事件表達(dá)式”代表著觸發(fā)語句執(zhí)行的觸發(fā)事件;“行為語句”則指出了觸發(fā)事件所要觸發(fā)執(zhí)行的具體操作。格式中的事件表達(dá)式部分,即(<事件表達(dá)式>)和(<事件表達(dá)式1>or<事件表達(dá)式2>or…or<事件表達(dá)式n>)被稱為“敏感事件列表”。1.事件表達(dá)式事件表達(dá)式中可以出現(xiàn)以下三種形式:形式1:<信號(hào)名>形式2:posedge<信號(hào)名>形式3:negedge<信號(hào)名>其中,“信號(hào)名”可以是任何數(shù)據(jù)類型的標(biāo)量或矢量。說明:(1)形式1中,代表觸發(fā)事件的“信號(hào)名”在指定的信號(hào)發(fā)生邏輯變化時(shí),執(zhí)行下面的語句(示例):@(in)out=in;當(dāng)敏感事件in發(fā)生邏輯變化(包括正跳變和負(fù)跳變)時(shí),執(zhí)行對(duì)應(yīng)的賦值語句,將in的值賦給out。(2)形式2中,代表觸發(fā)事件的“posedge<信號(hào)名>”在指定的信號(hào)發(fā)生了正跳變時(shí),執(zhí)行下面的語句(示例):@(posedgein)out=in;當(dāng)敏感事件in發(fā)生正跳變時(shí),執(zhí)行對(duì)應(yīng)的賦值語句,將in的值賦給out。(3)形式3中,代表觸發(fā)事件的“negedge<信號(hào)名>”在指定的信號(hào)發(fā)生了負(fù)跳變時(shí),執(zhí)行下面的語句(示例):@(negedgein)out=in;當(dāng)敏感事件in發(fā)生負(fù)跳變時(shí),執(zhí)行對(duì)應(yīng)的賦值語句,將in的值賦給out。在信號(hào)發(fā)生邏輯變化(正跳變或負(fù)跳變)的過程中,信號(hào)的值是從0、1、x、z四個(gè)值中的一個(gè)值變化到另一個(gè)值;而信號(hào)發(fā)生正跳變的過程是信號(hào)由低電平向高電平的轉(zhuǎn)變,負(fù)跳變是信號(hào)由高電平向低電平的轉(zhuǎn)變。表5.4-1為VerilogHDL中規(guī)定的邏輯信號(hào)的正跳變和負(fù)跳變。2.邊沿觸發(fā)語法格式形式1:@(<事件表達(dá)式>)行為語句;這種語法格式的“敏感事件列表”內(nèi)只包含了一個(gè)觸發(fā)事件,只有當(dāng)這個(gè)指定的觸發(fā)事件發(fā)生之后,后面的行為語句才能啟動(dòng)執(zhí)行。在仿真進(jìn)程中遇到這種帶有事件控制的行為語句時(shí),如果指定的觸發(fā)事件還沒有發(fā)生,則仿真進(jìn)程就會(huì)停留在此處等待,直到指定的觸發(fā)事件發(fā)生后才啟動(dòng)執(zhí)行后面的行為語句,仿真進(jìn)程繼續(xù)向下進(jìn)行。5.4.4電平敏感事件控制電平敏感事件控制是另一種事件控制方式,與邊沿觸發(fā)事件控制不同,它是在指定的條件表達(dá)式為真時(shí)啟動(dòng)需要執(zhí)行的語句。電平敏感事件控制是用關(guān)鍵詞wait來表示的。電平敏感事件控制的語法格式有如下兩種:形式1:wait(條件表達(dá)式)行為語句;形式2:wait(條件表達(dá)式);說明:(1)電平敏感事件控制的第1種形式中包含了“行為語句”,它可以是串行塊(begin-end)語句或并行塊(fork-join)語句,也可以是單條行為語句。在這種事件控制語句形式下,行為語句啟動(dòng)執(zhí)行的觸發(fā)條件是條件表達(dá)式的值為“真(邏輯1)”。如果當(dāng)仿真進(jìn)程執(zhí)行到這條電平敏感事件控制語句時(shí)條件表達(dá)式的值是“真”,那么語句塊立即執(zhí)行,否則語句塊要一直等到條件表達(dá)式的值變?yōu)椤罢妗睍r(shí)再開始執(zhí)行。(2)電平敏感事件控制的第2種形式中沒有包含“行為語句”。在這種電平敏感事件控制語句形式下,如果仿真進(jìn)程執(zhí)行到該wait控制語句時(shí),條件表達(dá)式的值是“真”,那么立即結(jié)束該wait事件控制語句的執(zhí)行,仿真進(jìn)程繼續(xù)往下進(jìn)行;而如果仿真進(jìn)程執(zhí)行到這條wait控制語句時(shí),條件表達(dá)式的值是“假”,則仿真進(jìn)程進(jìn)入等待狀態(tài),一直等到條件表達(dá)式取值變?yōu)椤罢妗睍r(shí)才退出等待狀態(tài),同時(shí)結(jié)束該wait語句的執(zhí)行,仿真進(jìn)程繼續(xù)向下進(jìn)行。這種形式的電平敏感事件控制常常用來對(duì)串行塊中各條語句的執(zhí)行時(shí)序進(jìn)行控制。5.5任
務(wù)
和
函
數(shù)在行為級(jí)設(shè)計(jì)中,設(shè)計(jì)者經(jīng)常需要在程序的多個(gè)不同地方實(shí)現(xiàn)同樣的功能。因此有必要把這些公共部分提取出來組成子程序,然后在需要的地方調(diào)用這些子程序,這樣就可以避免重復(fù)編碼。VerilogHDL中提供了任務(wù)和函數(shù),可以將較大的行為級(jí)設(shè)計(jì)劃分為較小的代碼段,允許設(shè)計(jì)者將需要在多個(gè)地方重復(fù)使用的相同代碼提取出來,編寫成任務(wù)和函數(shù),這樣可以使代碼更加簡(jiǎn)潔和易懂。任務(wù)具有輸入、輸出和輸入/輸出(雙向)變量,而函數(shù)具有輸入變量,這樣數(shù)據(jù)就能夠傳入任務(wù)和函數(shù),并且能夠?qū)⒔Y(jié)果輸出。5.5.1任務(wù)VerilogHDL使用關(guān)鍵字task和endtask對(duì)任務(wù)進(jìn)行聲明。VerilogHDL中規(guī)定,如果子程序滿足以下任一條件,則公共子程序的描述必須使用任務(wù)而不能使用函數(shù):(1)子程序中包含有延時(shí)、時(shí)序或者事件控制結(jié)構(gòu)。(2)沒有輸出或者輸出變量的數(shù)量大于1。(3)沒有輸入變量。任務(wù)(task)類似于其他高級(jí)程序編程語言中的“過程”。任務(wù)的使用包括任務(wù)的定義和任務(wù)的調(diào)用。1.任務(wù)的定義任務(wù)定義的語法格式如下:說明:(1)任務(wù)定義是嵌入在關(guān)鍵字task和endtask之間的,其中關(guān)鍵詞task標(biāo)志著一個(gè)任務(wù)定義結(jié)構(gòu)的開始,endtask標(biāo)志著一個(gè)任務(wù)定義結(jié)構(gòu)的結(jié)束?!叭蝿?wù)名”是所定義任務(wù)的名稱。在“任務(wù)名”后面不能出現(xiàn)輸入、輸出端口列表。(2)“端口和類型聲明”用于對(duì)任務(wù)各個(gè)端口的寬度和類型進(jìn)行聲明,其中使用關(guān)鍵詞input、output或inout對(duì)任務(wù)的端口進(jìn)行聲明。input類型和inout類型的變量從外部傳遞到任務(wù)中,input類型的變量在任務(wù)所包含的語句中進(jìn)行處理。當(dāng)任務(wù)完成時(shí),output類型和inout類型的變量傳回給任務(wù)調(diào)用語句中相應(yīng)的變量。在任務(wù)中使用關(guān)鍵字input、output或inout對(duì)輸入/輸出變量進(jìn)行聲明,其聲明語句的語法與模塊中端口聲明的語法一樣,但是兩者在本質(zhì)上是有區(qū)別的:模塊的端口用來和外部信號(hào)相連接,而任務(wù)的輸入/輸出變量則用來向任務(wù)中傳入或從中傳出變量。(3)“局部變量聲明”用來對(duì)任務(wù)內(nèi)用到的局部變量進(jìn)行寬度和類型聲明,該聲明語句的語法與進(jìn)行模塊定義時(shí)相應(yīng)聲明語句的語法一致。(4)任務(wù)中由begin與end關(guān)鍵詞界定的一系列語句指明了任務(wù)被調(diào)用時(shí)需要進(jìn)行的操作,在任務(wù)被調(diào)用時(shí)這些語句將以串行方式執(zhí)行。2.任務(wù)的調(diào)用任務(wù)的調(diào)用是通過“任務(wù)調(diào)用語句”來實(shí)現(xiàn)的。任務(wù)調(diào)用語句列出了傳入任務(wù)和傳出任務(wù)的參數(shù)值。任務(wù)的調(diào)用格式如下:<任務(wù)名>(端口1,端口2,…,端口n);在任務(wù)調(diào)用時(shí),任務(wù)調(diào)用語句只能出現(xiàn)在過程塊內(nèi),任務(wù)調(diào)用語句就像普通的行為語句一樣得到處理。當(dāng)被調(diào)用的任務(wù)具有輸入或輸出端口時(shí),任務(wù)調(diào)用語句必須包含端口名列表,這個(gè)列表內(nèi)各個(gè)端口名出現(xiàn)的順序和類型,必須與任務(wù)定義結(jié)構(gòu)中端口說明部分的端口順序和類型一致。注意,只有寄存器類的變量才能與任務(wù)的輸出端口相對(duì)應(yīng)。5.5.2函數(shù)VerilogHDL使用關(guān)鍵字function和endfunction對(duì)函數(shù)進(jìn)行聲明。
對(duì)于一個(gè)子程序來說,如果下面的所有條件全部成立,則可以使用函數(shù)來完成:(1)子程序內(nèi)不含有延時(shí)、時(shí)序或者事件控制結(jié)構(gòu)。(2)子程序只有一個(gè)返回值。(3)至少有一個(gè)輸入變量。(4)沒有輸出或者雙向變量。(5)不含有非阻塞式賦值語句。VerilogHDL的函數(shù)類似于其他編程語言中的函數(shù),其目的都是通過函數(shù)運(yùn)算返回一個(gè)值。與任務(wù)一樣,函數(shù)也包括函數(shù)的定義與函數(shù)的調(diào)用。1.函數(shù)的定義函數(shù)定義的語法格式如下:說明:(1)函數(shù)定義是嵌入在關(guān)鍵字function和endfunction之間的,其中關(guān)鍵字function標(biāo)志著一個(gè)函數(shù)定義結(jié)構(gòu)的開始,endfunction標(biāo)志著一個(gè)函數(shù)定義結(jié)構(gòu)的結(jié)束?!昂瘮?shù)名”是給被定義函數(shù)取的名稱,該函數(shù)名在函數(shù)定義結(jié)構(gòu)內(nèi)部還代表著一個(gè)內(nèi)部變量,函數(shù)調(diào)用后的返回值是通過這個(gè)函數(shù)名變量傳遞給調(diào)用語句的。(2)“返回值類型或位寬”是一個(gè)可選項(xiàng),用來對(duì)函數(shù)調(diào)用返回?cái)?shù)據(jù)的類型或?qū)挾冗M(jìn)行說明,它可以有如下三種形式:①?[msb:lsb]:這種形式說明函數(shù)名所代表的返回變量是一個(gè)多位的寄存器變量,它的位寬由[msb:lsb]指定。比如函數(shù)定義語句function[7:0]adder;就定義了一個(gè)函數(shù)adder,其函數(shù)名adder還代表著一個(gè)8位寬的寄存器變量,其中最高位為第7位,最低位為第0位。②?integer:這種形式說明函數(shù)名所代表的返回變量是一個(gè)整型變量。③?real:這種形式說明函數(shù)名所代表的返回變量是一個(gè)實(shí)型變量。如果在函數(shù)聲明語句中缺省“返回值類型或位寬”項(xiàng),則認(rèn)為函數(shù)名所代表的返回值是一個(gè)寄存器類型的數(shù)據(jù)。(3)“輸入?yún)⒘颗c類型聲明”是對(duì)函數(shù)各輸入端口的寬度和類型進(jìn)行聲明。在函數(shù)定義中,至少有一個(gè)輸入端口(input)的聲明,不能有輸出端口(output)的聲明。數(shù)據(jù)類型聲明語句用來對(duì)函數(shù)內(nèi)用到的局部變量進(jìn)行寬度和類型聲明,該聲明語句的語法與進(jìn)行模塊定義時(shí)相應(yīng)聲明語句的語法一致。(4)“局部變量聲明”是對(duì)函數(shù)內(nèi)部局部變量進(jìn)行寬度和類型的聲明。(5)由begin與end關(guān)鍵詞界定的一系列語句同任務(wù)中的一樣,用來指明函數(shù)被調(diào)用時(shí)要執(zhí)行的操作。在函數(shù)被調(diào)用時(shí),這些語句將以串行方式執(zhí)行。2.函數(shù)的調(diào)用函數(shù)的調(diào)用是通過將函數(shù)作為表達(dá)式中的操作數(shù)來實(shí)現(xiàn)的。函數(shù)的調(diào)用格式如下:<函數(shù)名>(<輸入表達(dá)式1>,<輸入表達(dá)式2>,…,<輸入表達(dá)式n>);其中,“輸入表達(dá)式”應(yīng)與函數(shù)定義結(jié)構(gòu)中說明的輸入端口一一對(duì)應(yīng),它們代表著各輸入端口的輸入數(shù)據(jù)。函數(shù)調(diào)用時(shí)的注意事項(xiàng)如下:(1)函數(shù)的調(diào)用不能單獨(dú)作為一條語句出現(xiàn),它只能作為一個(gè)操作數(shù)出現(xiàn)在賦值語句內(nèi)。(2)函數(shù)的調(diào)用既能出現(xiàn)在過程塊中,也能出現(xiàn)在assign連續(xù)賦值語句中。(3)函數(shù)定義中聲明的所有局部寄存器都是靜態(tài)的,即函數(shù)中的局部寄存器在函數(shù)的多個(gè)調(diào)用之間保持它們的值。5.5.3任務(wù)與函數(shù)的區(qū)別在VerilogHDL中,任務(wù)和函數(shù)用于不同的目的,表5.5-1列出了任務(wù)和函數(shù)的區(qū)別。任務(wù)和函數(shù)都必須在模塊內(nèi)進(jìn)行定義,其作用范圍僅局限于定義它們的模塊。任務(wù)用于代替普通的VerilogHDL代碼,其中可以包括延時(shí)、時(shí)序、事件等語法結(jié)構(gòu),并且可以具有多個(gè)輸出變量。函數(shù)用于代替表示純邏輯的VerilogHDL代碼,在仿真時(shí)刻0就開始執(zhí)行,只能有一個(gè)輸出。因此,函數(shù)一般用于完成各類轉(zhuǎn)換和常用的計(jì)算。任務(wù)可以有輸入、輸出和輸入/輸出(雙向)變量,而函數(shù)只有輸入變量。另外,可以在任務(wù)和函數(shù)中聲明局部變量,如寄存器、整數(shù)、實(shí)數(shù)和時(shí)間,但是不能聲明線網(wǎng)類型的變量。在任務(wù)和函數(shù)中只能使用行為級(jí)語句,但是不能包含always和initial塊。設(shè)計(jì)者可以在always塊、initial塊以及其他的任務(wù)和函數(shù)中調(diào)用任務(wù)和函數(shù)。在VerilogHDL語法中,任務(wù)和函數(shù)是從高級(jí)程序語言中繼承過來的,其語法使用范圍具有一定的局限性,對(duì)于初學(xué)者而言,掌握起來較為困難。實(shí)際上,在對(duì)數(shù)字電路的設(shè)計(jì)中,VerilogHDL更傾向于使用模塊來解決代碼的重復(fù)問題,這種表示方法和電路的實(shí)際組成相近,在描述方式上也更加直觀。5.6典型測(cè)試向量的設(shè)計(jì)5.6.1變量初始化在VerilogHDL中,有兩種方法可以初始化變量:一種是利用初始化過程塊;另一種是在定義變量時(shí)直接賦值初始化。這兩種初始化任務(wù)是不可綜合的,主要用于仿真過程。1.?initial初始化方式在大多數(shù)情況下,Testbench中變量初始化的工作通過initial過程塊來完成,可以產(chǎn)生豐富的仿真激勵(lì)。initial語句只執(zhí)行一次,即自設(shè)計(jì)被開始模擬執(zhí)行時(shí)開始(0時(shí)刻),直到過程結(jié)束,專門用于對(duì)輸入信號(hào)進(jìn)行初始化和產(chǎn)生特定的信號(hào)波形。一個(gè)Testbench可以包含多個(gè)initial過程語句塊,所有的initial過程都同時(shí)執(zhí)行。需要注意的是,initial語句中的變量必須為reg類型。2.定義變量時(shí)初始化定義變量時(shí)進(jìn)行初始化的語法非常簡(jiǎn)單,直接用“=”在變量右端賦值即可,例如:reg[7:0]cnt=8'b00000000;就將8bit的寄存器變量cnt初始化為0。5.6.2數(shù)據(jù)信號(hào)測(cè)試向量的產(chǎn)生數(shù)據(jù)信號(hào)測(cè)試向量既可以通過VerilogHDL的時(shí)間控制功能(#、initial、always語句)來產(chǎn)生各類驗(yàn)證數(shù)據(jù),也可以通過系統(tǒng)任務(wù)來讀取計(jì)算機(jī)上已存在的數(shù)據(jù)文件。數(shù)據(jù)信號(hào)的產(chǎn)生有兩種形式:其一是初始化和產(chǎn)生都在單個(gè)initial塊中進(jìn)行;其二是初始化在initial語句中完成,而產(chǎn)生在always語句中完成。前者適合不規(guī)則數(shù)據(jù)序列,并且要求長度較短;后者適合具有一定規(guī)律的數(shù)據(jù)序列,長度不限。5.6.3時(shí)鐘信號(hào)測(cè)試向量的產(chǎn)生時(shí)序電路應(yīng)用廣泛,其中,時(shí)鐘信號(hào)是時(shí)序電路設(shè)計(jì)中最關(guān)鍵的參數(shù)之一,因此本小節(jié)專門介紹如何產(chǎn)生仿真驗(yàn)證過程所需要的各類時(shí)鐘信號(hào)。5.6.4數(shù)據(jù)的同步產(chǎn)生和輸出在前面的例子中,數(shù)據(jù)向量的產(chǎn)生和時(shí)鐘均采用獨(dú)立的時(shí)序。但在實(shí)際的電路工作環(huán)境中,輸入數(shù)據(jù)(除頂層端口)總是來自其他模塊的輸出,一般模塊的數(shù)據(jù)輸出是和時(shí)鐘同步的,因此測(cè)試中的輸入數(shù)據(jù)也應(yīng)該和時(shí)鐘同步產(chǎn)生,這樣的測(cè)試平臺(tái)更符合電路實(shí)際工作情況。同時(shí),時(shí)鐘頻率發(fā)生改變,輸入信號(hào)時(shí)序也隨之改變。采用事件控制語句可實(shí)現(xiàn)數(shù)據(jù)和時(shí)鐘的同步。5.6.5數(shù)據(jù)緩存的應(yīng)用前面介紹了用循環(huán)結(jié)構(gòu)產(chǎn)生具有周期性的測(cè)試向量(如時(shí)鐘);用initial過程塊和延時(shí)控制產(chǎn)生不規(guī)則的數(shù)據(jù)序列。如果不規(guī)則的數(shù)據(jù)序列特別長,就要寫許多條延時(shí)賦值語句,從而會(huì)使測(cè)試代碼編寫量大大增加。這里介紹一種利用數(shù)據(jù)緩存器保存序列數(shù)據(jù),之后在時(shí)鐘控制下將其逐個(gè)送給被測(cè)模塊的技術(shù)。5.6.6總線信號(hào)測(cè)試向量的產(chǎn)生總線是運(yùn)算部件之間數(shù)據(jù)流通的公共通道。在RTL級(jí)描述中,總線指的是由邏輯單元、寄存器、存儲(chǔ)器、電路輸入或其他總線驅(qū)動(dòng)的一個(gè)共享向量。總線功能模型則是一種將物理的接口時(shí)序操作轉(zhuǎn)化成更高抽象層次接口的總線模型,如圖5.6-4所示。在總線中,對(duì)于每個(gè)請(qǐng)求端,有一個(gè)輸入來選擇驅(qū)動(dòng)該總線所對(duì)應(yīng)的請(qǐng)求端。選擇多個(gè)請(qǐng)求端時(shí)會(huì)產(chǎn)生總線沖突;根據(jù)不同的總線類型,會(huì)產(chǎn)生不同的沖突結(jié)果。當(dāng)有多個(gè)請(qǐng)求端發(fā)出請(qǐng)求時(shí),相應(yīng)的操作由總線的類型決定。在VerilogHDL測(cè)試中,總線測(cè)試信號(hào)通常是通過將片選信號(hào)、讀(或者寫)使能信號(hào)、地址信號(hào)以及數(shù)據(jù)信號(hào)以task任務(wù)的形式來描述,并通過調(diào)用task形式的總線信號(hào)測(cè)試向量來完成相應(yīng)的總線功能。
圖5.6-5是AHB總線寫操作的時(shí)序圖。其中,在完成數(shù)據(jù)的寫操作后將片選和寫使能信號(hào)置為無效(低電平有效)。5.7基本門級(jí)元件和模塊的延時(shí)建模為了有效驗(yàn)證數(shù)字集成電路的功能,VerilogHDL規(guī)定了模塊和基本元件的延時(shí)模型。這樣,設(shè)計(jì)者可以對(duì)所調(diào)用的門級(jí)或所設(shè)計(jì)的模塊進(jìn)行時(shí)序設(shè)計(jì),完成對(duì)目標(biāo)電路功能的驗(yàn)證。5.7.1門級(jí)延時(shí)建模在實(shí)際的電路中,任何一個(gè)邏輯門都具有延時(shí)功能,信號(hào)從邏輯門的輸入到輸出的傳輸延時(shí)可以通過門延時(shí)來定義。用戶可以通過門延時(shí)來說明邏輯電路中的延時(shí),同時(shí)也可以指定輸入端到輸出端的延時(shí)。門級(jí)延時(shí)可以分為如下四類:(1)上升延時(shí):表示信號(hào)由0、x或z狀態(tài)變化到1狀態(tài)時(shí)受到的門傳輸延時(shí)。(2)下降延時(shí):表示信號(hào)由1、x或z狀態(tài)變化到0狀態(tài)時(shí)受到的門傳輸延時(shí)。(3)到不定態(tài)的延時(shí):表示信號(hào)由0、1或z狀態(tài)變化到x狀態(tài)時(shí)受到的門傳輸延時(shí)。(4)截止延時(shí):表示信號(hào)由0、1或x狀態(tài)變化到z狀態(tài)時(shí)受到的門傳輸延時(shí)。由于多輸入門(and、nand、or、nor、xor和xnor)及多輸出門(buf和not)的輸出不可能是高阻態(tài)z,所以這兩類元件沒有“到不定態(tài)的延時(shí)”這類門級(jí)延時(shí),只有“上升延時(shí)”“下降延時(shí)”和“截止延時(shí)”這三種。對(duì)于三態(tài)門(bufif1、bufif0、notif1和notif0),由于其輸出可以取四種可能的邏輯狀態(tài)(0、1、x和z),所以具有全部門級(jí)延時(shí)種類。而對(duì)于上拉電阻(pullup)和下拉電阻(pulldown),由于它們沒有輸入端口,所以不存在輸入到輸出的延時(shí),因此就不存在任何形式的門級(jí)延時(shí)。實(shí)例引用帶延時(shí)參數(shù)門的語法格式如下:其中,delay規(guī)定了門的延時(shí),即從門的輸入端到輸出端的傳輸延時(shí)。若沒有指定門延時(shí)值,則默認(rèn)的延時(shí)值為0。同時(shí)delay是由一個(gè)或多個(gè)延時(shí)值組成的,可以有基本延時(shí)表達(dá)和“最?。旱湫停鹤畲蟆毖訒r(shí)表達(dá)兩種形式。1.門級(jí)延時(shí)的基本延時(shí)表達(dá)形式在門級(jí)延時(shí)的基本延時(shí)表達(dá)形式下,delay內(nèi)可以包含0~3個(gè)延時(shí)值,表5.7-1給出了指定的不同延時(shí)值個(gè)數(shù)時(shí)delay的四種表示形式。說明:(1)當(dāng)delay沒有指定門延時(shí)值時(shí),默認(rèn)的延時(shí)值為0。這意味著元件實(shí)例的“上升延時(shí)值”“下降延時(shí)值”“截止延時(shí)值”和“到不定態(tài)的延時(shí)值”均為0。(2)當(dāng)delay內(nèi)只包含1個(gè)延時(shí)值時(shí),給定的延時(shí)值d將同時(shí)代表著元件實(shí)例的“上升延時(shí)值”“下降延時(shí)值”“截止延時(shí)值”和“到不定態(tài)的延時(shí)值”。(3)當(dāng)delay內(nèi)包含了2個(gè)延時(shí)值時(shí),元件實(shí)例的“上升延時(shí)值”由給定的d1指定,“下降延時(shí)值”由給定的d2指定,而“截止延時(shí)值”和“到不定態(tài)的延時(shí)值”將由d1和d2中的最小值指定。(4)當(dāng)delay內(nèi)包含了3個(gè)延時(shí)值時(shí),元件實(shí)例的“上升延時(shí)值”由給定的dA指定,“下降延時(shí)值”由給定的dB指定,“截止延時(shí)值”由給定的dC指定,而它的“到不定態(tài)的延時(shí)值”將由dA、dB和dC中的最小值指定。2.門級(jí)延時(shí)的“最?。旱湫停鹤畲蟆毖訒r(shí)表達(dá)形式除了基本延時(shí)表達(dá)形式外,門級(jí)延時(shí)量還可以采用“最小:典型:最大”延時(shí)表達(dá)形式;采用這種表達(dá)形式時(shí),門級(jí)延時(shí)量中的每一項(xiàng)將由“最小延時(shí)值”“典型延時(shí)值”和“最大延時(shí)值”3個(gè)值來表示,其語法格式如下:采用“最?。旱湫停鹤畲蟆毖訒r(shí)表達(dá)形式時(shí),delay內(nèi)可以包含1~3個(gè)延時(shí)值。5.7.2模塊延時(shí)建模對(duì)于由用戶自己定義設(shè)計(jì)的模塊,可以采用“加入門級(jí)延時(shí)說明”的辦法,通過“延時(shí)說明塊(SpecifyBlock)”的結(jié)構(gòu)來對(duì)模塊的傳輸延時(shí)進(jìn)行說明。注意,延時(shí)說明塊既可以出現(xiàn)在行為描述模塊內(nèi),也可以出現(xiàn)在結(jié)構(gòu)描述模塊內(nèi)。1.延時(shí)說明塊
在模塊輸入和輸出引腳之間的延時(shí)稱為模塊路徑延時(shí)。在VerilogHDL中,在關(guān)鍵字specify和endspecify之間給路徑延時(shí)賦值,關(guān)鍵字之間的語句組成specify塊(即指定塊)。specify與endspecify分別是延時(shí)說明塊的起始標(biāo)識(shí)符和終止標(biāo)識(shí)符。specify塊中包含下列操作語句:(1)定義穿過模塊的所有路徑延時(shí);(2)在電路中設(shè)置時(shí)序檢查;(2)定義specparam常量。2.路徑延時(shí)描述方式1)并行連接每條路徑延時(shí)語句都有一個(gè)源域或一個(gè)目標(biāo)域。在例5.7-2的路徑延時(shí)語句中,a、b、c和d在源域位置,而out是目標(biāo)域。在specify塊中,用符號(hào)“=>”說明并行連接,其語法格式如下:其中,<delay_value>可以包含1~3個(gè)延時(shí)量,也可以采用“最?。旱湫停鹤畲蟆毖訒r(shí)表達(dá)形式。在延時(shí)量由多個(gè)值組成的情況下,應(yīng)在延時(shí)量的外面加上一對(duì)括號(hào)。表示的是輸入a到輸出out的最小、典型、最大延時(shí)值分別是8、9、10個(gè)時(shí)間單位。在并行連接中,源域中的每一位與目標(biāo)域中相應(yīng)的位連接。如果源域和目標(biāo)域是向量,則必須有相同的位數(shù),否則會(huì)出現(xiàn)不匹配的情況。因此,并行連接說明了源域的每一位到目標(biāo)域的每一位之間的延時(shí)。圖5.7-4顯示了源域和目標(biāo)域之間的位是如何并行連接的。2)全連接在specify塊中,用符號(hào)“*>”表示全連接,其語法格式如下:在全連接中,源域中的每一位與目標(biāo)域中的每一位相連接。如果源域和目標(biāo)域是向量,則它們的位數(shù)不必相同。全連接描述源域中的每一位和目標(biāo)域中的每一位之間的延時(shí),如圖5.7-5所示。3.specparam聲明語句specparam用來定義specify塊中的參數(shù),specparam語句的格式和作用都類似于parameter參數(shù)說明語句,但兩者又有不同:(1)specparam語句只能在延時(shí)說明塊(specify塊)中出現(xiàn),而parameter語句則不能在延時(shí)說明塊內(nèi)出現(xiàn)。(2)由specparam語句進(jìn)行定義的參數(shù)只能是延時(shí)參數(shù),而由parameter語句定義的參數(shù)可以是任何數(shù)據(jù)類型的常數(shù)參數(shù)。(3)由specparam語句定義的延時(shí)參數(shù)只能在延時(shí)說明塊內(nèi)使用,而parameter語句定義的參數(shù)則可以在模塊內(nèi)的任意位置使用。在模塊中提供specify參數(shù)是為了方便給延時(shí)賦值,因此建議用specify參數(shù)而不是數(shù)值來表示延時(shí)。這樣,如果電路的時(shí)序說明變化了,則用戶只需要改變specify的參數(shù)值,而不必逐個(gè)修改每條路徑的延時(shí)值。5.7.3與時(shí)序檢查相關(guān)的系統(tǒng)任務(wù)VerilogHDL提供了系統(tǒng)任務(wù)來進(jìn)行時(shí)序檢查。該類任務(wù)很多,表5.7-5列舉了部分與時(shí)序檢查相關(guān)的系統(tǒng)任務(wù)。下面介紹兩種最常用的時(shí)序檢查系統(tǒng)任務(wù)?$setup和?$hold。所有的時(shí)序檢查只能用在specify塊里。為了簡(jiǎn)化討論,此處省略了這些時(shí)序檢查系統(tǒng)任務(wù)的一些可選參數(shù)。1)?$setup建立時(shí)間檢查可以使用系統(tǒng)任務(wù)?$setup。其語法格式如下:$setup(data_event,reference_event,limit);其中,data_event是被檢查的信號(hào),需檢查它是否違反約束;reference_event用于檢查data_event信號(hào)的參考信號(hào);limit是data_event需要的最小建立時(shí)間。如果(time_of_reference_event-time_of_data_event)<limit,則報(bào)告時(shí)序沖突。2)?$hold保持時(shí)間檢查可以使用系統(tǒng)任務(wù)$hold。其語法格式如下:$hold(reference_event,data_event,limit);其中:reference_event用于檢查data_event信號(hào)的參考信號(hào);data_event是被檢查的信號(hào),需檢查它是否違反約束;limit是data_event需要的最小保持時(shí)間。如果(time_of_data_event-time_of_reference_event)<limit,則報(bào)告數(shù)據(jù)保持時(shí)間時(shí)序沖突。5.8編譯預(yù)處理語句編譯預(yù)處理是VerilogHDL編譯系統(tǒng)的一個(gè)組成部分,指編譯系統(tǒng)會(huì)對(duì)一些特殊命令進(jìn)行預(yù)處理,然后將預(yù)處理結(jié)果和源程序一起再進(jìn)行通常的編譯處理。以“`”(反引號(hào))開始的某些標(biāo)識(shí)符是編譯預(yù)處理語句。在VerilogHDL編譯時(shí),特定的編譯指令在整個(gè)編譯過程中有效(編譯過程可跨越多個(gè)文件),直到遇到其他不同的編譯程序指令。常用的編譯預(yù)處理命令如下:5.8.1宏定義`define指令是一個(gè)宏定義命令,通過一個(gè)指定的標(biāo)識(shí)符來代表一個(gè)字符串,可以增加VerilogHDL代碼的可讀性和可維護(hù)性,找出參數(shù)或函數(shù)不正確或不被允許的地方。`define指令類似于C語言中的#define指令,可以在模塊的內(nèi)部或外部定義,編譯器在編譯過程中遇到該語句將把宏文本替換為宏的名字。`define聲明的語法格式如下:`define<macro_name><Text>對(duì)于已聲明的語句,在代碼中的應(yīng)用格式如下(不要漏掉宏名稱前的符號(hào)“`”):`macro_name宏定義指令的有關(guān)注意事項(xiàng):(1)宏定義的名稱可以是大寫,也可以是小寫,但要注意不要和變量名重復(fù)。(2)和所有編譯器偽指令一樣,宏定義在超過單個(gè)文件邊界時(shí)仍有效(對(duì)工程中的其他源文件),除非被后面的`define、`undef或`resetall偽指令覆蓋,否則`define不受范圍限制。(3)當(dāng)用變量定義宏時(shí),變量可以在宏正文中使用,并且在使用宏的時(shí)候可以用實(shí)際的變量表達(dá)式代替。(4)通過用反斜杠“\”轉(zhuǎn)義中間換行符,宏定義可以跨越幾行,新的行是宏正文的一部分。(5)宏定義行末不需要添加分號(hào)來表示結(jié)束。(6)宏正文不能分離的語言記號(hào)包括注釋、數(shù)字、字符串、保留的關(guān)鍵字和運(yùn)算符。(7)編譯器偽指令不允許作為宏的名字。(8)宏定義中的文本也可以是一個(gè)表達(dá)式,并不僅僅用于變量名稱的替換。`define和parameter是有區(qū)別的。`define和parameter都可以用于文本替換,但其存在本質(zhì)上的不同,前者是編譯之前就預(yù)處理,而后者是在正常編譯過程中完成替換的。此外,`
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023-2024學(xué)年浙江省臺(tái)州市高一(下)期末地理試卷
- 2025年全國計(jì)算機(jī)二級(jí)等級(jí)考試模擬試卷及答案(共十二套)
- 內(nèi)訓(xùn)培訓(xùn)課件
- 2024年溫宿縣人民醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點(diǎn)附帶答案
- 2024年淮安市楚州醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點(diǎn)附帶答案
- 2024年07月浙江臺(tái)州銀行北片區(qū)域社會(huì)招考(730)筆試歷年參考題庫附帶答案詳解
- 2024年07月河北招商銀行唐山分行實(shí)習(xí)生招考(719)筆試歷年參考題庫附帶答案詳解
- 2024年海寧市婦幼保健院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點(diǎn)附帶答案
- 大學(xué)輔導(dǎo)員培訓(xùn)
- 2024年河南大學(xué)淮河醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點(diǎn)附帶答案
- IE部成立工作規(guī)劃
- 單體調(diào)試及試運(yùn)方案
- 2023-2024學(xué)年浙江省杭州市城區(qū)數(shù)學(xué)四年級(jí)第一學(xué)期期末學(xué)業(yè)水平測(cè)試試題含答案
- 網(wǎng)球技術(shù)與戰(zhàn)術(shù)-華東師范大學(xué)中國大學(xué)mooc課后章節(jié)答案期末考試題庫2023年
- 2023年35kV集電線路直埋施工方案
- 思政教師培訓(xùn)心得體會(huì)2021
- HLB值的實(shí)驗(yàn)測(cè)定方法
- 2023年《病歷書寫基本規(guī)范》年度版
- 防止電力生產(chǎn)事故的-二十五項(xiàng)重點(diǎn)要求2023版
- 代理記賬機(jī)構(gòu)代理記賬業(yè)務(wù)規(guī)范
- 建辦號(hào)建筑工程安全防護(hù)、文明施工措施費(fèi)用及使用管理規(guī)定
評(píng)論
0/150
提交評(píng)論