uvm_event_callback examples
Table of Contents
This section provides examples of,
- Registering two callbacks to the same event
- Disable the event trigger from pre_trigger
- Registering callbacks to the event in a test case
Registering two callbacks to the same event
This example is a continuation of the previous example, in this example two callbacks event_callback_0 and event_callback_1 is registered to the same event ev_ab.
//Declaring the event callback classes event_callback_0 ev_cb_0; event_callback_1 ev_cb_1; //Creating the objects ev_cb_0 = new("ev_cb_0"); ev_cb_1 = new("ev_cb_1"); //Registering callbacks with an event ev ev.add_callback(ev_cb_0); ev.add_callback(ev_cb_1);
Complete comp_a code
class component_a extends uvm_component; `uvm_component_utils(component_a) uvm_event ev; event_callback_0 ev_cb_0; event_callback_1 ev_cb_1; //--------------------------------------- // Constructor //--------------------------------------- function new(string name, uvm_component parent); super.new(name, parent); endfunction : new //--------------------------------------- // run_phase //--------------------------------------- virtual task run_phase(uvm_phase phase); phase.raise_objection(this); ev_cb_0 = new("ev_cb_0"); ev_cb_1 = new("ev_cb_1"); ev = uvm_event_pool::get_global("ev_ab"); ev.add_callback(ev_cb_0); ev.add_callback(ev_cb_1); `uvm_info(get_type_name(),$sformatf(" Before triggering the event"),UVM_LOW) #10; ev.trigger(); `uvm_info(get_type_name(),$sformatf(" After triggering the event"),UVM_LOW) phase.drop_objection(this); endtask : run_phase endclass : component_a
Simulator Output
UVM_INFO @ 0: reporter [RNTST] Running test basic_test... -------------------------------------- Name Type Size Value -------------------------------------- uvm_test_top basic_test - @335 comp_a component_a - @348 comp_b component_b - @357 -------------------------------------- UVM_INFO component_a.sv(32) @ 0: uvm_test_top.comp_a [component_a] Before triggering the event UVM_INFO component_b.sv(26) @ 0: uvm_test_top.comp_b [component_b] waiting for the event trigger UVM_INFO event_callback_0.sv(17) @ 10: reporter [event_callback_0] [Callback-0] Inside event pre_trigger callback UVM_INFO event_callback_1.sv(17) @ 10: reporter [event_callback_1] [Callback-1] Inside event pre_trigger callback UVM_INFO event_callback_0.sv(24) @ 10: reporter [event_callback_0] [Callback-0] Inside event post_trigger callback UVM_INFO event_callback_1.sv(24) @ 10: reporter [event_callback_1] [Callback-1] Inside event post_trigger callback UVM_INFO component_a.sv(37) @ 10: uvm_test_top.comp_a [component_a] After triggering the event UVM_INFO component_b.sv(30) @ 10: uvm_test_top.comp_b [component_b] event got triggerd UVM_INFO /apps/vcsmx/etc/uvm-1.2/src/base/uvm_objection.svh(1270) @ 10: reporter [TEST_DONE] UVM_INFO /apps/vcsmx/etc/uvm-1.2/src/base/uvm_report_server.svh(847) @ 10: reporter [UVM/REPORT/SERVER]
Disable the event trigger from pre_trigger
In this example, the pre_trigger method returns the value ‘1’, which will lead to disabling event_trigger. which leads to comp_b keep waiting for the event trigger.
pre_trigger method code
virtual function bit pre_trigger(uvm_event e,uvm_object data); `uvm_info(get_type_name(),$sformatf(" [Callback] Inside event pre_trigger callback"),UVM_LOW) return 1; endfunction
Simulator Output
UVM_INFO @ 0: reporter [RNTST] Running test basic_test... -------------------------------------- Name Type Size Value -------------------------------------- uvm_test_top basic_test - @335 comp_a component_a - @348 comp_b component_b - @357 -------------------------------------- UVM_INFO component_a.sv(29) @ 0: uvm_test_top.comp_a [component_a] Before triggering the event UVM_INFO component_b.sv(26) @ 0: uvm_test_top.comp_b [component_b] waiting for the event trigger UVM_INFO event_callback.sv(17) @ 10: reporter [event_callback] [Callback] Inside event pre_trigger callback UVM_INFO component_a.sv(34) @ 10: uvm_test_top.comp_a [component_a] After triggering the event UVM_FATAL /apps/vcsmx/etc/uvm-1.2/src/base/uvm_phase.svh(1489) @ 9200000000000: reporter [PH_TIMEOUT] Default timeout of 9200000000000 hit, indicating a probable testbench issue UVM_INFO /apps/vcsmx/etc/uvm-1.2/src/base/uvm_report_server.svh(847) @ 9200000000000: reporter [UVM/REPORT/SERVER]
Registering callbacks to the event in a test case
This example is a modification of the previous examples. In the previous examples, the event callback creation and registering with the event was done in the comp_a.
But in realtime use cases, it is required to create and register to an event from the test case, this example shows the registering callbacks to the event in a test case.
test case code
class basic_test extends uvm_test; `uvm_component_utils(basic_test) event_callback ev_cb; //Step-1: Declaring the event callback uvm_event ev; //--------------------------------------- // Components Instantiation //--------------------------------------- component_a comp_a; component_b comp_b; //--------------------------------------- // Constructor //--------------------------------------- function new(string name = "basic_test",uvm_component parent=null); super.new(name,parent); endfunction : new //--------------------------------------- // build_phase //--------------------------------------- virtual function void build_phase(uvm_phase phase); super.build_phase(phase); comp_a = component_a::type_id::create("comp_a", this); comp_b = component_b::type_id::create("comp_b", this); //Step-2. Creating the event callback ev_cb = new("ev_cb"); ev = uvm_event_pool::get_global("ev_ab"); //Step-3. Registering callback with event ev.add_callback(ev_cb); endfunction : build_phase //--------------------------------------- // end_of_elobaration phase //--------------------------------------- virtual function void end_of_elaboration(); //print's the topology print(); endfunction endclass : basic_test
Simulator Output
UVM_INFO @ 0: reporter [RNTST] Running test basic_test... -------------------------------------- Name Type Size Value -------------------------------------- uvm_test_top basic_test - @335 comp_a component_a - @348 comp_b component_b - @357 -------------------------------------- UVM_INFO component_a.sv(26) @ 0: uvm_test_top.comp_a [component_a] Before triggering the event UVM_INFO component_b.sv(26) @ 0: uvm_test_top.comp_b [component_b] waiting for the event trigger UVM_INFO event_callback.sv(17) @ 10: reporter [event_callback] [Callback] Inside event pre_trigger callback UVM_INFO event_callback.sv(24) @ 10: reporter [event_callback] [Callback] Inside event post_trigger callback UVM_INFO component_a.sv(31) @ 10: uvm_test_top.comp_a [component_a] After triggering the event UVM_INFO component_b.sv(30) @ 10: uvm_test_top.comp_b [component_b] event got triggerd UVM_INFO /apps/vcsmx/etc/uvm-1.2/src/base/uvm_objection.svh(1270) @ 10: reporter [TEST_DONE] UVM_INFO /apps/vcsmx/etc/uvm-1.2/src/base/uvm_report_server.svh(847) @ 10: reporter [UVM/REPORT/SERVER]