uvm event callback
UVM provides the facility to add callbacks to a uvm_event trigger. The pre_trigger and post_trigger are the callback hooks placed with the event trigger method. for more on uvm callback refer to uvm_callback.
- User can write user-defined callback class by extending the uvm_event_callback
- User can override any or both pre_trigger and post_trigger methods in user-defined callback class
- uvm_event method add_callback is used to register the callback with event
uvm event callbacks are an alternative to using processes that wait on events. When a callback is attached to an event, the attached callback function/s is called each time the event is triggered.
Writing user-defined callback,
class user_defined_callback extends uvm_event_callback;
---
endclass
一、uvm_event_callback methods
1、new
Creates a new callback object.
2、pre_trigger
virtual function bit pre_trigger (uvm_event#(T) e, T data )
// e is the uvm_event#(T) that is being triggered
// data is the data associated with the event trigger
- This will get called just before triggering the associated event
- In extended class, the user can override this method in a derived class to implement any pre-trigger functionality
- This method returns bit type
- If the method returns 1, the event will not trigger and the post-trigger callback is not called. This provides a way for a callback to prevent the event from triggering
3、post_trigger
virtual function void post_trigger (uvm_event#(T) e, T data )
// e is the uvm_event#(T) that is being triggered
// data is the data associated with the event trigger
- This will get called after triggering the associated event
- In extended class, the user can override this method to implement any post-trigger functionality
二、uvm event callback examples
In the below example,
- comp_a, comp_b, and a user-defined callback class event_callback
- comp_a and comp_b will get the event ev_ab from the uvm event pool
- pre_trigger and post_trigger methods are implemented in the event_callback class
- In the comp_a event_callback object is created with the name ev_cb
- uvm_event add_callback method is used to register the callback with an event (ev.add_callback(ev_cb);)
- On calling event.trigger pre_trigger and post_trigger methods will get called
1、Writing user-defined event callback class
class event_callback extends uvm_event_callback;
`uvm_object_utils(event_callback)
function new(string name = "event_callback");
super.new(name);
endfunction
//---------------------------------------
// pre trigger method
//---------------------------------------
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)
endfunction
//---------------------------------------
// post trigger method
//---------------------------------------
virtual function void post_trigger(uvm_event e,uvm_object data);
`uvm_info(get_type_name(),$sformatf(" [Callback] Inside event post_trigger callback"),UVM_LOW)
endfunction
endclass
2、Creating a callback object and registering with the event
//Declaring the event callback class
event_callback ev_cb;
//Creating object
ev_cb = new("ev_cb");
//Registering callback with an event ev
ev.add_callback(ev_cb);
- COMPLETE COMP_A CODE
class component_a extends uvm_component;
`uvm_component_utils(component_a)
uvm_event ev;
event_callback ev_cb;
//---------------------------------------
// 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 = new("ev_cb");
ev = uvm_event_pool::get_global("ev_ab");
ev.add_callback(ev_cb);
`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(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 event_callback.sv(24) @ 10: reporter [event_callback] [Callback] Inside event post_trigger callback
UVM_INFO component_a.sv(34) @ 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]