In p.433 of the UVM class reference manaul, sequence.kill() refers to a sequencer.unregister_sequence() method.
Where is the unregister_sequence() method? It is not in the sequencer API?
Horace
In p.433 of the UVM class reference manaul, sequence.kill() refers to a sequencer.unregister_sequence() method.
Where is the unregister_sequence() method? It is not in the sequencer API?
Horace
Hi,
In UVM 1.2, the UVM event class is declared as follows:
How can the uvm_event be parameterized to a non uvm_object? There is no casting done in the trigger function. Lets say that I tried following:
class uvm_object_extend extends uvm_object;
...
endclass
uvm_event#(uvm_object_extend ) my_event;
My compiler generates and error indicating that in the trigger function, the assignment of:
I'm trying to use the new get_starting_phase() mechanism in UVM1.2, but it's not working for me.
For UVM1.1, I have the following working fine:
task pre_body();
if (starting_phase != null)
starting_phase.raise_objection( this, get_type_name() );
endtask
In UVM1.2 RC8, I add:
task pre_body();
uvm_phase phase = get_starting_phase();
if (starting_phase != null)
starting_phase.raise_objection( this, get_type_name() );
endtask
This just doesn't work. get_starting_phase() returns null everytime and the objection is never raised so the simulation immediately ends.
Attached is a simple testcase - in UVM1.1 the sequence successfully waits for 20ns, but after adding get_starting_phase(), in UVM1.2 RC8 the simulation ends immediately.
Have I misunderstood how get_starting_phase is suposed to work?
I've found a use for set_int_local and noticed that it does not work with dynamic arrays or queues.
Issue can be demonstrated with this code: https://www.edaplayground.com/x/6B8e
The problem appears to be on the first line of this code block:
else if(uvm_is_match(str__, {__m_uvm_status_container.scope.get_arg(),$sformatf("[%0d]", index__)})) begin \ if(index__+1 > ARG.size()) begin \ int sz = index__; \ int tmp__; \ `M_UVM_``TYPE``_RESIZE(ARG,tmp__) \ end \ if (__m_uvm_status_container.print_matches) \ uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \ ARG[index__] = uvm_object::__m_uvm_status_container.bitstream; \ __m_uvm_status_container.status = 1; \ end \
At this line, str__ is set to "cfg.arr_var[0]", this:
{__m_uvm_status_container.scope.get_arg(),$sformatf("[%0d]", index__)}
evaluates only to "arr_var[0]", hence the match does not succeed. I believe that the code would be correct if it used get() instead of get_arg().
Hi. I would like to confirm if the class type uvm_test_done_objection is deprecated in IEEE 1.2 release or in future releases.
in Accellera uvm.1.2
//------------------------------------------------------------------------------
//
// Class- uvm_test_done_objection DEPRECATED
//
// Provides built-in end-of-test coordination
//------------------------------------------------------------------------------
class uvm_test_done_objection extends uvm_objection;
But in the other source code, i see it is still being used.
Thanks
Best Regards
Hi,
As I read the code in uvm-1.2 package, the type override lookup (by uvm_default_factory::find_override_by_type()) seems to be done every time a new UVM object is created.
This really hurts performance because object creation happens most frequently in a UVM environment.
My idea is: The implementation needs to be changed so that the type override info is put inside each object proxy, instead of a factory's queue (m_type_overrides). When set_type_override_by_type() is called, it sets the override info for every affected object proxy. So when a new object is created, we just use the override info already available inside its proxy to do creation and no more type override lookup needed. The call of set_type_override_by_type() should happen much much less frequently than object creation, I believe.
The override info for each object proxy should have 2 element as below:
so that when set_type_override_by_type() is called, we can traverse all the affected types regardless of the calling order of multiple calls of set_type_override_by_type(). For example:
then finally C must override A regardless of 1. or 2. being executed first.
Best regards,
Thien