0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

UVM設計模式之訪問者模式

rfdqdzdg ? 來源:IC Verification Club ? 2023-08-11 09:28 ? 次閱讀

訪問者模式

Visitor Pattern:允許一個或者多個操作應用到一組對象上,解耦操作和對象本身。換言之,如果component的數(shù)據(jù)結構是比較穩(wěn)定的,但其是易于變化的,那么使用訪問者模式是個不錯的選擇。

常見的訪問者模式有五種角色:

(1) Vistor(抽象訪問者):為該對象結構中具體元素角色聲明一個訪問操作接口。

(2) ConcreteVisitor(具體訪問者):每個具體訪問者都實現(xiàn)了Vistor中定義的操作。

(3) Element(抽象元素):定義了一個accept操作,以Visitor作為參數(shù)

(4) ConcreteElement(具體元素):實現(xiàn)了Element中的accept()方法,調用Vistor的訪問方法以便完成對一個元素的操作。

(5) ObjectStructure(對象結構):可以是組合模式,也可以是集合;能夠枚舉它包含的元素;提供一個接口,允許Vistor訪問它的元素。

舉例:老師教學反饋得分大于等于85分或者學生成績大于等于90分,則可以獲得優(yōu)秀獎;如果老師論文數(shù)目大于等于2、學生論文數(shù)目大于等于1,則可以獲得1萬元的現(xiàn)金。在這個例子中,老師和學生就是Element,他們的數(shù)據(jù)結構穩(wěn)定不變。從上面的描述中,我們發(fā)現(xiàn),對數(shù)據(jù)結構的操作是多變的,一會兒評選成績,一會兒評選科研,這樣就適合使用訪問者模式來分離數(shù)據(jù)結構和操作。

兩種操作,class GradeSelection class ResearchSelection 重寫實現(xiàn) visit()函數(shù)

wKgZomTVjwWAXK5iAAP4jI4N2fo731.jpg

class Teacher class Studnet中調用 visitor.visit(),不需要特別指明哪一種操作。

wKgaomTVjwWABPsSAATFa5DiKuA798.jpg

wKgZomTVjwWAPhBgAAPaxF8B9gc262.jpg

訪問者模式適用于對一組結構固定的組件統(tǒng)一地加入一個新的操作,如上例,將student1,student2,teacher1,teacher2這四個共同屬性(都繼承于Element)的組件,加入ObjectStructure中,此例中的組件關系是前后線性的關系,依次加入element_q隊列中。當需要對所有組件執(zhí)行researchselection操作時,ObjectStructure調用accept(researchselection)即可,會自動遍歷各個組件執(zhí)行這個researchselection的操作。如果需要切換其他操作,只需更改ObjectStructure中accept的參數(shù)即可。添加新的操作也很方便,不需要更改組件,只需要在外部重寫visitor()函數(shù),具有很好的擴展性,實現(xiàn)組件與操作的解耦。

UVM_PHASE

UVM的環(huán)境具有明確的結構,各個組件統(tǒng)一繼承于uvm_component, 組成 ** tree structure** 。每個子類component重寫各個phase函數(shù),每個component中的phase函數(shù)相當于visitor(),很符合使用訪問者模式的條件。但是uvm的phase機制實現(xiàn)和上述介紹的示例還有很大區(qū)別,component中的phase是在自身內部實現(xiàn)的,而不是放在類外部;對于執(zhí)行同一個phase,樹形結構中的component不是簡單的依次執(zhí)行,有top-down,down-top和并行執(zhí)行;對于同一個componet中的phase, 有不消耗時間的function phase, 也有消耗時間的task phase, 有依次執(zhí)行的,也有并列執(zhí)行的(run_phase和12個run-time phase)。所以存在兩個維度,一個uvm_component的維度,根據(jù)單例模式中的parent-child關系構建了樹狀結構;一個phase維度,將每個phase以node的形式放入domain中,統(tǒng)一調度。UVM還支持objection機制,drain_time,timeout,多domain,進程同步,phase的jump,phase_debug等操作,所以簡單的訪問者模式無法滿足要求。

下面根據(jù)源碼對uvm_phase從這兩個維度分析:

1. phase的執(zhí)行順序

在第二篇,提到了uvm_root中函數(shù)run_test()根據(jù)工廠模式創(chuàng)建testcase的實例。接下來run_test()調用uvm_phase中的靜態(tài)函數(shù)m_run_phase()開始執(zhí)行各個phase。這里用到了SV內建的class process,提供了精細控制進程的方法。

uvm_domain調用靜態(tài)函數(shù)get_common_domain(), 從名字上可以看到這是獲得一個domain。uvm_domain繼承于uvm_phase,是phase的一個容器。

