精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

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

ruikundianzi ? 來源:IP與SoC設計 ? 2023-08-09 14:01 ? 次閱讀

接下來介紹行為型設計模式在UVM中的應用。

模板模式

Template method patttern: 在一個方法中定義一個算法骨架,并將某些步驟推遲到子類中實現。子類在不改變算法整體結構的情況下,重新定義算法中的某些步驟。

模板模式的使用很簡單,就是 繼承 + 重寫 的配合使用。在父類中定義一函數XXX(), 里面封裝了函數 pre_XXX()和函數 post_XXX(), 當執行函數XXX()時,會自動執行 pre_XXX(), post_XXX(), 相當于在父類中固定了這種執行流程,pre_XXX() -> XXX() -> post_XXX()。pre_XXX(), post_XXX()擴展了XXX()的功能。子類繼承父類,根據需求重寫。pre_XXX(), post_XXX()相當于hook, 也可以廣義的稱為回調函數,但是和回調函數仍有區別,在下一節具體闡述。

UVM中常見:

squence中的start()前后插入pre_start(),post_start(), body()前后的pre_body(), post_body();

uvm_object中copy()被調用會自動執行do_copy(), compare()中的do_compare(), print()中的do_print(), pack()中的do_pack(), unpack()中的do_unpack()。

phase中的pre_xxx_phase, post_xxx_phase

SV調用randomize()自動調用pre_randomize(), post_randomize()。

這里就不在一一列舉和代碼展示了,

策略模式

Strategy Pattern: 定義一種算法類,將每個算法分別封裝起來,讓它們可以相互替換。算法調用者只需包含抽象算法的類然后調用算法,算法的具體實現被獨立出來,保持主體的結構穩定。

策略模式讓具體算法獨立于算法的調用者,這里的算法指一個具體的行為,具備多態特性,可以實現重寫,算法的調用可以簡單理解為一個函數被調用。策略模式其實就是 組合 + 多態 的配合使用。

在第一篇中,提到了composition這個單詞,也就是組合,合成的意思。相對于繼承(Inheritance),合成使用了“有”(has-a)的關系,繼承使用了“是”(is-a)的關系。對于抽象算法的實現,可以聯系到第一篇中提到的interface class, 一種面向接口編程的特性。

下面將 composition 和 interface class兩種結合起來,使用Systemverilog編寫一個簡單的策略模式的示例:

1. car 兩個子類,sedan轎車和truck卡車,都需要請求加油。

2. 抽象類add_oil_behavior_interface, 兩個子類 add_gasoline add_diesel 是一種 add_oil “算法” 不同的實現,一個加汽油,一個加柴油。

3. 在testbench中,通過set_oil_type將實例對象傳入。類的多態,調用add_oil, 根據對象調用實際“算法”。

eba87a2a-3669-11ee-9e74-dac502259ad0.png

上面的例子通過策略模式構建,似乎有些繁瑣,通過if else判斷是卡車還是轎車選擇加什么油,更簡單明了。但是這里僅僅使用了一種車加油的“特征”,如果有更多種類的車,更多特征,比如載人數量,車身顏色,組件型號等,使用if else對各種類型的車做歸類將使代碼難以維護。如果卡車有一天加了汽油,只需要set_oil_type(add_gasoline_h)就可以完成,通過if else編寫的代碼顯然hardcoding了。

上述代碼還不夠make sense,無路是汽車還是卡車,當被創建時,應該有一個default的默認加油方式,所以可以改寫如下:

在汽車或者卡車被創建時,就指定一種加油方式。line20將卡車切換成加汽油,line24再切換成加柴油時,報錯。因為變量被 protected 修飾,不可以在類外部調用。

ec055b1e-3669-11ee-9e74-dac502259ad0.png

UML圖:

ec51b52c-3669-11ee-9e74-dac502259ad0.png

所以策略模式的 “策略” 體現在對算法的調用和算法的實現的解耦,我們把“算法”(具體函數處理)封裝到一個抽線類中,在調用類中聲明這個抽象類(這便是composition,調用類可以使用抽象類的方法),對抽象類實現或者重寫成多個子類,調用類調用算法時,根據內部抽象類句柄指向的具體的子類對象,調用子類對象的”算法“(多態)。

策略模式很實用,在純軟件編程中非常常見。在UVM源碼中也應用到了策略模式,比如default_sequence和uvm_callback。UVM中使用的策略模式和純軟件編程中所總結的策略模式稍有不同,但核心是一樣的,通過 “ 組合 + 多態” 的方式,實現對算法的調用和算法的實現的解耦。

default_sequence

構建用例創建的sequence繼承于uvm_sequence, 繼承關系如圖:

ec747b16-3669-11ee-9e74-dac502259ad0.png

