线程同步-uvm_event的用法
在验证中可能出现一种场景:某些cfg在仿真过程中会更新,tb中用到这些cfg的component需要及时更新到最新的cfg.这里有两种解决方法
方案一、 通过config_db set/get将cfg传到component的时候,由于传递的是cfg的句柄,所以在component中直接引用句柄中的值xxx_cfg.xxx,就可以实时得到cfg中的最新值。
但是某些情况下,拿到cfg中的参数后,还需要做一些处理,这时候就不能直接引用句柄中的值,这种场景就涉及到线程的同步
方案二、使用event来进行线程同步
同样是通过config_db set/get将cfg传到component中,当cfg更新的时候,trigger event, 在目标component总wait到event trigger后更新参数。
1 class base_test extends uvm_test; 2 3 uvm_event cfg_upd_ev; 4 5 bit wr_en; 6 7 function void build_phase(uvm_phase phase); 8 9 cfg_upd_ev = uvm_event_pool::get_global("my_event");//instance 10 11 endfunction 12 13 function cfg_test_env(bit wr_en); 14 15 test_cfg.wr_en = wr_en; 16 17 cfg_upd_ev.trigger();//trigger event 18 19 endfunction 20 21 22 endclass 23 24 //base_scb 25 class base_scb extends uvm_component; 26 27 uvm_event cfg_upd_ev; 28 bit wr_en = 0; 29 30 function void build_phase(uvm_phase phase); 31 32 cfg_upd_ev = uvm_event_pool::get_global("my_event");//instance 33 34 35 endfunction 36 37 38 task wait_cfg_upd(); 39 forever begin 40 cfg_upd_ev.wait_trigger(); 41 cfg_scb_param(); 42 end 43 endtask 44 45 function cfg_scb_param(); 46 wr_en = wr_en = 0 ? base_cfg.wr_en : 1; 47 endfunction
endclass