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

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

3天內(nèi)不再提示

UVM手把手教程系列(二)Phase機制簡單介紹

傅里葉的貓 ? 來源:傅里葉的貓 ? 2024-02-29 09:26 ? 次閱讀

phase機制介紹

UVM中的phase,按照其是否消耗仿真時間($time打印出的時間)的特性,可以分成兩大類,一類是function phase,如 build_phase、connect_phase等,這些phase都不耗費仿真時間,通過函數(shù)來實現(xiàn);另外一類是task phase,如run_phase等,它們耗費 仿真時間,通過任務(wù)來實現(xiàn)。給DUT施加激勵、監(jiān)測DUT的輸出都是在這些phase中完成的。在下圖中,灰色背景所示的是task phase,其他為function phase。

4d570c7a-d69a-11ee-a297-92fbcf53809c.pngimage-20240228151228432

上面的所有phase都是按順序自上而下自動執(zhí)行。

class my_case0 extends base_test; 
string tID = get_type_name();

virtual function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    `uvm_info(tID, "build_phase is executed", UVM_LOW)
endfunction

virtual function void start_of_simulation_phase(uvm_phase phase);
    super.start_of_simulation_phase(phase);
    `uvm_info(tID, "start_of_simulation_phase is executed", UVM_LOW)
endfunction

virtual task run_phase(uvm_phase phase);
    `uvm_info(tID, "run_phase is executed", UVM_LOW)
endtask

virtual task pre_reset_phase(uvm_phase phase);
    `uvm_info(tID, "pre_reset_phase is executed", UVM_LOW)
endtask

virtual task post_shutdown_phase(uvm_phase phase);
    `uvm_info(tID, "post_shutdown_phase is executed", UVM_LOW)
endtask

virtual function void extract_phase(uvm_phase phase);
    super.extract_phase(phase);
`uvm_info(tID, "extract_phase is executed", UVM_LOW)