comon_domain調用add函數(shù)依次加入不消耗時間的function phase, 一共9個。第一個uvm_build_phase::get()獲得build_phase的實例,uvm_build_phase和uvm_root一樣采用了單例模式,所以全局只有一個build_phase,通過 uvm_build_phaes::get()獲得。所以我們平常在不同component中的wKgZomTVjwWAGfyNAAADG_EH5-w724.jpg傳入的phase,其實指向的都是那個唯一的uvm_build_phaes::get() 實例。其他phase也一樣,實例全局唯一。

add()函數(shù)實現(xiàn)了將不同phase以node的形式加入,node有predecessor,successor的概念,構成鏈表結構。類似component中parent,child的關系,構成樹狀結構。根據(jù)add加入的順序,組織了先后順序。所以connect_phase_node的predecessor是build_phase_node, successor是end_of_elaboration_phase.

get_uvm_domain()獲得另一個domain:uvm_domain。uvm_domain中加入的是task phase, 一共12個。然后common_domain再將uvm_domain和run_phase同時加入,實現(xiàn)rum_phase和12個小phase組成的run-time phase并行執(zhí)行。

到此,各個phase的執(zhí)行順序就固定了。如果沒有單獨創(chuàng)建domain,那么只有common_domain和uvm_domain這兩個domain會被默認創(chuàng)建。結構如下:

wKgaomTVjwWAAe5uAAAujlqzaBQ086.jpg

回到m_run_phases(), 有一個forever begin ... end一直循環(huán)從m_phae_hopper.get()獲得phase執(zhí)行exectute_phase()。最開始m_phase_hopper( 一個放入uvm_phase類型的mailbox)放入的是common domain,common domain執(zhí)行完畢后,會將successor build phase 放入m_phase_hopper中;在forever循環(huán)中m_phae_hopper.get()獲得build phase,執(zhí)行完build phase最后會放入build phase的successor connect phase,直到遍歷完所有phase。

wKgaomTVjwWAcRRiAAbbZswg0Wg714.jpg

2. component的執(zhí)行順序

接上面,phase.execute_phase()的具體實現(xiàn)會根據(jù)不同的uvm_phase_type和uvm_phase_state走不同的分支。
uvm_build_phase, uvm_final_phase繼承于uvm_topdown_phase, 其余function phase繼承于uvm_downtop_phase, task phase繼承于uvm_task_phase。

對于build_phase, 函數(shù)exectue_phase會調用m_imp.traverse(top,this,UVM_PHASE_EXECUTING), traverse()函數(shù)在uvm_topdown_phase中定義,build_phase從top to down的執(zhí)行順序也是在這里實現(xiàn)的。

最開始traverse傳入的是top,也就是最頂層uvm_root,②處調用get_first_child獲得uvm_test_top(在之前的run_test中已被創(chuàng)建),遞歸調用traverse函數(shù),執(zhí)行ph.execute(uvm_test_top, phase), 實際調用的是comp.build_phase, 也就是uvm_test_top的 builde_phase()。builde_phase會創(chuàng)建uvm_test_top的child env。執(zhí)行完ph.exectute,再次執(zhí)行traverse函數(shù),此時傳入的component是env, 執(zhí)行env的build_phase,創(chuàng)建env的child agt。一直遞歸循環(huán),實現(xiàn)所有component的創(chuàng)建。

對于繼承uvm_downtop_phase的phase,則是從底部開始循環(huán)。相比uvm_topdowun_phase,將遞歸函數(shù)traverse放在ph.execute前面,便實現(xiàn)了down to top的順序。

對于繼承uvm_task_phase的函數(shù),雖然遞歸函數(shù)traverse放在ph.execut前面,也是down to top的順序,但是fork ... join_none讓不同component的同一種phase函數(shù)在不同process上同時執(zhí)行,實際效果是一塊同時運行的。

所以對于component中phase的執(zhí)行遍歷,是根據(jù)調用遞歸函數(shù)遍歷child完成的。在uvm_root中的find()函數(shù),也是遞歸調用函數(shù)完成遍歷。

wKgZomTVjwWAS7mgAAS-62PXmPY160.jpg

uvm objection

uvm objection涉及對進程的控制,先介紹一下systemverilog提供的class process。(計算機體系中的進程,線程和內核的調度有關,而仿真平臺是跑在仿真軟件上的,由 simulation kernel進行調度 (IEEE 4.Scheduling semantics clause) 按照時間片執(zhí)行,以下進程,線程不做區(qū)分,統(tǒng)一叫做進程)

