URL
https://opencores.org/ocsvn/uart2bus_testbench/uart2bus_testbench/trunk
Subversion Repositories uart2bus_testbench
[/] [uart2bus_testbench/] [trunk/] [tb/] [uvm_src/] [macros/] [uvm_callback_defines.svh] - Rev 16
Compare with Previous | Blame | View Log
//-----------------------------------------------------------------------------
// Copyright 2007-2011 Mentor Graphics Corporation
// Copyright 2007-2011 Cadence Design Systems, Inc.
// Copyright 2010 Synopsys, Inc.
// All Rights Reserved Worldwide
//
// Licensed under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in
// writing, software distributed under the License is
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See
// the License for the specific language governing
// permissions and limitations under the License.
//-----------------------------------------------------------------------------
`ifndef UVM_CB_MACROS_SVH
`define UVM_CB_MACROS_SVH
//-----------------------------------------------------------------------------
// Title: Callback Macros
//
// These macros are used to register and execute callbacks extending
// from ~uvm_callbacks~.
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// MACRO: `uvm_register_cb
//
//| `uvm_register_cb(T,CB)
//
// Registers the given ~CB~ callback type with the given ~T~ object type. If
// a type-callback pair is not registered then a warning is issued if an
// attempt is made to use the pair (add, delete, etc.).
//
// The registration will typically occur in the component that executes the
// given type of callback. For instance:
//
//| virtual class mycb extends uvm_callback;
//| virtual function void doit();
//| endclass
//|
//| class my_comp extends uvm_component;
//| `uvm_register_cb(my_comp,mycb)
//| ...
//| task run_phase(uvm_phase phase);
//| ...
//| `uvm_do_callbacks(my_comp, mycb, doit())
//| endtask
//| endclass
//-----------------------------------------------------------------------------
`define uvm_register_cb(T,CB) \
static local bit m_register_cb_``CB = uvm_callbacks#(T,CB)::m_register_pair(`"T`",`"CB`");
//-----------------------------------------------------------------------------
// MACRO: `uvm_set_super_type
//
//| `uvm_set_super_type(T,ST)
//
// Defines the super type of ~T~ to be ~ST~. This allows for derived class
// objects to inherit typewide callbacks that are registered with the base
// class.
//
// The registration will typically occur in the component that executes the
// given type of callback. For instance:
//
//| virtual class mycb extend uvm_callback;
//| virtual function void doit();
//| endclass
//|
//| class my_comp extends uvm_component;
//| `uvm_register_cb(my_comp,mycb)
//| ...
//| task run_phase(uvm_phase phase);
//| ...
//| `uvm_do_callbacks(my_comp, mycb, doit())
//| endtask
//| endclass
//|
//| class my_derived_comp extends my_comp;
//| `uvm_set_super_type(my_derived_comp,my_comp)
//| ...
//| task run_phase(uvm_phase phase);
//| ...
//| `uvm_do_callbacks(my_comp, mycb, doit())
//| endtask
//| endclass
//-----------------------------------------------------------------------------
`define uvm_set_super_type(T,ST) \
static local bit m_register_``T``ST = uvm_derived_callbacks#(T,ST)::register_super_type(`"T`",`"ST`");
//-----------------------------------------------------------------------------
// MACRO: `uvm_do_callbacks
//
//| `uvm_do_callbacks(T,CB,METHOD)
//
// Calls the given ~METHOD~ of all callbacks of type ~CB~ registered with
// the calling object (i.e. ~this~ object), which is or is based on type ~T~.
//
// This macro executes all of the callbacks associated with the calling
// object (i.e. ~this~ object). The macro takes three arguments:
//
// - CB is the class type of the callback objects to execute. The class
// type must have a function signature that matches the METHOD argument.
//
// - T is the type associated with the callback. Typically, an instance
// of type T is passed as one the arguments in the ~METHOD~ call.
//
// - METHOD is the method call to invoke, with all required arguments as
// if they were invoked directly.
//
// For example, given the following callback class definition:
//
//| virtual class mycb extends uvm_cb;
//| pure function void my_function (mycomp comp, int addr, int data);
//| endclass
//
// A component would invoke the macro as
//
//| task mycomp::run_phase(uvm_phase phase);
//| int curr_addr, curr_data;
//| ...
//| `uvm_do_callbacks(mycb, mycomp, my_function(this, curr_addr, curr_data))
//| ...
//| endtask
//-----------------------------------------------------------------------------
`define uvm_do_callbacks(T,CB,METHOD) \
`uvm_do_obj_callbacks(T,CB,this,METHOD)
//-----------------------------------------------------------------------------
// MACRO: `uvm_do_obj_callbacks
//
//| `uvm_do_obj_callbacks(T,CB,OBJ,METHOD)
//
// Calls the given ~METHOD~ of all callbacks based on type ~CB~ registered with
// the given object, ~OBJ~, which is or is based on type ~T~.
//
// This macro is identical to <`uvm_do_callbacks> macro,
// but it has an additional ~OBJ~ argument to allow the specification of an
// external object to associate the callback with. For example, if the
// callbacks are being applied in a sequence, ~OBJ~ could be specified
// as the associated sequencer or parent sequence.
//
//| ...
//| `uvm_do_callbacks(mycb, mycomp, seqr, my_function(seqr, curr_addr, curr_data))
//| ...
//-----------------------------------------------------------------------------
`define uvm_do_obj_callbacks(T,CB,OBJ,METHOD) \
begin \
uvm_callback_iter#(T,CB) iter = new(OBJ); \
CB cb = iter.first(); \
while(cb != null) begin \
`uvm_cb_trace_noobj(cb,$sformatf(`"Executing callback method 'METHOD' for callback %s (CB) from %s (T)`",cb.get_name(), OBJ.get_full_name())) \
cb.METHOD; \
cb = iter.next(); \
end \
end
//-----------------------------------------------------------------------------
// MACRO: `uvm_do_callbacks_exit_on
//
//| `uvm_do_callbacks_exit_on(T,CB,METHOD,VAL)
//
// Calls the given ~METHOD~ of all callbacks of type ~CB~ registered with
// the calling object (i.e. ~this~ object), which is or is based on type ~T~,
// returning upon the first callback returning the bit value given by ~VAL~.
//
// This macro executes all of the callbacks associated with the calling
// object (i.e. ~this~ object). The macro takes three arguments:
//
// - CB is the class type of the callback objects to execute. The class
// type must have a function signature that matches the METHOD argument.
//
// - T is the type associated with the callback. Typically, an instance
// of type T is passed as one the arguments in the ~METHOD~ call.
//
// - METHOD is the method call to invoke, with all required arguments as
// if they were invoked directly.
//
// - VAL, if 1, says return upon the first callback invocation that
// returns 1. If 0, says return upon the first callback invocation that
// returns 0.
//
// For example, given the following callback class definition:
//
//| virtual class mycb extends uvm_cb;
//| pure function bit drop_trans (mycomp comp, my_trans trans);
//| endclass
//
// A component would invoke the macro as
//
//| task mycomp::run_phase(uvm_phase phase);
//| my_trans trans;
//| forever begin
//| get_port.get(trans);
//| if(do_callbacks(trans) == 0)
//| uvm_report_info("DROPPED",{"trans dropped: %s",trans.convert2string()});
//| else
//| // execute transaction
//| end
//| endtask
//| function bit do_callbacks(my_trans);
//| // Returns 0 if drop happens and 1 otherwise
//| `uvm_do_callbacks_exit_on(mycomp, mycb, extobj, drop_trans(this,trans), 1)
//| endfunction
//
// Because this macro calls ~return~, its use is restricted to implementations
// of functions that return a ~bit~ value, as in the above example.
//
//-----------------------------------------------------------------------------
`define uvm_do_callbacks_exit_on(T,CB,METHOD,VAL) \
`uvm_do_obj_callbacks_exit_on(T,CB,this,METHOD,VAL) \
//-----------------------------------------------------------------------------
// MACRO: `uvm_do_obj_callbacks_exit_on
//
//| `uvm_do_obj_callbacks_exit_on(T,CB,OBJ,METHOD,VAL)
//
// Calls the given ~METHOD~ of all callbacks of type ~CB~ registered with
// the given object ~OBJ~, which must be or be based on type ~T~, and returns
// upon the first callback that returns the bit value given by ~VAL~. It is
// exactly the same as the <`uvm_do_callbacks_exit_on> but has a specific
// object instance (instead of the implicit this instance) as the third
// argument.
//
//| ...
//| // Exit if a callback returns a 1
//| `uvm_do_callbacks_exit_on(mycomp, mycb, seqr, drop_trans(seqr,trans), 1)
//| ...
//
// Because this macro calls ~return~, its use is restricted to implementations
// of functions that return a ~bit~ value, as in the above example.
//-----------------------------------------------------------------------------
`define uvm_do_obj_callbacks_exit_on(T,CB,OBJ,METHOD,VAL) \
begin \
uvm_callback_iter#(T,CB) iter = new(OBJ); \
CB cb = iter.first(); \
while(cb != null) begin \
if (cb.METHOD == VAL) begin \
`uvm_cb_trace_noobj(cb,$sformatf(`"Executed callback method 'METHOD' for callback %s (CB) from %s (T) : returned value VAL (other callbacks will be ignored)`",cb.get_name(), OBJ.get_full_name())) \
return VAL; \
end \
`uvm_cb_trace_noobj(cb,$sformatf(`"Executed callback method 'METHOD' for callback %s (CB) from %s (T) : did not return value VAL`",cb.get_name(), OBJ.get_full_name())) \
cb = iter.next(); \
end \
return 1-VAL; \
end
// The +define+UVM_CB_TRACE_ON setting will instrument the uvm library to emit
// messages with message id UVMCB_TRC and UVM_NONE verbosity
// notifing add,delete and execution of uvm callbacks. The instrumentation is off by default.
`ifdef UVM_CB_TRACE_ON
`define uvm_cb_trace(OBJ,CB,OPER) \
begin \
string msg; \
msg = (OBJ == null) ? "null" : $sformatf("%s (%s@%0d)", \
OBJ.get_full_name(), OBJ.get_type_name(), OBJ.get_inst_id()); \
`uvm_info("UVMCB_TRC", $sformatf("%s: callback %s (%s@%0d) : to object %s", \
OPER, CB.get_name(), CB.get_type_name(), CB.get_inst_id(), msg), UVM_NONE) \
end
`define uvm_cb_trace_noobj(CB,OPER) \
begin \
if(uvm_callbacks_base::m_tracing) \
`uvm_info("UVMCB_TRC", $sformatf("%s : callback %s (%s@%0d)" , \
OPER, CB.get_name(), CB.get_type_name(), CB.get_inst_id()), UVM_NONE) \
end
`else
`define uvm_cb_trace_noobj(CB,OPER) /* null */
`define uvm_cb_trace(OBJ,CB,OPER) /* null */
`endif
`endif