sequence不像component一樣,沒有被UVM賦予phase機制,sequence的運行需要“掛載”在sequencer上,一般有三種方式(UVM設計模式 (六)命令模式、三種sequence啟動方式、start_item/finish_item、中介模式、virtual sequence):

1:采用default_sequence的方式啟動

2. 直接調用sequence的start()函數啟動

3. 在virtual sequence中調用uvm_do宏啟動sequence

下面梳理下default_sequence中策略模式的應用:

1. 將case0_sequence“掛載”到sequencer上。

2. uvm_sequence_base中的虛函數start()調用了pre/post_start(), pre/post_body(),以及body()函數,這些函數都是虛函數,且沒有定義任何操作。case0_sequence重寫body()函數。

3. 當執行到main_phase()時,會執行uvm_sequencer_base中的start_phase_sequence()函數,uvm_config_db#() get::()獲得case0_sequence的type_id, 然后調用factory的create_object_by_type創建case0_sequence的實例。(參考上一節工廠模式) $cast中的seq是uvm_sequence_base類型,多態。

4. 調用seq.start(), 執行body()函數的代碼。

5. 只有使用default_sequence的方式啟動,case0_sequence中starting_phase才不等于 null.

(只摘取了與策略模式有關的 code) +

ec86af70-3669-11ee-9e74-dac502259ad0.png

default_sequence的方式啟動,會調用seq.start()函數來運行body()函數的代碼, 不同用例body()函數的實現不同,這里的body()就相當于策略模式中的“算法",將body()函數的實現放在子類sequence中重寫,實現解耦。

不同之處是,UVM中通過 confid_db和facotry結合創建sequence,更靈活。抽象類使用的是virtual class而不是interface class,區別在第一篇中有闡述。UVM設計模式(一)

callback

在學習uvm_callback之前,先看一下如何用Systemverilog寫一個簡單的callback。

1. 抽象函數Driver_cbs定義了抽象函數pre_tx(), post_tx(),然后子類Driver_cbs_drop重寫了pre_tx()函數,實現了每100個事務隨機丟棄1個事務的功能。在class Driver中聲明了這個抽象類的隊列 cbs[$] 。

2. 在test中創建Driver_cbs_drop的實例對象,然后放入到cbs[$]這個隊列中。可以放進去的原因是類的多態,父類句柄可以指向子類對象。

3. 遍歷cbs[$]中放入的callback類,執行子類對象的pre_tx()函數。

源代碼:《SystemVerilog 驗證-測試平臺編寫指南》 8.7 :

ecd682a2-3669-11ee-9e74-dac502259ad0.png

上述的callback和策略模式的實現方式一樣(組合 + 多態),在Driver類聲明抽象類,然后調用抽象類中的函數,根據類的多態,實際調用的是子類重寫過的函數。解耦pre_tx()函數的實現與調用,保持代碼結構穩定,提高擴展性。

不同點在于callback定義的 pre_tx() 更像一個hook鉤子,callback 常在VIP中使用,為了滿足不同使用者的需求(在 driver中實現注錯或者異常 ;在 monitor中收集功能覆蓋率;或者實現控制 objection 的 raise/drop功能 ),設計VIP的人員需要留出這個hook供使用者根據業務需求自行定義,使用者不需要了解VIP driver的具體實現,只關心這個hook的實現。從這點來看,callback和上一節中的模板模式更接近,只不過實現方式不同,模板模式利用 繼承+重寫 實現。callbcak提供的hook相比模板模式提供的hook,擴展性和復用性更好,但是實現更復雜些。實際工作根據業務需求選擇合適方式預留hook。

而純軟件中的策略模式是為了將一類算法歸一抽象,然后分別實現。側重于每一種算法的相互替代,使算法的變化獨立于使用它們的客戶端(這里的客戶端指使用算法的代碼)。通過解耦控制模塊代碼的復雜度和代碼量,解決大量使用if-else分支判斷邏輯。除此之外,策略模式還能滿足開閉原則呢,添加新策略的時候,最小化、集中化的代碼改動,減少引入bug的風險。

但是遵循第一篇中提到的KISS(Keep It Stupid Simple)原則,怎么簡單怎么來,就是最好的設計,非得用策略模式,搞出n多類,反倒是一種過度設計。設計模式之美

uvm_callback

uvm_callback的大體結構與上一節提到的callbcak類似,具體實現細節不在列舉(可參考《UVM1.1 應用指南及源碼分析》- 19 callback機制源碼分析 ),分析側重日常調用以及策略模式的相關內容:

下圖紅框由VIP開發者或者平臺搭建者完成,黃框為callback調用者完成。

1. 設計一個class A包含虛函數pre_tran()作為hook,供driver調用。typedef 將 A_pool 定義為 uvm_callbacks#(my_dirver, A) 類型的參數化的類。(class A相當于上節的 class Driver_cbs)