SV中的fork相關函數(shù)可以創(chuàng)建新的進程,但是對于進程的管理, 只有 wait fork, disable identifier, disable fork這些。其他語言中一般都有專門管理進程的操作方法,比如python中的multiprocessing模塊。所以SV中加入了一個class process,提供了更精細的進程管理。class process并不可以用于創(chuàng)建進程,只可以在initial begin ..end,always,fork等創(chuàng)建進程的語句中通過process::self()獲取該進程;status()獲得進程狀態(tài),kill()終止進程及子進程,suspend()掛起進程,resume()恢復進程,srandom(int seed)設置進程的隨機種子。

wKgaomTVj4CALdYIAAEIbLqVg_E132.png

uvm objection機制的源代碼實現(xiàn)不再探究,總結需要注意的幾點:

每個phase的實例是唯一的,每個phase在創(chuàng)建的時候,自動創(chuàng)建了屬于這個phase的objection。

對于消耗時間的task phase,其中必須raise_objection, 才會執(zhí)行,否者直接退出。

對于同一個phase,可以多次raise_objection, 但是raise_objection和drop_objection必須成對存在。只有raise數(shù)量等于dorp數(shù)量時才會退出這個phase。

raise_objection前面不可以有消耗時間的語句,也就是剛進入phase的0時刻,就需要檢測到raise_objection, 否則直接退出這個phase。

對于run_phase和并行的12個task phase, 如果在run_phase中raise_objection,但是main_phase沒有raise_obejection,那么main_phase直接退出。如果在main_phase有raise_obejection,run_phase沒有raise_objection,run_phase也會執(zhí)行。所以盡量run_phase和12個小phase不要同時使用,以免出錯。

通過簡單的代碼使用process來實現(xiàn)一下UVM中的objection:

wKgZomTVjwWAENP5AARqjCWBZ8g517.jpg

do_monitor是一個無線循環(huán),在driver_main_phase中控制objection的raise和drop。

如果line42加上時間延遲,則會直接退出main_phase,進入下一個phase. 如果注釋掉line43行也是直接退出main_phase,進入下一個phase. 打印結果:wKgaomTVjwWATLxdAAATba_m2Ds400.jpg

如果加上line49, line51,main_phase則無法退出。打印結果:

wKgZomTVjwWAUiZZAAA-ljRw7AA642.jpg

uvm_visitor

UVM1.2中新加入了訪問者模式的基礎類,供使用者擴展使用:

wKgaomTVjwWAKXaQAADU-MZJQ_U947.jpg

uvm_visitor:提供了visit()方法,以及begin_v(),end_v()兩個hook。

重寫visit方法,簡單的打印component的full_name.

wKgaomTVjwaAV5q7AAL93lM6eUY809.jpg

uvm_visitor_adapter:提供了accept函數(shù),用于實現(xiàn)visitor和component的連接,并對每個component調用visti方法。

wKgZomTVjwaAVjYWAAJoT_UIhnk179.jpg

env中創(chuàng)建visitor, adapter的實例,accept傳入的是env這個comonent,打印處uvm_test_top.env

wKgaomTVjwaAUyJpAAKGV5G3qHs181.jpg

對于component的組織調用順序,用戶可以自定義structure。UVM提供了三種sturcture, 對應的adapter,如下:

wKgZomTVjwWAKRriAAEwQB7-9ww049.jpg

使用的top to down的structure, 從上到下遍歷component調用visit()函數(shù):

wKgZomTVjwaAFHhqAAYGE2BylyQ650.jpg

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • UVM
    UVM
    +關注

    關注

    0

    文章

    181

    瀏覽量

    19087
  • 數(shù)據(jù)結構

    關注

    3

    文章

    568

    瀏覽量

    40030
  • 設計模式
    +關注

    關注

    0

    文章

    53

    瀏覽量

    8616

原文標題:UVM設計模式 (六)訪問者模式、uvm_phase、uvm objection、process control

