phase機(jī)制介紹
UVM中的phase,按照其是否消耗仿真時(shí)間($time打印出的時(shí)間)的特性,可以分成兩大類,一類是function phase,如 build_phase、connect_phase等,這些phase都不耗費(fèi)仿真時(shí)間,通過函數(shù)來實(shí)現(xiàn);另外一類是task phase,如run_phase等,它們耗費(fèi) 仿真時(shí)間,通過任務(wù)來實(shí)現(xiàn)。給DUT施加激勵(lì)、監(jiān)測(cè)DUT的輸出都是在這些phase中完成的。在下圖中,灰色背景所示的是task phase,其他為function phase。
image-20240228151228432
上面的所有phase都是按順序自上而下自動(dòng)執(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
運(yùn)行上述代碼,可以看到各phase被依次執(zhí)行。
需要注意的一點(diǎn)是就是run_phase和右邊的12個(gè)phase,是并列關(guān)系,而不是說run_phase包含右邊的12個(gè)phase,它們是并行運(yùn)行的,它們的順序大致如下:
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都不會(huì)將它們?nèi)坑蒙?。使用頻率最高的 是build_phase、connect_phase和main_phase。這么多phase除了方便驗(yàn)證人員將不同的代碼寫在不同的phase外,還有利于其他驗(yàn)證 方法學(xué)向UVM遷移。一般的驗(yàn)證方法學(xué)都會(huì)把仿真分成不同的階段,但是這些階段的劃分通常沒有UVM分得這么多、這么細(xì) 致。所以一般來說,當(dāng)其他驗(yàn)證方法學(xué)向UVM遷移的時(shí)候,總能找到一個(gè)phase來對(duì)應(yīng)原來方法學(xué)中的仿真階段,這為遷移提供 了便利。
Phase的執(zhí)行順序
build_phase是按照自上而下的順序執(zhí)行的,在下圖中,先執(zhí)行uvm_test_top的build_phase,再執(zhí)行env的build_phase。
除了build_phase,所有不耗費(fèi)仿真時(shí)間的phase都是自下而上執(zhí)行的,對(duì)于connect_phase即先執(zhí)行driver和monitor的connect_phase,再執(zhí)行agent的connect_phase。
image-20240228151306612
看到這里,很多同學(xué)可能就有三個(gè)疑惑。
對(duì)于i_agt、mdl、scb、o_agt這幾個(gè)兄弟關(guān)系的component,執(zhí)行順序是什么樣的?
每個(gè)component里面都有build_phase和main_phase,是按component執(zhí)行還是按phase的順序執(zhí)行?
那幾個(gè)task phase,是會(huì)消耗仿真時(shí)間的,是按照什么樣的順序執(zhí)行的?
Answer:
無論是自上而下還是自下而上,都只適應(yīng)于UVM樹中有直系關(guān)系的component。對(duì)于同一層次的、具有兄弟關(guān)系的 component,如driver與monitor,它們是按照字典的順序執(zhí)行的,這里的字典序的排序 依據(jù)new時(shí)指定的名字。假如monitor在new時(shí)指定的名字為aaa,而driver的名字為bbb,那么將會(huì)先執(zhí)行monitor的build_phase。反之 若monitor為mon,driver為drv,那么將會(huì)先執(zhí)行driver的build_phase。
我們本節(jié)提到的bulid_phase、connect_phase、run_phase這些都是時(shí)間的概念,而上面這個(gè)圖中各個(gè)component的關(guān)系是空間的概念。在執(zhí)行時(shí),先把各個(gè)component中的build_phase執(zhí)行完,再執(zhí)行各個(gè)component的connect_phase,再執(zhí)行各個(gè)component的run_phase。
類似run_phase、main_phase等task_phase也都是按照自下而上的順序執(zhí)行的。但是與前面function phase自下而上執(zhí)行不同的是,這種task phase是耗費(fèi)時(shí)間的,所以它并不是等到“下面”的phase(如driver的run_phase)執(zhí)行完才執(zhí)行“上面”的phase(如agent 的run_phase),而是將這些run_phase通過fork…join_none的形式全部啟動(dòng)。所以,更準(zhǔn)確的說法是自下而上的啟動(dòng),同時(shí)在運(yùn)行。
但一般我們的環(huán)境中,只有driver和monitor里面會(huì)有run_phase或者main_phase的定義,像agent這種封裝類的component,不會(huì)定義task_phase。
對(duì)于同一component來說,其12個(gè)run-time的phase是順序執(zhí)行的,但是它們也僅僅是順序執(zhí)行,并不是說前面一個(gè)phase執(zhí)行完 就立即執(zhí)行后一個(gè)phase。以main_phase和post_main_phase為例,對(duì)于A component來說,其main_phase在0時(shí)刻開始執(zhí)行,100時(shí)刻 執(zhí)行完畢;對(duì)于B component來說,其main_phase在0時(shí)刻開始執(zhí)行,200時(shí)刻執(zhí)行完畢;此時(shí)整個(gè)驗(yàn)證平臺(tái)的main_phase才執(zhí)行完畢,接下來執(zhí)行post_main_phase,即A和B的post_main_phase都是在200時(shí)刻開始執(zhí) 行。假設(shè)A的post_main_phase執(zhí)行完畢需要300個(gè)時(shí)間單位,而B只需要200個(gè)時(shí)間單位,無論是A或者B,其后續(xù)都沒有其他耗時(shí) 間的phase了,整個(gè)驗(yàn)證平臺(tái)會(huì)在500時(shí)刻關(guān)閉。
可以看到對(duì)于A來說,main_phase在100時(shí)刻結(jié)束,其post_main_phase在200時(shí)刻開始執(zhí)行。在100~200時(shí)刻,A處于等待B的 狀態(tài),除了等待不做任何事情。B的post_main_phase在400時(shí)刻結(jié)束,之后就處于等待A的狀態(tài)。
這個(gè)過程如下圖所示:
image-20240228151317829
無論從A還是B的角度來看,都存在一段空白等待時(shí)間。但是從整個(gè)驗(yàn)證平臺(tái)的角度來看,各個(gè)task phase之間是沒有任何空白的。
除了兄弟關(guān)系的component,還有一種叔侄關(guān)系的component,如my_scoreboard與my_driver,從樹的層次結(jié)構(gòu)上 來說,scoreboard級(jí)別是高于driver的,但是,這兩者build_phase的執(zhí)行順序其實(shí)也是不確定的。這兩者的執(zhí)行順序除了上節(jié)提到的 字典序外,還用到了圖論中樹的遍歷方式:廣度優(yōu)先或是深度優(yōu)先。
UVM中采用的是深度優(yōu)先的原則,在UVM的樹形圖中,scoreboard及driver的build_phase的執(zhí)行順序,i_agt實(shí)例化時(shí)名字為“i_agt”, 而scb為“scb”,那么i_agt的build_phase先執(zhí)行,在執(zhí)行完畢后,接下來執(zhí)行driver、monitor及sequencer的build_phase。當(dāng)全部執(zhí)行完 畢后再執(zhí)行scoreboard的build_phase。
常用的三個(gè)phase
我們上面也講過bulid_phase、connect_phase和run_phase是三個(gè)最常用的phase,那這三個(gè)phase的具體作用是什么?應(yīng)該如何使用?
run_phase也經(jīng)常會(huì)用main_phase代替。
build_phase
主要用來實(shí)例化組件,即創(chuàng)建對(duì)象。uvm_component對(duì)其做的最重要的事情就是自動(dòng)獲取通過config_db::set設(shè)置的參數(shù)。
connect_phase
TLM端口連接,實(shí)現(xiàn)數(shù)據(jù)通信。TLM通信我們后面再講。
run_phase
所有的數(shù)據(jù)處理,都在run_phase中。
審核編輯:劉清
-
UVM
+關(guān)注
關(guān)注
0文章
182瀏覽量
19548 -
TLM
+關(guān)注
關(guān)注
1文章
33瀏覽量
24971 -
DUT
+關(guān)注
關(guān)注
0文章
191瀏覽量
12954
原文標(biāo)題:UVM手把手教程系列(二)Phase機(jī)制介紹
文章出處:【微信號(hào):傅里葉的貓,微信公眾號(hào):傅里葉的貓】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
【原創(chuàng)】小草手把手教你LabVIEW視頻系列匯總帖(12.22更新)
手把手教你學(xué)stm32
美女手把手教你如何裝機(jī)(中)
手把手教你安裝Quartus II
手把手教你如何安裝機(jī)械硬盤和分區(qū)
手把手教你學(xué)LabVIEW視覺設(shè)計(jì)
手把手教你開關(guān)電源PCB排板

評(píng)論