Objection是UVM框架中用來同步不同組件的相同phase,以及決定當(dāng)前測試用例什么時(shí)候結(jié)束(end-of-test)的機(jī)制,這也是用戶在拿到UVM之后最直白的使用場景。本篇文章除了介紹Objection的工作原理和常規(guī)使用方式,還會(huì)介紹Objection的一些非常規(guī)用法。
01 Objection工作原理
為什么把同步phase或者說管理仿真結(jié)束的機(jī)制叫做Objection?這是個(gè)沒有多少實(shí)際意義的問題,不過理清楚之后,也許你再也不會(huì)忘了Objection機(jī)制的用途。
按照UVM reference的介紹:“Objections provide a facility for coordinating status information between two or more participating components, objects, and even module-based IP. ” 這個(gè)描述還是比較抽象,說Objection用于協(xié)調(diào)多個(gè)對(duì)象之間的狀態(tài)信息,不過可以簡單理解成就是“同步”。
本系列前面的文章【深入Phase機(jī)制,看懂Phase機(jī)制實(shí)現(xiàn)原理】介紹到,基于UVM的仿真程序執(zhí)行嚴(yán)格按照Phase來執(zhí)行,而每一級(jí)phase都按照UVM定義的狀態(tài)機(jī)做跳轉(zhuǎn),其中有一個(gè)狀態(tài)比較特殊,叫UVM_PHASE_READ_TO_END。
這個(gè)狀態(tài)的特點(diǎn)是:只有當(dāng)同級(jí)phase的所有objection都被撤銷(drop)之后(通過計(jì)數(shù)器實(shí)現(xiàn)),才會(huì)進(jìn)入該狀態(tài);進(jìn)入該狀態(tài)之后,會(huì)遍歷執(zhí)行驗(yàn)證組件中定義的phase_ready_to_end回調(diào)函數(shù),待執(zhí)行完成之后且沒有objection被置起(raise),才會(huì)跳轉(zhuǎn)到下一個(gè)狀態(tài)UVM_PHASE_ENDED。
按照這個(gè)邏輯,以耗時(shí)(time-consuming)phase為例,這里忽略pre_*和post_*的phase,可以得到下面這個(gè)執(zhí)行流圖。圖中從左往右表示執(zhí)行的先后順序,可以看到,相同phase都是在同一時(shí)刻開始往后執(zhí)行,也就實(shí)現(xiàn)了“同步”。
最后怎么去理解“Objection”這個(gè)詞?可以這么說,仿真執(zhí)行過程中,仿真程序會(huì)不停地問:“我要進(jìn)入下一個(gè)phase了,還有誰有意見?”,那些還沒有執(zhí)行完的phase線程就會(huì)大喊:“我反對(duì)我反對(duì)!”,于是仿真程序就等在那了,最終只有等到所有人都執(zhí)行完了,才得以退出當(dāng)前phase。Objection也符合“a feeling or expression of disapproval”的釋義了。
02 Objection常規(guī)用法
Objection的常規(guī)用法很簡單,在很多文章中都會(huì)提到,即raise_objection(),drop_objection() 和 set_drain_time()。這三件套是我們應(yīng)用Objection機(jī)制時(shí)最常用到的方法。
Objection計(jì)數(shù)器在每次調(diào)用raise_objection()和drop_objection()會(huì)進(jìn)行增減。在實(shí)際應(yīng)用中,不建議在很多組件的耗時(shí)phase中都去raise-drop objection,兩個(gè)原因:一個(gè)是objection的控制會(huì)比較分散,不便于objection的管理;另一個(gè)是反復(fù)的調(diào)用會(huì)使得仿真效率比較低。可以考慮在測試用例頂層和sequence中進(jìn)行objection的控制。示例代碼如下:
以上是UVM 1.1對(duì)objection的用法。到了UVM 1.2,棄用了uvm_sequence_base:: starting_phase這個(gè)變量,改用set_starting_phase和get_starting_phase兩個(gè)方法;棄用了raise_objection和drop_objection兩個(gè)方法,改用uvm_sequence_base:: set_automatic_phase_objection。這些改進(jìn)的目的是優(yōu)化objection的使用體驗(yàn),UVM library幫你多省掉了一些代碼和出錯(cuò)的機(jī)會(huì)。示例代碼如下:
set_drain_time()方法的使用場景是在objection都撤銷了之后,往后延長仿真結(jié)束的時(shí)間。這么做的目的是讓DUT有多余的時(shí)間去完成動(dòng)作,使其完整響應(yīng)我們輸入的測試激勵(lì)。
除了set_drain_time()方法可以解決這個(gè)問題,我們還可以在撤銷objection之前去做一些有意義的條件判斷,也可以在test的phase_ready_to_end回調(diào)函數(shù)中去實(shí)現(xiàn)一些檢查邏輯。不過還是set_drain_time()用的多。
03 Objection非常規(guī)用法
非常規(guī)用法指的是平時(shí)不怎么用得到的使用場景,但這些使用方法在有些場景下會(huì)有用,比如調(diào)試。
追蹤Objection狀態(tài)用的命令行參數(shù)+UVM_OBJECTION_TRACE。當(dāng)仿真命令加上該參數(shù),就可以在仿真日志中看到誰誰誰置起了objection,誰誰誰撤銷了objection,以及objection計(jì)數(shù)器的數(shù)值等等。
另外我們可以通過phase.get_objection()拿到負(fù)責(zé)同步當(dāng)前phase的objection句柄,之后就可以調(diào)用該句柄有的一些方法。比如get_drain_time()方法可以返回當(dāng)前objection對(duì)象的排空時(shí)間(drain time);clear()方法可以直接清零當(dāng)前objection對(duì)象的計(jì)數(shù)器,且釋放對(duì)當(dāng)前phase的同步;display_objections()方法可以打印該objection對(duì)象的具體信息等。
審核編輯:劉清
-
比較器
+關(guān)注
關(guān)注
14文章
1658瀏覽量
107356 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2261瀏覽量
94872 -
UVM
+關(guān)注
關(guān)注
0文章
182瀏覽量
19207 -
DUT
+關(guān)注
關(guān)注
0文章
189瀏覽量
12460
原文標(biāo)題:SystemVerilog | UVM | 使用Objection管理仿真結(jié)束
文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論