SystemVerilog中,initial begin-end是仿真開始就會執行的代碼塊。比如UVM的test入口函數run_test,一般就是在initial begin-end中調用。還有一些tb會在initial begin-end中使用fork join_none,用于創建一些仿真中的后臺進程,如時鐘產生,后門驅動等。
那么initial begin-end真的是仿真最早執行的嗎?
如果是消耗仿真時間的,那initial begin-end中的代碼是仿真開始最早執行的。如果不消耗仿真時間,那還有一種代碼會早于initial begin-end執行。
static property/function !!!
static類型變量,無論是全局變量,還是class內部參數,會在仿真開始前確定其初始值。如果該初始值是一個由static類型的function返回值決定,則該function的代碼會在initial begin-end前執行完畢。
可以參考如下的測試:
importuvm_pkg::*; `include"uvm_macros.svh" classstatic_wrapper; staticbitfst_flag=cls_func_before_initial("static_wrapper:fst_flag"); staticbitsnd_dlag=cls_func_before_initial("static_wrapper:snd_flag"); staticfunctionbitcls_func_before_initial(stringx); intcnt; cnt++; $display("cls_func_before_initial:",x,"@",$time); return1; endfunction endclass staticfunctionbitglb_func_before_initial(stringx); intcnt; cnt++; $display("glb_func_before_initial:",x,"@",$time); return1; endfunction classtestextendsuvm_test; `uvm_component_utils(test) functionnew(stringname="test",uvm_componentparent=null); super.new(name,parent); endfunction virtualtaskmain_phase(uvm_phasephase); super.main_phase(phase); phase.raise_objection(this); uvm_top.print(); phase.drop_objection(this); endtask endclass programtb_top; staticbitthd_flag=glb_func_before_initial("thd_flag"); initialbegin $display("initialbegin...@",$time); run_test("test"); $display("initialend...@",$time); end endprogram
仿真結果如下:
cls_func_before_initial:static_wrapper:fst_flag@0 cls_func_before_initial:static_wrapper:snd_flag@0 glb_func_before_initial:thd_flag@0 initialbegin...@0 UVM_INFO@0:reporter[RNTST]Runningtesttest... ------------------------------------- NameTypeSizeValue -------------------------------------uvm_root-@172 uvm_test_toptest-@336 ------------------------------------- UVM_INFO/apps/vcsmx/vcs/S-2021.09//etc/uvm-1.2/src/base/uvm_report_server.svh(904)@0:reporter[UVM/REPORT/SERVER] ---UVMReportSummary--- **Reportcountsbyseverity UVM_INFO:2 UVM_WARNING:0 UVM_ERROR:0 UVM_FATAL:0 **Reportcountsbyid [RNTST]1 [UVM/RELNOTES]1 $finishcalledfromfile"/apps/vcsmx/vcs/S-2021.09//etc/uvm-1.2/src/base/uvm_root.svh",line527. $finishatsimulationtime0
可以看到cls_func_before_initial和glb_func_before_initial兩個function都會在initial begin-end前執行。
上面的例子也可以看到,在run_test之后的代碼塊并不會執行,這是因為run_test執行結束后,UVM機制會直接調用$finish函數結束仿真。
其實在UVM中,已經利用了static變量的初始化這一特性。UVM的工廠模式中,使用uvm_component_utils/uvm_object_utils向工廠中注冊組件時,就利用了這一特性。逐層展開uvm_component_utils宏時,可以看到如下的代碼:
classuvm_component_registry#(typeT=uvm_component,stringTname="")extendsuvm_object_wrapper; //.... localstaticthis_typeme=get(); staticfunctionthis_typeget(); if(me==null)begin uvm_coreservice_tcs=uvm_coreservice_t::get(); uvm_factoryfactory=cs.get_factory(); me=new; factory.register(me); end returnme; endfunction //....
思路打開,利用static變量初始化這一特性,可以嘗試更多的應用。
審核編輯:劉清
-
Verilog
+關注
關注
28文章
1351瀏覽量
110139 -
UVM
+關注
關注
0文章
182瀏覽量
19185
原文標題:initial begin-end真的是SystemVerilog 仿真最早執行的嗎?
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論