virtual function void final_phase(uvm_phase phase);
    super.final_phase(phase);
    `uvm_info(tID, "final_phase is executed", UVM_LOW)
endfunction

endclass

運行上述代碼,可以看到各phase被依次執(zhí)行。

需要注意的一點是就是run_phase和右邊的12個phase,是并列關(guān)系,而不是說run_phase包含右邊的12個phase,它們是并行運行的,它們的順序大致如下:

fork
    begin
        run_phase();
    end
    begin
        pre_reset_phase();
        reset_phase();
        post_reset_phase();
        pre_configure_phase();
        configure_phase();
        post_configure_phase();
        pre_main_phase();
        main_phase();
        post_main_phase();
        pre_shutdown_phase();
        shutdown_phase();
        post_shutdown_phase();
    end
join

UVM提供了如此多的phase,在一般的應(yīng)用中,無論是function phase還是task phase都不會將它們?nèi)坑蒙?。使用頻率最高的 是build_phase、connect_phase和main_phase。這么多phase除了方便驗證人員將不同的代碼寫在不同的phase外,還有利于其他驗證 方法學(xué)向UVM遷移。一般的驗證方法學(xué)都會把仿真分成不同的階段,但是這些階段的劃分通常沒有UVM分得這么多、這么細 致。所以一般來說,當(dāng)其他驗證方法學(xué)向UVM遷移的時候,總能找到一個phase來對應(yīng)原來方法學(xué)中的仿真階段,這為遷移提供 了便利。

Phase的執(zhí)行順序

build_phase是按照自上而下的順序執(zhí)行的,在下圖中,先執(zhí)行uvm_test_top的build_phase,再執(zhí)行env的build_phase。

除了build_phase,所有不耗費仿真時間的phase都是自下而上執(zhí)行的,對于connect_phase即先執(zhí)行driver和monitor的connect_phase,再執(zhí)行agent的connect_phase。

4d76608e-d69a-11ee-a297-92fbcf53809c.pngimage-20240228151306612

看到這里,很多同學(xué)可能就有三個疑惑。

對于i_agt、mdl、scb、o_agt這幾個兄弟關(guān)系的component,執(zhí)行順序是什么樣的?

每個component里面都有build_phase和main_phase,是按component執(zhí)行還是按phase的順序執(zhí)行?

那幾個task phase,是會消耗仿真時間的,是按照什么樣的順序執(zhí)行的?

Answer:

無論是自上而下還是自下而上,都只適應(yīng)于UVM樹中有直系關(guān)系的component。對于同一層次的、具有兄弟關(guān)系的 component,如driver與monitor,它們是按照字典的順序執(zhí)行的,這里的字典序的排序 依據(jù)new時指定的名字。假如monitor在new時指定的名字為aaa,而driver的名字為bbb,那么將會先執(zhí)行monitor的build_phase。反之 若monitor為mon,driver為drv,那么將會先執(zhí)行driver的build_phase。

我們本節(jié)提到的bulid_phase、connect_phase、run_phase這些都是時間的概念,而上面這個圖中各個component的關(guān)系是空間的概念。在執(zhí)行時,先把各個component中的build_phase執(zhí)行完,再執(zhí)行各個component的connect_phase,再執(zhí)行各個component的run_phase。

類似run_phase、main_phase等task_phase也都是按照自下而上的順序執(zhí)行的。但是與前面function phase自下而上執(zhí)行不同的是,這種task phase是耗費時間的,所以它并不是等到“下面”的phase(如driver的run_phase)執(zhí)行完才執(zhí)行“上面”的phase(如agent 的run_phase),而是將這些run_phase通過fork…join_none的形式全部啟動。所以,更準確的說法是自下而上的啟動,同時在運行。

但一般我們的環(huán)境中,只有driver和monitor里面會有run_phase或者main_phase的定義,像agent這種封裝類的component,不會定義task_phase。

對于同一component來說,其12個run-time的phase是順序執(zhí)行的,但是它們也僅僅是順序執(zhí)行,并不是說前面一個phase執(zhí)行完 就立即執(zhí)行后一個phase。以main_phase和post_main_phase為例,對于A component來說,其main_phase在0時刻開始執(zhí)行,100時刻 執(zhí)行完畢;對于B component來說,其main_phase在0時刻開始執(zhí)行,200時刻執(zhí)行完畢;此時整個驗證平臺的main_phase才執(zhí)行完畢,接下來執(zhí)行post_main_phase,即A和B的post_main_phase都是在200時刻開始執(zhí) 行。假設(shè)A的post_main_phase執(zhí)行完畢需要300個時間單位,而B只需要200個時間單位,無論是A或者B,其后續(xù)都沒有其他耗時 間的phase了,整個驗證平臺會在500時刻關(guān)閉。

可以看到對于A來說,main_phase在100時刻結(jié)束,其post_main_phase在200時刻開始執(zhí)行。在100~200時刻,A處于等待B的 狀態(tài),除了等待不做任何事情。B的post_main_phase在400時刻結(jié)束,之后就處于等待A的狀態(tài)。

這個過程如下圖所示:

4d862bc2-d69a-11ee-a297-92fbcf53809c.pngimage-20240228151317829

無論從A還是B的角度來看,都存在一段空白等待時間。但是從整個驗證平臺的角度來看,各個task phase之間是沒有任何空白的。

除了兄弟關(guān)系的component,還有一種叔侄關(guān)系的component,如my_scoreboard與my_driver,從樹的層次結(jié)構(gòu)上 來說,scoreboard級別是高于driver的,但是,這兩者build_phase的執(zhí)行順序其實也是不確定的。這兩者的執(zhí)行順序除了上節(jié)提到的 字典序外,還用到了圖論中樹的遍歷方式:廣度優(yōu)先或是深度優(yōu)先。

UVM中采用的是深度優(yōu)先的原則,在UVM的樹形圖中,scoreboard及driver的build_phase的執(zhí)行順序,i_agt實例化時名字為“i_agt”, 而scb為“scb”,那么i_agt的build_phase先執(zhí)行,在執(zhí)行完畢后,接下來執(zhí)行driver、monitor及sequencer的build_phase。當(dāng)全部執(zhí)行完 畢后再執(zhí)行scoreboard的build_phase。

常用的三個phase

我們上面也講過bulid_phase、connect_phase和run_phase是三個最常用的phase,那這三個phase的具體作用是什么?應(yīng)該如何使用?

run_phase也經(jīng)常會用main_phase代替。

build_phase

主要用來實例化組件,即創(chuàng)建對象。uvm_component對其做的最重要的事情就是自動獲取通過config_db::set設(shè)置的參數(shù)。

connect_phase

TLM端口連接,實現(xiàn)數(shù)據(jù)通信。TLM通信我們后面再講。

run_phase

所有的數(shù)據(jù)處理,都在run_phase中。





審核編輯:劉清

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

    關(guān)注

    0

    文章

    181

    瀏覽量

    19121
  • TLM
    TLM
    +關(guān)注

    關(guān)注

    1

    文章

    32

    瀏覽量

    24722
  • DUT
    DUT
    +關(guān)注

    關(guān)注

    0

    文章

    189

    瀏覽量

    12309

原文標題:UVM手把手教程系列(二)Phase機制介紹

文章出處:【微信號:傅里葉的貓,微信公眾號:傅里葉的貓】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    【原創(chuàng)】小草手把手教你LabVIEW視頻系列匯總帖(12.22更新)

    為了讓大家更好的查找小草手把手教你LabVIEW視頻教學(xué)系列,小編特為大家匯總?cè)缦拢骸疽曨l教學(xué)】小草手把手LabVIEW編程—LED滾動屏【視頻教學(xué)】小草手把手教你LabVIEW狀態(tài)機
    發(fā)表于 12-08 10:10

    手把手教你學(xué)stm32

    很多家:現(xiàn)在市面上還比較火的基本就只剩前4家了,從這4家中選擇一家買開發(fā)板。正好這4家的教程我都基本上都有看過一遍,下面簡單介紹一下它們各自的特點:1、正點原子正點原子的教程特點的關(guān)鍵詞:手把手
    發(fā)表于 08-09 07:44

    手把手教你構(gòu)建一個完整的工程

    手把手教你構(gòu)建一個完整的工程
    發(fā)表于 08-03 09:54 ?33次下載
    <b class='flag-5'>手把手</b>教你構(gòu)建一個完整的工程

    手把手教你寫批處理-批處理的介紹

    手把手教你寫批處理-批處理的介紹
    發(fā)表于 10-25 15:02 ?69次下載

    美女手把手教你如何裝機(中)

    美女手把手教你如何裝機(中) 再來是硬碟的部份,這款機殼還不錯,可以旋轉(zhuǎn)支架~
    發(fā)表于 01-27 11:14 ?1451次閱讀

    美女手把手教你如何裝機(下)

    美女手把手教你如何裝機(下) 接著下來就是今天的重頭戲,開核蘿!~
    發(fā)表于 01-27 11:16 ?2914次閱讀

    手把手教你學(xué)電子書制作

    手把手教你學(xué)電子書制作,可以自己DIY電子書
    發(fā)表于 09-13 11:26 ?0次下載

    手把手教你安裝Quartus II

    本章手把手把地教你如何安裝 Quartus II 軟件 ,并將它激活 。此外 還有USB -Blaster下載器的驅(qū)動安裝步驟 。
    發(fā)表于 09-18 14:55 ?9次下載

    手把手教你在家搭建監(jiān)控系統(tǒng)

    手把手教你在家搭建監(jiān)控系統(tǒng)
    發(fā)表于 01-17 19:47 ?25次下載

    手把手教你做電子時鐘---前言

    手把手教你做彩鈴電子時鐘
    發(fā)表于 11-14 16:53 ?11次下載

    手把手教你如何開始DSP編程

    手把手教你如何開始DSP編程。
    發(fā)表于 04-09 11:54 ?12次下載
    <b class='flag-5'>手把手</b>教你如何開始DSP編程

    手把手教你如何安裝機械硬盤和分區(qū)

    手把手教你如何安裝機械硬盤與分區(qū),看了你就知道這是多么簡單!一起來試試看吧~
    的頭像 發(fā)表于 03-05 17:19 ?14.4w次閱讀

    手把手教你學(xué)LabVIEW視覺設(shè)計

    手把手教你學(xué)LabVIEW視覺設(shè)計手把手教你學(xué)LabVIEW視覺設(shè)計手把手教你學(xué)LabVIEW視覺設(shè)計手把手教你學(xué)LabVIEW視覺設(shè)計手把手
    發(fā)表于 03-06 01:41 ?3092次閱讀

    手把手教你開關(guān)電源PCB排板

    手把手教你開關(guān)電源PCB排板(新型電源技術(shù))-分享一下開關(guān)電源PCB排板的基本要點及分析,以及例子講解。絕對的手把手
    發(fā)表于 09-18 12:27 ?57次下載
    <b class='flag-5'>手把手</b>教你開關(guān)電源PCB排板

    手把手教你學(xué)FPGA仿真

    電子發(fā)燒友網(wǎng)站提供《手把手教你學(xué)FPGA仿真.pdf》資料免費下載
    發(fā)表于 10-19 09:17 ?2次下載
    <b class='flag-5'>手把手</b>教你學(xué)FPGA仿真