线程同步-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

 

  

 

posted @ 2024-01-17 11:13  IVY_Liu  阅读(149)  评论(0编辑  收藏  举报