2. class my_callback 繼承 class A, 重寫 task pre_tran()。(class my_callback相當于上節的class Driver_cbs_drop)

3. 在tc的connect_phase()中創建my_callback的對象,調用靜態函數 A_pool::add(),完成對uvm_callbacks_base類中靜態關聯數組m_pool的賦值。(uvm_pool看成關聯數組, uvm_queue看成隊列, m_pool索引為object(drv), 值為存放uvm_callback(my_cb)的uvm_queue )( 此處的 uvm_queue相當于上節的 cbs[$] 隊列,調用函數 add()相當于上節 cbs.push_back(dcd) 。)

(不同之處,UVM引入了 m_pool 這個關聯數組作為 “池子“,可以存放 A類型的 callback, 也可以存放 B類型的 callback, 所以 A類型對應一個隊列,B類型對應一個隊列。此例中只用到了m_pool 。class uvm_typde_callbacks # (type T = uvm_object) 中還有一個靜態變量 m_tw_cb_q ,當 A_pool :: add (null, my_cb),第一個參數為 null,則 my_cb放入m_tw_cb_q隊列中。null則不指定具體 instance,表明該 callback對這個 type實例的對象都有效 。m_pool全局只有一個,而m_tw_cb_q則每個 type對應一個)

4. `uvm_register_cb宏展開,調用靜態函數m_register_pair(), 完成callback與object的配對。試想,如果平臺設計者設計了callback A 給driver使用 `uvm_register_cb(my_driver,A),callback B給monitor使用 `uvm_register_cb(my_monitor,B),以及其他很多callback。而使用者在調用callback時卻在A_pool::add() 中誤加入了類型B的callback, 編譯仿真都正常進行,但是實際hook并沒有被調用。幸運的是,會打印一個warning供使用者debug,幫助他及時發現前面的錯誤。

ecfcb8aa-3669-11ee-9e74-dac502259ad0.png

5. `uvm_do_callbacks(T,CB,THIS,METHOD)展開后,創建uvm_callback_iter的實例,這個類提供的是iterator迭代器的功能,因為所有callback都放在了容器 m_pool 或 m_tw_cb_q 中,在此處調用的callback需要滿足 uvm_object=my_driver, uvm_callback = A 的條件,需要對容器檢索遍歷獲得。如上節單獨的foreach循環無法滿足要求,所以UVM提供了一個迭代器類專門負責此事。該示例中重復的過程如下:(此處對 uvm_queue的遍歷相當于上節通過 foreach()對 cbs[$] 的遍歷過程)

通過 m_get_q() 函數在 m_pool 中找到 和driver相對應的 callback uvm_queue(ref類型,賦值給get_first()函數中的q變量),然后在q隊列中找到A類型的callback, 調用callback中的函數。然后重復執行上述步驟,直到 cb == null 結束。

uvm_queue中可能會放不同類型的callback,通過 $cast篩選出符合的類型。

如果使用 A_pool :: add (null, my_cb), 則是對m_tw_cb_q 隊列的遍歷,這里沒有列出。

更多內容見:UVM設計模式 ( 五 ) 迭代器模式、Python/SV中的迭代器、uvm_callback_iter、scoreboard中的迭代器

+ (源代碼UVM實戰 9.1.4):

ed0b10b2-3669-11ee-9e74-dac502259ad0.png

根據上述紅色斜體的內容描述,UVM中的callback和SV中的callback使用思路一致,也是 組合 + 多態 的實現方式,和策略模式一樣。通過UVM工廠模式的重寫功能也可以實現callback的效果,選擇哪種方式要根據實際場景。

擴展使用

在實際工作中,可以采用策略模式進行解耦,將那些經常變化的“內容”抽象出來,在外部分別實現。

下面列舉DVCon上的兩篇策略模式實際應用的文章:

2016 DVCon US : Design Patterns by Example for SystemVerilog Verification Environments Enabled by SystemVerilog 1800-2012

將PackBehavior和CheckBehaviro這兩個"行為”從base_packet中拎出來,外部實現重寫interface class, 構建了 v1_pack, v2_pack, v3_pack, Parity, Crc這幾個類。

根據不同版本V1,V2,V3繼承base_packet,創建v1_packet, v2_packet, v3_packet類,調用setPackBehaviro(), setCheckBehaviro()賦予不同的"行為“。

ed657386-3669-11ee-9e74-dac502259ad0.png

2019 DVCon INDIA : Using Software Design Patterns in Test Bench Development for a Multi-Layer Protocol

和上一篇類似,也是對packet中的pack_behaviro和check_behavior的操作。業務是DSI中的PHY layer。

ed98748e-3669-11ee-9e74-dac502259ad0.png

審核編輯:湯梓紅

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

    關注

    23

    文章

    4601

    瀏覽量

    92671
  • 函數
    +關注

    關注

    3

    文章

    4308

    瀏覽量

    62444
  • UVM
    UVM
    +關注

    關注

    0

    文章

    181

    瀏覽量

    19144
  • 設計模式
    +關注

    關注

    0

    文章

    53

    瀏覽量

    8623

原文標題:UVM設計模式:模板模式、策略模式、default_sequence、uvm_callback

文章出處:【微信號:IP與SoC設計,微信公眾號:IP與SoC設計】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    行為設計模式UVM的應用有哪些呢?

    Template method patttern: 一個方法定義一個算法骨架,并將某些步驟推遲到子類實現。子類不改變算法整體結構的情況下,重新定義算法
    的頭像 發表于 08-07 10:19 ?980次閱讀
    <b class='flag-5'>行為</b><b class='flag-5'>型</b>設計<b class='flag-5'>模式</b><b class='flag-5'>在</b><b class='flag-5'>UVM</b><b class='flag-5'>中</b>的應用有哪些呢?

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

    。可以不改變平臺代碼的基礎上改變平臺的行為,以產生不同類型的激勵。平臺可以不同的驗證工程之間進行移植,善于利用uvm提供的各種機制。可以使驗證平臺具有極強的可重用性。
    發表于 01-21 16:00

    數字IC驗證之“典型的UVM平臺結構”(3)連載...

    應用的過程,將uvm的組件封裝起來,可以將這些封裝的組件呢作為一個整體進行重用,進行芯片級或者是系統級驗證的時候,往往會出現多個模塊的驗證。  此時,測試平臺的結構會發生變化,圖中的測試平臺實現了
    發表于 01-22 15:32

    數字IC驗證之“構成uvm測試平臺的主要組件”(4)連載...

    的agent為agent的passive模式。  scoreboard積分板,它將會從兩個地方獲取數據,一個是參考模型發來的期望值,另一個是從slave agent發來的dut的輸出值。積分板對這兩個
    發表于 01-22 15:33

    什么是uvmuvm的特點有哪些呢

    直觀的印象,就是uvm驗證平臺,它是分層的結構。圖中的每一個巨型框都代表著平臺的一個構成元素。這些元素呢,我們稱為平臺組建,下面來簡單的分析一下。從最底層上來看,agent 包含了driver,monitor和sequencer,其中driver ,monitor
    發表于 02-14 06:46

    請問一下UVM的UVMsequences是什么意思啊

    UVM方法學,UVMsequences 是壽命有限的對象。UVM sequences從uvm_sequence_item基類擴展得到,
    發表于 04-11 16:43

    談談UVMuvm_info打印

    上有\`uvm_file和\`uvm_line的傳參,它們定義如下:  `define uvm_file `__FILE__  `define uvm_line `__LINE__  
    發表于 03-17 16:41

    UVMseq.start()和default_sequence執行順序

    下src/base/uvm_task_phase.svh文件。為方便分析,我截圖如下。uvm_task_phase類里execute(xxx)函數的第148行和150行確定了seq1和seq2的執行
    發表于 04-04 17:15

    設計模式行為:備忘錄模式

    備忘錄模式(Memento Pattern)保存一個對象的某個狀態,以便在適當的時候恢復對象。備忘錄模式屬于行為模式
    的頭像 發表于 06-07 11:16 ?832次閱讀
    設計<b class='flag-5'>模式</b><b class='flag-5'>行為</b><b class='flag-5'>型</b>:備忘錄<b class='flag-5'>模式</b>

    設計模式行為:策略模式

    策略模式(Strategy Pattern),一個類的行為或其算法可以在運行時更改。這種類型的設計模式屬于
    的頭像 發表于 06-07 11:18 ?639次閱讀
    設計<b class='flag-5'>模式</b><b class='flag-5'>行為</b><b class='flag-5'>型</b>:策略<b class='flag-5'>模式</b>

    設計模式行為:狀態模式

    狀態模式(State Pattern),類的行為是基于它的狀態改變的。這種類型的設計模式屬于行為
    的頭像 發表于 06-07 11:20 ?590次閱讀
    設計<b class='flag-5'>模式</b><b class='flag-5'>行為</b><b class='flag-5'>型</b>:狀態<b class='flag-5'>模式</b>

    UVMuvm_config_db機制背后的大功臣

    本次講一下UVMuvm_config_db,UVM中提供了一個內部數據庫,可以在其中存儲給定名稱下的值,之后可以由其它TB組件去檢索。
    的頭像 發表于 06-20 17:28 ?1357次閱讀

    UVMuvm_config_db機制背后的大功臣

    本次講一下UVMuvm_config_db,UVM中提供了一個內部數據庫,可以在其中存儲給定名稱下的值,之后可以由其它TB組件去檢索。
    的頭像 發表于 06-29 16:57 ?1238次閱讀

    一文詳解UVM設計模式

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

    迭代模式UVM的應用有哪些

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