文章出處:【微信號:數(shù)字芯片設計工程師,微信公眾號:數(shù)字芯片設計工程師】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    數(shù)字IC驗證“什么是UVM”“UVM的特點”“UVM提供哪些資源”(2)連載中...

    會在一定范圍內產(chǎn)生,減少無用的激勵,提高效率。支持覆蓋率驅動模式,根據(jù)當前覆蓋率的情況,驗證工程師可以決定下一步的驗證內容,當覆蓋率達到了一定的要求時,就可以宣告驗證工作的完成。uvm驗證平臺,它具有很高的可重用性
    發(fā)表于 01-21 16:00

    Java設計模式分析觀察

    觀察模式的流程跟報紙訂閱方式一致,即:觀察模式=出版+訂閱,只是名稱不一樣,出版
    發(fā)表于 09-26 17:36 ?0次下載

    Java設計模式(二十一):中介模式

    中介模式(Mediator Pattern) 中介模式(Mediator Pattern): 屬于對象的行為模式。又叫調停
    發(fā)表于 01-24 11:28 ?279次閱讀

    UVMsequence/item見解 sequencer特性及應用(下)

    _SEQ_ARB_WEIGHTED;UVM_SEQ_ARB_RANDOM ;UVM_SEQ_ARB_STRICT_FIFO等。出其中三種需要特別區(qū)分外其它的模式可以滿足絕大多數(shù)的仲裁需求。
    的頭像 發(fā)表于 02-19 10:14 ?4710次閱讀
    談<b class='flag-5'>UVM</b><b class='flag-5'>之</b>sequence/item見解 sequencer特性及應用(下)

    嵌入式軟件設計設計模式

    文章目錄前言1.設計模式適配器模式2.設計模式單例模式3.設計
    發(fā)表于 10-21 11:07 ?9次下載
    嵌入式軟件設計<b class='flag-5'>之</b>設計<b class='flag-5'>模式</b>

    配置Nginx訪問日志

    每當處理客戶請求時,Nginx都會在訪問日志中生成一個新記錄。每個事件記錄都包含一個時間戳,并包含有關客戶端和所請求資源的各種信息。訪問日志可以顯示訪問者的位置,訪問者
    的頭像 發(fā)表于 05-24 09:59 ?2181次閱讀

    嵌入式軟件設計模式 好文值得收藏

    本文引用自本人公眾號文章: 嵌入式開發(fā)中的兩點編程思想 ? C語言也很講究設計模式?一文講透 ? 包含如下: 01)C語言和設計模式(繼承、封裝、多態(tài)) ? 02)C語言和設計模式訪問者
    的頭像 發(fā)表于 06-20 09:09 ?1881次閱讀

    GoF設計模式訪問者模式

    訪問者模式的目的是,解耦數(shù)據(jù)結構和算法,使得系統(tǒng)能夠在不改變現(xiàn)有代碼結構的基礎上,為對象新增一種新的操作。
    的頭像 發(fā)表于 10-08 11:05 ?603次閱讀

    設計模式訪問者設計模式

    訪問者設計模式是一種行為型設計模式,用于將算法與對象結構分離。它允許你在不改變對象結構的前提下定義新的操作。
    的頭像 發(fā)表于 06-06 11:25 ?704次閱讀

    設計模式行為型:訪問者模式

    訪問者模式(Visitor Pattern)中,我們使用了一個訪問者類,它改變了元素類的執(zhí)行算法。
    的頭像 發(fā)表于 06-07 15:11 ?657次閱讀
    設計<b class='flag-5'>模式</b>行為型:<b class='flag-5'>訪問者</b><b class='flag-5'>模式</b>

    設計模式行為型:觀察模式

    定義對象之間的一種一對多依賴關系,使得每一個對象發(fā)生狀態(tài)的變化時,其相關依賴對象皆得到通知并被自動更新,又稱為發(fā)布-訂閱模式、模型-視圖模式、源-監(jiān)聽器模式或從屬
    的頭像 發(fā)表于 06-07 16:56 ?586次閱讀
    設計<b class='flag-5'>模式</b>行為型:觀察<b class='flag-5'>者</b><b class='flag-5'>模式</b>

    設計模式創(chuàng)造性:建造模式

    建造模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個復雜的對象。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。
    的頭像 發(fā)表于 06-09 16:25 ?660次閱讀
    設計<b class='flag-5'>模式</b>創(chuàng)造性:建造<b class='flag-5'>者</b><b class='flag-5'>模式</b>

    一文詳解UVM設計模式

    本篇是對UVM設計模式 ( 二 ) 參數(shù)化類、靜態(tài)變量/方法/類、單例模式UVM_ROOT、工廠模式
    的頭像 發(fā)表于 08-06 10:38 ?1356次閱讀
    一文詳解<b class='flag-5'>UVM</b>設計<b class='flag-5'>模式</b>

    行為型設計模式UVM中的應用

    接下來介紹行為型設計模式UVM中的應用。
    的頭像 發(fā)表于 08-09 14:01 ?563次閱讀
    行為型設計<b class='flag-5'>模式</b>在<b class='flag-5'>UVM</b>中的應用

    迭代模式UVM中的應用有哪些

    行為型設計模式數(shù)量較多,上一篇介紹了模板模式和策略模式,下面對迭代模式進行介紹,挖掘其在UVM中的應用。
    的頭像 發(fā)表于 08-14 17:15 ?516次閱讀
    迭代<b class='flag-5'>模式</b>在<b class='flag-5'>UVM</b>中的應用有哪些