Callback機制,其實是使用OOP來實現的一種程序開發者向程序使用者提供的模塊內部的接口。可以在Test_case的高度改變其他component的一些行為。
Systemverilog中已經提供的Callback函數pre_randomize,post_randomize。對於UVM和VIP來說,其他的CallBack函數都是自己程序的開發者事先
留下的hook。
Callback的實現:
1)首先直接從component擴展出新的類來實現pre_do等function不可取。因為component的改變會讓整個UVM的tree改變。
2)考慮利用OOP的composition來操作,先定義一個類A,並定義virtual pre_do等function於它的類中。后在UVM的component中加入該類,在do函數
之前調用pre_do。這樣在未重定義時,由於pre_do中沒有任何操作,所以不會對component產生任何影響。而重定義virtual pre_do之后,自然便
加入了相關的執行代碼。
UVM和VIP中的實現:
首先字uvm_callback派生一個類A,並定義虛函數virtual pre_do;(或uvm_reg_cbs)
定義uvm_register_cb(driver, A);在driver類中。這樣相當於將A加入driver class中。
定義A_pool,來存放A的實例化對象,在driver類中可以直接判斷A_pool是否為空,來執行pre_do。
在driver類中,使用uvm_do_callbacks(driver, A, pre_do);來調用pre_do,在do函數之前。
這樣便完成了預留的hook,
用戶使用時:
接下來只需要在需要的時候extended A,定義好pre_do函數。並且在connect_phase之前調用add函數,來添加進來。
A_pool::add(env.i_agt.drv, cb); cb即為A的Extended的類的對象。