1. 前言
眾所周知,在傳統(tǒng)的測試平臺中,通常在完成復(fù)位、配置、數(shù)據(jù)傳輸和自動(dòng)檢查等所有步驟后,通過調(diào)用verilog的系統(tǒng)函數(shù)$finish來結(jié)束仿真。
但相對于傳統(tǒng)的測試平臺,UVM在Testbench架構(gòu)的幾乎每個(gè)方面都做了創(chuàng)新,當(dāng)然結(jié)束仿真的控制也發(fā)生了很大變化。在UVM驗(yàn)證環(huán)境中結(jié)束仿真最常用的就是drop_objection機(jī)制,當(dāng)然所有phase都結(jié)束后,還是調(diào)用系統(tǒng)函數(shù)$finish來結(jié)束仿真。
下面,分享一下在UVM驗(yàn)證環(huán)境中,結(jié)束仿真的幾種方式,這些結(jié)束方式,適用于不同的應(yīng)用場景。我的表達(dá)能力不強(qiáng),大家重點(diǎn)看代碼。
2. 本文的內(nèi)容目錄
3. Raising & Droping Objection機(jī)制
3.1 drop_objection的函數(shù)原型
下圖是uvm1.1d源碼中關(guān)于drop_objection函數(shù)的定義,如下圖所示。
3.2 在seq中使用drop_objection
下圖是在sequence中調(diào)用drop_objection的示例,如下圖所示,同樣來自于uvm源碼。
3.3 在scoreboard中使用drop_objection
3.4 在test中使用drop_objection
3.5 使用drop_objection總結(jié)
結(jié)合上面的例子,強(qiáng)調(diào)兩點(diǎn):
一是:drop_objection可以用在任何一個(gè)component中;當(dāng)然也可以用在sequence中,但不可以用在其他uvm_object類里面,因?yàn)閡vm_object里面沒有phase的概念,那sequence其實(shí)也沒有phase的概念,為什么可以?這也是一個(gè)小知識點(diǎn),有的面試官問的仔細(xì)了,也可能問到,我就不展開了。
二是:在實(shí)際項(xiàng)目中的整個(gè)驗(yàn)證環(huán)境中,最好只用一對raise_objection/drop_objection,不要在很多組件中都使用它,否則很容易造成死鎖,而且很難debug,盡管uvm的語法也允許這么做。
4. phase_ready_to_end(微信公眾號《芯片驗(yàn)證日記》)
4.1 phase_ready_to_end的官方解釋
4.2 phase_ready_to_end的理解
phase_ready_to_end(uvm_phase phase)是組件類的回調(diào)方法(函數(shù)),當(dāng)相應(yīng)phase的所有objection均被放下并且該phase將要結(jié)束時(shí),會調(diào)用該方法。組件類可以使用此回調(diào)方法來定義phase即將結(jié)束時(shí)需要執(zhí)行的任何功能。例如,如果某個(gè)組件希望將phase結(jié)束延遲到某個(gè)條件,甚至在所有objections均被放下之后,也可以使用此回調(diào)方法來完成。再比如,如果一個(gè)激勵(lì)或應(yīng)答sequence正在運(yùn)行,在主sequence結(jié)束之前,則可以使用main_phase()中的phase_ready_to_end()回調(diào)方法來停止那些激勵(lì)或應(yīng)答sequence。再比如一個(gè)component想要延遲某個(gè)run-time phase的生命周期,那么可以在所有的objection都被dropped之后使用這個(gè)回調(diào)方法。
對于sequences, tests和許多完整的測試平臺,在phase的正常壽命期間phase objections的提起和撤銷是足夠的。但是,有時(shí)某個(gè)組件不希望在phase的正常生命周期內(nèi)主動(dòng)提起和撤銷objections,但確實(shí)希望延遲從一個(gè)phase到下一類phase的過渡。這在事務(wù)中經(jīng)常出現(xiàn)這種情況,出于性能原因,不能針對每筆事務(wù)提出objection,并且通常情況下是端到端的記分板。為了在所有其他組件同意該phase應(yīng)該結(jié)束之后延遲phase結(jié)束,該組件應(yīng)該在phase_ready_to_end方法中提出objections。然后它負(fù)責(zé)在組件的主體中或在phase_ready_end_method的任務(wù)fork / join none中撤銷這些objections。
4.3 在env中使用的一個(gè)示例
注意,phase_ready_to_end是一個(gè)function,但用fork/join_none將wait_for_ok_to_finish和drop_objection進(jìn)行了處理,這允許function立即返回。
4.4 在scoreboard中使用的一個(gè)示例
4.5 在scoreboard中使用的另一個(gè)示例
5. set_drain_time
5.1 set_drain_time的解釋
下圖是官方對set_drain_time的解釋,以及函數(shù)原型的定義。
5.2 set_drain_time的使用示例
set_drain_time的使用方法,同樣來自最權(quán)威的source code.
5.3 set_drain_time的另一個(gè)示例
寫文章不易,如果覺得對您有幫助,麻煩一鍵三連,或者賞個(gè)雞腿也行!
審核編輯 黃昊宇
-
UVM
+關(guān)注
關(guān)注
0文章
182瀏覽量
19171
發(fā)布評論請先 登錄
相關(guān)推薦
評論