分享一個(gè)近期項(xiàng)目中遇到的函數(shù)調(diào)用問題。
略去定位過程和具體的業(yè)務(wù)細(xì)節(jié),原問題的模型可以抽象為如下的demo:
importuvm_pkg::*;
`include"uvm_macros.svh"
classtestextendsuvm_test;
`uvm_component_utils(test)
virtualtaskrun();
bit[3:0]run_cnt;
run_cnt++;
$display("run_cnt=%0d,enterrun@%t",run_cnt,$time);
//othercode
endtask
virtualtaskmain_phase(uvm_phasephase);
super.main_phase(phase);
phase.raise_objection(this);
run();
phase.drop_objection(this);
endtask
functionnew(stringname="test",uvm_componentparent=null);
super.new(name,parent);
endfunction
endclass
programtb_top;
initialbegin
run_test("test");
end
endprogram
設(shè)計(jì)一個(gè)run函數(shù)用于處理某些業(yè)務(wù)邏輯,并在UVC的main_phase中調(diào)用。看似簡單的邏輯,運(yùn)行仿真后得到如下的信息:
run被調(diào)用了兩次!
.........................
.........................
如果你也一時(shí)間想不到原因,可以參考下面的原因分析。
原因如下:
-
翻閱UVM源碼就會(huì)發(fā)現(xiàn),在uvm_component中,存在一個(gè)默認(rèn)的run函數(shù)。
-
UVM的phase機(jī)制,run_phase和main_phase,reset_phase等其余耗時(shí)的phase是并行運(yùn)行的。而默認(rèn)的run_phase會(huì)調(diào)用run函數(shù)。
- 在上述代碼的0時(shí)刻,默認(rèn)的run_phase調(diào)用一次run函數(shù),而main_phase也調(diào)用了一次run函數(shù)。
因此從uvm_component擴(kuò)展的UVC中,盡量不要使用run函數(shù),使用其他命名方式。
審核編輯 :李倩
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4332瀏覽量
62666 -
UVM
+關(guān)注
關(guān)注
0文章
182瀏覽量
19181
原文標(biāo)題:看看這個(gè)"UVM陷阱",你是不是也遇到過
文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論