Hi All,
→ I have created parameterized callback class(ijtag_driver_callback#(int IJTAG_WIDTH = 396)) which is extended from the uvm_callback.
In my driver class, I have registered callback class with `uvm_register_cb macro as below.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class ijtag_driver_callback#(int IJTAG_WIDTH = 396) extends uvm_callback;
…
…
`uvm_object_param_utils(ijtag_driver_callback#(IJTAG_WIDTH))
…
…
endclass : ijtag_driver_callback
class ijtag_receiver_driver#(int IJTAG_WIDTH = 396) extends uvm_driver #(ijtag_receiver_trans#(IJTAG_WIDTH));
…
…
uvm_component_param_utils(ijtag_receiver_driver#(IJTAG_WIDTH)) **
uvm_register_cb(ijtag_receiver_driver#(IJTAG_WIDTH),ijtag_driver_callback#(IJTAG_WIDTH))**
…
…
endclass : ijtag_receiver_driver
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Getting compilation error: Here, ijtag_driver_callback#(IJTAG_WIDTH) is appended to “m_register_cb_``CB” and define name as,
static local bit m_register_cb_ijtag_driver_callback#(IJTAG_WIDTH)
Below is the error description,
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
#0, uvm_register_cb(T=ijtag_receiver_driver#(IJTAG_WIDTH), CB=ijtag_driver_callback#(IJTAG_WIDTH)) : “/tools/vcs/2016.06-SP2/etc/uvm-1.1/macros/uvm_callback_defines.svh”:60
full expansion of macro (uvm_register_cb), error at line 1
=>static local bit m_register_cb_ijtag_driver_callback#(IJTAG_WIDTH) = uvm_callbacks#(ijtag_receiver_driver#(IJTAG_WIDTH),ijtag_driver_callback#(IJTAG_WIDTH))::m_register_pair(“ijtag_receiver_driver#(IJTAG_WIDTH)”,“ijtag_driver_callback#(IJTAG_WIDTH)”);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
→ When I have made following modification in my code, calling the m_register_pair function directly without using uvm_register_cb macro. It is working as expected. ////////////////////////////////////////////////////////////////////////////////////////////////////////////// class ijtag_driver_callback#(int IJTAG_WIDTH = 396) extends uvm_callback; ... ...
uvm_object_param_utils(ijtag_driver_callback#(IJTAG_WIDTH))
…
…
endclass : ijtag_driver_callback
class ijtag_receiver_driver#(int IJTAG_WIDTH = 396) extends uvm_driver #(ijtag_receiver_trans#(IJTAG_WIDTH));
…
…
`uvm_component_param_utils(ijtag_receiver_driver#(IJTAG_WIDTH))
static local bit m_register_cb_ijtag_driver_callback = uvm_callbacks#(ijtag_receiver_driver#(IJTAG_WIDTH),ijtag_driver_callback#(IJTAG_WIDTH))::m_register_pair("ijtag_receiver_driver#(IJTAG_WIDTH)
“,"ijtag_driver_callback#(IJTAG_WIDTH)
”);
…
…
endclass : ijtag_receiver_driver
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
I wanted to know that, do we have any other way to register parameterized callback class. Or if it is the only way to register with `uvm_register_cb then I think so it is creating the problem with parameterized callback class.
Please provide your thought on this.
Thanks,
Shrujal