You are on page 1of 19

Migrating from OVM (or UVM-1.

0ea) to
UVM-1.0
Product Version 10.2
May 6, 2011

Copyright Statement

2011 Cadence Design Systems, Inc. All rights reserved worldwide. Cadence and the
Cadence logo are registered trademarks of Cadence Design Systems, Inc. All others are the
property of their respective holders.

May 6, 2011

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0

Contents
Purpose ........................................................................................................................ 4
Audience ...................................................................................................................... 4
Migration process ......................................................................................................... 4
Specific Migration Issues ............................................................................................. 5
Phasing Changes ..................................................................................................... 5
Sequence Changes .................................................................................................. 7
Configuration .......................................................................................................... 10
Other migration issues ............................................................................................ 12
Summary .................................................................................................................... 12
References ................................................................................................................. 13
Appendix A: Deprecation Warning Mapping .............................................................. 13
Appendix B: Removed Deprecated Functionality ....................................................... 18
Removed global variables ...................................................................................... 18
Removed global functions ...................................................................................... 19
Removed classes ................................................................................................... 19
Removed class methods ........................................................................................ 19
Removed Macros ................................................................................................... 19

May 6, 2011

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0

Purpose
UVM-1.0 is the first standard release of UVM from Accellera. While UVM is based on
OVM and moving a verification environment from OVM to UVM is largely a matter of
replacing Os with Us, there are a number of things you must be aware of when
converting your environment:


Old, deprecated, OVM functionality was removed from UVM-1.0.

Some OVM functionality was kept but deprecated, especially in the area of
sequence libraries.

Configuration, field macros and phasing underwent significant architectural


changes in order to support new functionality which may affect OVM
environments.

The addition of runtime phases requires a new phasing semantic that is


inconsistent with the OVM run phase semantic.

This application notes describes the process for migrating an OVM (or UVM-1.0ea)
environment to use UVM-1.0.

Audience
This document is intended for OVM users who are ready to move their environment to
UVM-1.0. It is also applicable for users using UVM-1.0ea who are ready to move
forward to UVM-1.0.

Migration process
The basic process for moving an environment is provided below:
1. Convert Os to Us using the ovm2uvm.pl script at <uvm_home>/bin/ovm2uvm.pl.
For UVM-1.0ea users, this step is not needed.
2. Compile the environment, fixing old deprecated OVM functionality that was
removed from UVM-1.0 (and thus will not compile). Refer to the appendix
Removed Deprecated Functionality for a list of functionality that was removed
(the appendix also contains the expected replacement).
3. Run the simulation with the option +UVM_USE_OVM_RUN_SEMANTIC. This option will
allow the run phase to continue running past time 0 even without an objection
having been raised.

May 6, 2011

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0


4. Fix usage of deprecated functionality (warnings with the id UVM_DEPRECATED). Any
deprecated functionality where it is possible for the UVM library to produce a
warning will issue a UVM_DEPRECATED run-time warning.
a. Fix usage of the default sequence first (i.e. replace the set_config_string
of default_sequence to an appropriate
uvm_config_db#(uvm_object_wrapper::set). This will ensure that traffic is
still correctly generated before making other sequence library changes.
b. Remove usage of any other deprecated configuration variables (e.g.
count).
c. Remove usage of the string based sequence library
(`uvm_sequencer_utils, etc.).
5. Rerun the simulation with the define +define+UVM_NO_DEPRECATED. This will cause
the usage of any other deprecated functionality to produce a compile time error.

Specific Migration Issues


This section goes into detail about specific migration issues. Note that the migration of
the old deprecated OVM features is in the appendix Removed Deprecated Functionality
since this is not specific to UVM-1.0, although UVM-1.0 forces the issue by removing
the old deprecated functionality completely.

Phasing Changes
1. The phase implementation task/function prototypes have been changed to
include _phase in the name and to include the phase object as an argument. All
phase tasks/functions should be translated:
function void build();  function void build_phase(uvm_phase phase);
function void connect();  function void connect_phase(uvm_phase phase);
function void end_of_elaboration(); 
function void end_of_elaboration_phase(uvm_phase phase);
function void start_of_simulation(); 
function void start_of_simulation_phase(uvm_phase phase);
task run();  task run_phase(uvm_phase phase);
function void extract();  function void extract_phase(uvm_phase phase);
function void check();  function void check_phase(uvm_phase phase);
function void report();  function void report_phase(uvm_phase phase);

2. It is no longer legal to manually call the build phase function. This will now result
in a run-time warning. Any direct calls to <comp>.build() should be removed;
allow the phasing system to automatically call the build method. In UVM-1.0 a
direct call to build() will result in a deprecation message.

May 6, 2011

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0


function void mycomponent::build();
child1 = mychild::type_id::create(child1,this);
child1.build(); //just remove this direct call
endfunction

3. UVM-1.0 adds run time phases (phases that execut in parallel to the run phase).
These phases require user information in order to proceed forward. To facilitate
this, the uvm_objection mechanism is used as the way for a component to
indicate it has an objection to a phase moving forward. This is true for all task
based phases, including the run phase. This new UVM-1.0 semantic means that
a component somewhere in the environment must object to the run phase ending
during the first delta-cycle of the run phase; if no component objects to the run
phase ending, then the run phase will end at time 0. To get the old OVM style run
semantic where a global_stop_request() or mid-simulation raise/drop of the
ovm_test_done objection indicated the end of the run phase you must use the
+UVM_USE_OVM_RUN_SEMANTIC command line argument. This will cause the run
phase to use the old OVM style run semantic. You can also replace your
global_stop_request() code with an explicit raise/drop of the run phase objection.
For example:
//Old OVM code calling global stop request
task mytest::run();
#5000 global_stop_request();
endtask
//New UVM-1.0 code that will have an identical semantic
task mytest::run_phase(uvm_phase phase);
phase.raise_objection(this, Test objection for run phase);
#5000 phase.drop_objection(this, Test objection for run phase);
endtask

4. Associated with #3 above, sequences now have a starting_phase property


which the sequence can raise/drop objections on. For example:
class mysequence extends uvm_sequence#(myitem);
task pre_body;
if(starting_phase != null)
starting_phase.raise_objection(this, mysequence starting);
endtask
function void cleanup();
if(get_parent_seq() == null && starting_phase != null)
starting_phase.drop_objection(this, mysequence ending);
endfunction
task post_body;
cleanup();
endtask
function do_kill();
cleanup();
endfunction
task body;

endtask
endclass

May 6, 2011

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0


5. The stop mechanism, global_stop_request() and the uvm_component::stop()
callback are deprecated. The phase objections and the
uvm_component::phase_ready_to_end() callback may be used in a similar way
that the uvm_component::stop() callback was used in OVM. This means, if you are
setting enable_stop_interrupt to 1 in any component, you should change your
stop code to the run phase objection. If you need to do something specifically
when everyone is ready to stop run, you can use the
uvm_component::phase_ready_to_end() callback.
//Old OVM style stop mechanism
task mycomponent::run;
enable_stop_interrupt = 1;

enable_stop_interrupt = 0;
endtask
task stop (string ph_name);
wait(enable_stop_interrupt == 0);
endtask

//UVM-1.0 replacement using objection


task mycomponent::run_phase(uvm_phase phase);
phase.raise_objection(this, mycomponent active);

phase.drop_objection(this, mycomponent active);


endtask

Sequence Changes
In UVM-1.0 the name-based sequence library has been deprecated. The name based
sequence library has many deficiencies and Accellera has determined that it should not
be part of the standard. In UVM-2.0 a type-based sequence library is planned to be
released as part of the standard; it is currently available in an early access form as part
of the UVM-1.0 distribution.
The changes around sequence usage are for removing deprecated functionality. The
deprecated functionality is likely to be removed from UVM-2.0 (or similar release) and
therefore it is wise to remove deprecated usage as soon as possible. The deprecated
sequence features are all around the name-based sequence library, including, special
sequence/sequencer macros, simple/random/exhaustive predefined sequences and the
string based default sequence.
1. String based default sequence,
set_config_string(<inst>,default_sequence,<seq>)

is deprecated. Use run

phase specific default sequence:


Example:
set_config_string(seqr, default_sequence, myseq);
to
uvm_config_db#(uvm_object_wrapper)::set(this, seqr.run_phase,

May 6, 2011

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0


default_sequence, myseq::type_id::get());

NOTE: with the type based style you may provide a factory object as shown in the
example, or you may supply an explicit sequence instance using
uvm_config_db#(uvm_sequence_base)::set().
NOTE2: if you are using a generated string for the default sequence (for example,
getting a default sequence from the command line), you must convert the string to a
factory wrapper object using uvm_factory::find_by_name(). For example:
set_config_string(seqr, default_sequence, somestring_variable);
to
uvm_config_db#(uvm_object_wrapper)::set(this, seqr.run_phase,
default_sequence, factory.find_by_name(somestring_variable));

2. Setting the count config property, using uvm_config_int(<sequencer>, count,


<value>) will result in a deprecation warning. This variable is only used for
controlling the string-based default_sequence and the built-in random
sequence, so it can safely be removed if the alternative default sequence in 1 is
used (and random sequence is not being used). A count setting of 0 may be
safely removed because the uvm_random_sequence is no longer started by default
if the user does not specify a default sequence.
3. The simple, random and exhaustive sequences are deprecated. These
sequences are loaded in the string based sequence library with the macro
`uvm_update_sequence_lib_and_item (or the `uvm_update_sequence_lib) macro.
Removing this macro will remove the deprecation warnings. If a simple, random
or exhaustive sequence is needed, an object of the new uvm_sequence_library
type can be created; this is a sequence derivative which contains the simple,
random and exhaustive functionality.
4. The `uvm_sequence_utils macro, binding a specific sequence type to a specific
sequencer type is deprecated. This macro was used to set up the string based
sequence library for a particular sequencer type, but limited generic sequences
to be bound to a specific sequencer type. This macro should be replaced with
`uvm_object_utils (removing the sequencer type argument from the macro call).
The macro `uvm_add_to_seq_lib can be used to add a particular sequence type
to a specific sequence library type if this functionality is desired.
NOTE: if the sequence needs to be bound to a specific sequencer type for proper
operation (i.e. referring to the p_sequencer variable), then the macro
`uvm_declare_p_sequencer should be used in conjunction with
`uvm_object_utils to provide all of the necessary functionality to the sequence
type.

May 6, 2011

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0


5. The `uvm_sequencer_utils macro, setting up the string based sequence library
in a sequencer, is deprecated. This macro can be replaced with
`uvm_component_utils for basic component functionality.
6. The messaging facility, uvm_report_info/warning/error/fatal have been added
into the uvm_sequence_item class so that the report macros may be used directly
in sequences; it is no longer necessary to refer to the m_sequencer/p_sequencer
to send a message.
Below is a simple migration example which replaces all of the functionality with the new
sequence library, etc. If the sequence library functionality is not required then it can be
left out.

May 6, 2011

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0


UVM-1.0EA (OVM)

UVM-1.0

class myitem extends uvm_sequence_item;


function new(string name=myitem);
super.new(name);
endfunction
`uvm_object_utils(myitem)
endclass

class myitem extends uvm_sequence_item;


function new(string name=myitem);
super.new(name);
endfunction
`uvm_object_utils(myitem)
endclass

typedef class myseqr;

typedef class myseqr;


typedef uvm_sequence_library#(myitem) myseq_lib;

class myseq extends uvm_sequence#(myitem);


`uvm_sequence_utils(myseq,myseqr)

task body;
myitem item;
for(int i=0; i<p_sequencer.cnt; ++i)begin
p_sequencer.uvm_report_info(SEND,
$sformatf(Sending item: %s,
item.sprint()), UVM_MEDIUM);
`uvm_do(item)
end
endtask
endclass

class myseq extends uvm_sequence#(myitem);


`uvm_object_utils(myseq)
`uvm_declare_p_sequencer(myseqr)
`uvm_add_to_seq_lib(myseq, myseq_lib)
task body;
myitem item;
for(int i=0; i<p_sequencer.cnt; ++i)begin
`uvm_info(SEND,
$sformatf(Sending item: %s,
item.sprint()), UVM_MEDIUM)
`uvm_do(item)
end
endtask
endclass

class myseqr extends uvm_sequencer#(myitem);


`uvm_sequencer_utils(myseqr)
function new(string name,
uvm_component parent);
super.new(name,parent);
`uvm_update_sequence_lib_and_item(myitem)
//or `uvm_update_sequence_lib
endfunction
rand int cnt = 10;
endclass

class myseqr extends uvm_sequencer#(myitem);


`uvm_component_utils(myseqr)
function new(string name,
uvm_component parent);
super.new(name,parent);
endfunction
rand int cnt = 10;
endclass

class test extends uvm_component;

function void build;


super.build();
set_config_string(agent.seqr,
default_sequence,
uvm_exhaustive_sequence);

endfunction
endclass

class test extends uvm_component;

function void build_phase(uvm_phase phase);


super.build_phase(phase);
myseq_lib slib =
myseq_lib::type_id::create(slib,this);
slib.selection_mode =
UVM_SEQ_LIB_RANDC;
void(slib.randomize());
uvm_config_seq::set(this,
agent.seqr.run_phase,
default_sequence, slib);

endfunction
endclass

Configuration
The configuration database from OVM was re-architected to provide a more general
purpose system, referred to in UVM as the resource database. This database is a typebased system. The old OVM style access to the database through the set_config_*
and get_config_* interface is still available. However, the resource database provides a
type based system that may be used for storing and retrieving any object type, such as

May 6, 2011

10

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0


virtual interfaces or configuration objects. One thing to be careful of is to ensure that the
type used for a set operation is identical to the type that will be used by the get
operation. For example, if a component uses get_config_int() to access an integral
configuration property, then a setter should use set_config_int, or the equivalent
uvm_config_db#(uvm_bitstream_t)::set().
NOTE: due to the rearchitecture of the configuration system, some issues have been
found with respect to auto-configuration, especially in the use of wildcarded fields. It is a
good practice (primarily for performance, but also for consistent semantics) to remove
wildcard fields if possible (wildcard instances are fine to use). For example:
Instead of:
set_config_int(myinst.*, val*, 10);
Do
set_config_int(myinst.*, value, 10);
set_config_int(myinst.*, value1,10);
The resource database has three layers: the lowest level layer it the uvm_resource_pool
where you work directly on queues of resources and resource containers, the middle
layer uvm_resource_db which provides more convenient user access to values in
resource containers, and the configuration layer uvm_config_db which provides the
hierarchical configuration consistent with the OVM style configuration.
For the purposes of migration, the uvm_config_db layer is most often what should be
used. The uvm_resource_db layer would be used for those situations where there is
no hierarchical context for the resource that is being used (i.e. it is a global resource
that can be used from anywhere in the verification environment).
While it is not necessary to replace set/get_config calls, it may be desirable to do so for
consistency. Below are examples of how set/get_config calls can be replaced (note that
the type shown in red is the type that would be used if the get side is using autoconfiguration):
From set_config_int(myinst.*,val,10);
get_cofnig_int(val,value);
To
- uvm_config_db#(int)::set(this,myinst.*,val,10);
uvm_config_db#(int)::get(this,,val,value);
or
- uvm_config_db#(uvm_bitstream_t)::set(this,myinst.*,val,10);
uvm_config_db#(uvm_bitstream_t)::get(this,,val,value);
From set_config_string(myinst.*,val,someval);
get_config_string(this,,val,value);
To
- uvm_config_db#(string)::set(this,myinst.*,val,someval);
uvm_config_db#(string)::get(this,,val,value);

May 6, 2011

11

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0


From set_config_object(myinst.*,val,myobj);
get_config_object(val,tmp); $cast(myobj,tmp);
To
- uvm_config_db#(myobj_type)::set(this,myinst.*,val,myobj);
uvm_config_db#(myobj_type)::get(this,,val,myobj);
uvm_config_db#(uvm_object)::set(this,myinst.*,val,myobj);
uvm_config_db#(uvm_object)::get(this,,val,tmp); $cast(myobj,tmp);

Other migration issues


This section lists some additional differences between UVM-1.0 and OVM/UVM-1.0ea.
These differences may affect some environments, but in general should not affect
users.
1. The global variable uvm_top_levels was moved into the uvm_root class as a
static variable. Any code which directly references uvm_top_levels will need to
instead reference uvm_root::top_levels.
2. The class uvm_report_global_server is deprecated and the class
uvm_report_server is now a proper singleton object. The variable
uvm_report_global_server::server no longer exists (this was not intended to
be user accessible but was unprotected because SystemVerilog does not have
friend classes). Access to the report server should be done by calling
uvm_report_server::get_server().
3. The uvm_printer class table printer was changed to auto-size the table
columns. Because of this change, many of the formatting options for the table
printer are now ignored.
4. In OVM, the default phase timeout (ovm_root::phase_timeout) was set to 0 which
caused a timeout of `OVM_DEFAULT_TIMEOUT-$time. In UVM the default phase
timeout is set to `UVM_DEFAULT_TIMEOUT. In some cases, this change may cause a
simulation time overflow or a situation where the timeout time is incorrect for your
needs. The `UVM_DEFAULT_TIMEOUT can be set via the command line as
+define+UVM_DEFAULT_TIMEOUT=0 (or whatever is appropriate) for the specific
circumstances.

Summary
UVM-1.0 provides a standardized methodology library. OVM users have a significant
advantage in moving to this library as opposed to user of other available methodology
libraries. However, there are differences between OVM and UVM-1.0 that users must
account for when making the move. This application note provids the process for

May 6, 2011

12

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0


migration of an OVM (or UVM-1.0ea) environment to UVM-1.0 as well as detailed
information on the most significant migration issues.

References

<ovm_home>/deprecated.txt deprecation list from an OVM-2.1.1 installation.

<uvm_home>/release_notes.txt release notes from a UVM-1.0 installation.

<uvm_home>/docs/uvm_ref_guide_1.0.pdf UVM-1.0 Library Reference from a


UVM-1.0 installation.

Appendix A: Deprecation Warning Mapping


This appendix maps specific deprecation warnings back to the specific functionality that
has been removed (in some cases it is not obvious how a particular deprecation
warning maps back to a user visible feature).
Message: build()/build_phase() has been called explicitly, outside of the
phasing system. This usage of build is deprecated and may lead to unexpected
behavior."

Reason: The build method is explicitly being called by the parent component.
Example:
function void mycomponent::build();
child = subcomponent::type_id::create(child, this);
child.build();
endfunction

Resolution: Remove the explicit call to build. The phasing system will call
build/build_phase() for all components, so the explicit call is unnecessary.
Message: uvm_pkg::uvm_sequence_base.get_seq_kind deprecated."
Reason: The get_seq_kind() method is the method that the old string-based sequence
library used to convert the sequence name string into an integer that could be used for
constraints.
Example:
constraint myseq::no_rand_seq_ct {
seq_kind != get_seq_kind(uvm_random_sequence);
}

May 6, 2011

13

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0


Resolution: Create a uvm_sequence_library type with the characteristics that you
desire (including constraints on selection of sequence kinds).
Message: uvm_pkg::uvm_sequence_base.get_sequence deprecated."
Reason: The get_sequence() method is the method that the old string-based sequence
library used to convert the sequence id (often obtained using get_seq_kind())into an
actual sequence object.
Example:
task myseq::body();
uvm_sequence_base s;
s = get_sequence(get_seq_kind(myseq));
s.start();

endtask

Resolution: The example sequence above would best be converted to a


uvm_sequence_library type of sequence. The method
uvm_sequence_library::get_sequences() provides access to the sequences associated
with the library, and can be used to search for a particular type of sequence to create it.
Message: uvm_pkg::uvm_sequence_base.do_sequence_kind deprecated."
Reason: The do_sequence_kind() method is the method that the old string-based
sequence library used to start a sequence of a kind given by the kind id.
Example:
task myseq::body();
uvm_sequence_base s;
s = do_sequence_kind(get_seq_kind(myseq));

endtask

Resolution: The example sequence above would best be converted to a


uvm_sequence_library type of sequence. The method
uvm_sequence_library::get_sequences() provides access to the sequences associated
with the library, and can be used to search for a particular type of sequence to create it.
Message: uvm_pkg::uvm_sequence_base.get_sequence_by_name deprecated."
Reason: The get_sequence_by_name() method is the method that the old string-based
sequence library used to convert the string into an actual sequence object (basically
doing get_sequence(get_seq_kind())).
Example:
task myseq::body();

May 6, 2011

14

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0


uvm_sequence_base s;
s = get_sequence_by_name(myseq);
s.start();

endtask

Resolution: The example sequence above would best be converted to a


uvm_sequence_library type of sequence. The method
uvm_sequence_library::get_sequences() provides access to the sequences associated
with the library, and can be used to search for a particular type of sequence to create it.
Message: uvm_pkg::uvm_sequence_base.create_and_start_sequence_by_name
deprecated."
Reason: The create_and_start_sequence_by_name() method is the method that the
old string-based sequence library used to convert the string into an actual sequence
object and then start the sequence.
Example:
task myseq::body();
uvm_sequence_base s;
s = create_and_start_sequence_by_name(myseq);

endtask

Resolution: The example sequence above would best be converted to a


uvm_sequence_library type of sequence. The method
uvm_sequence_library::get_sequences() provides access to the sequences associated
with the library, and can be used to search for a particular type of sequence to create it.
Message: count config parameter is deprecated and not part of the UVM
standard"
Reason: The count configuration parameter was used in a set_config_int call in order to
turn off the default sequence (setting to 0) or control the number of iterations of the
uvm_random_sequence (the old default sequence if no user default sequence was set).
Example:
function void mytest::build();
set_config_int(agent.seqr, count, 0);

endfunction

Resolution: If the count variable was being set to 0 then the set_config_int call may be
safely removed because the uvm_random_sequence is no longer started by default for
the run phase. If a non-zero count was being used to control the random sequence, a
sequence library object should be used; the sequence library object can be set as the
run phases default sequence with an appropriate setting for the number of iterations.

May 6, 2011

15

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0


Message: count config parameter is deprecated and not part of the UVM
standard"
Reason: The max_random_count configuration parameter was used in a set_config_int
call in order control the number of iterations of the uvm_random_sequence (the old
default sequence if no user default sequence was set).
Example:
function void mytest::build();
set_config_int(agent.seqr, max_random_count, 10);

endfunction

Resolution: A sequence library object should be used to generate the random


sequence; the sequence library object can be set as the run phases default sequence
with an appropriate setting for the number of iterations.
Message: max_random_depth config parameter is deprecated and not part of the
UVM standard"
Reason: The max_random_depth configuration parameter was used in a set_config_int
call in order control the maximum sequence depth when uvm_random_sequence is
being used (e.g. the number of times that a random sequence is itself allowed to create
a uvm_random_sequence as a sub sequence).
Example:
function void mytest::build();
set_config_int(agent.seqr, max_random_depth, 3);

endfunction

Resolution: A sequence library object should be used to generate the random


sequence; the sequence library object can be set as the run phases default sequence
with an appropriate settings to contain the subsequence depth.
Message: pound_zero_count was set but ignored. Sequencer/driver
synchronization now uses 'uvm_wait_for_nba_region'

Reason: The pound_zero_count was used in OVM/UVM-1.0ea to add delta cycles for
the try_get_next_item() to allow for delta cycle delays in the sequencer. However, this
type of delaying is inherently unstable. UVM-1.0 moved to a full NBA region delay
(essentially an infinite #0 delay) for the synchronization to provide better controllability.
Example:
function void mytest::build();
set_config_int(agent.seqr, pound_zero_count, 100);

May 6, 2011

16

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0


endfunction

Resolution: #0 delays are inherently unstable. UVM-1.0 moved to a full NBA region
delay (essentially an infinite #0 delay) for the synchronization to provide better
controllability. For this reason, settings of the pound_zero_delay property can safely be
removed.
Message:
Registering sequence 'uvm_exhaustive_sequence' with sequencer
'<some_seqr_name>' is deprecated.
Registering sequence 'uvm_random_sequence' with sequencer '<some_seqr_name>'
is deprecated.
Reason: The macro `uvm_update_sequence_lib or
`uvm_update_sequence_lib_and_item was used to set

up a string based sequence


library in the sequencer constructor of the <some_seqr_name> type.
Example:
function myseqr::new(string name, uvm_component parent);
super.new(name,parent);
`uvm_update_sequence_lib

endfunction

Resolution: Remove the `uvm_update_sequence_lib (or


`uvm_update_sequence_lib_and_item) macro calls. If a sequence library object is
created then it will have a typewide sequence queue that may need to be updated.
Message: Registering sequence 'uvm_simple_sequence' with sequencer
'<some_seqr_name>' is deprecated.
Reason: The macro `uvm_update_sequence_lib_and_item was used to set up a string
based sequence library in the sequencer constructor of the <some_seqr_name> type.
The _and_item variant sets up the uvm_simple_sequence which just generates an item.
Example:
function myseqr::new(string name, uvm_component parent);
super.new(name,parent);
`uvm_update_sequence_lib_and_item(myitem)

endfunction

Resolution: Remove the `uvm_update_sequence_lib_and_item macro calls. If a


sequence library object is created then it will have a typewide sequence queue that may
need to be updated.

May 6, 2011

17

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0


Message: Registering sequence '<some_seq_type>' with sequencer
'<some_seqr_name>' is deprecated.
Reason: The macro `uvm_sequence_utils or the function add_sequence() was called
on a sequencer to add a user sequence to the string-based sequence library.
Example:
class mysequence extends uvm_sequence#(myitem);
`uvm_sequence_utils(mysequence, myseqr)

endclass

Resolution: Replace the `uvm_seqence_utils with `uvm_object_utils. If a


uvm_sequence_library was created then a `uvm_add_to_seq_lib macro will need to be
used in the sequence type to add the sequence type to the sequence library type.
Message: Starting (deprecated) default sequence '<some_seq_type>' on
sequencer '<some_sequencer>'
Reason: The string configuration property default_sequence was used on a
sequencer to start a default sequence from the string-based sequence library.
Example:
function void mytest::build();
set_config_string(agent.seqr, default_sequence, my_seq);

endfunction

Resolution: Change the use of the string based default_sequence to use the
uvm_config_db to set a type based default sequence for the run phase. For example:
function void mytest::build();
uvm_config_db#(uvm_object_wrapper)::set(this, agent.seqr.run_phase,
default_sequence, my_seq::type_id::get());

endfunction

Appendix B: Removed Deprecated Functionality


Removed global variables

ovm_test_top (removed)
ovm_top_levels (moved to uvm_root::top_levels)

May 6, 2011

18

Product Version 10.2

Migrating from OVM (or UVM-1.0ea) to UVM-1.0

post_new_ph (removed)
export_connections_ph (removed)
import_connections_ph (removed)
configure_ph (removed)
_global_reporter (removed, use uvm_report_server::get_server())

Removed global functions

ovm_find_component (replaced by uvm_top.find())


avm_report_message/warning/error/fatal (removed)

Removed classes

ovm_threaded_component (replaced by uvm_component)

Removed class methods

ovm_object::do_sprint (use the ovm_object::do_print() method)


ovm_root::print_topology (replaced by uvm_top.print())
ovm_root::print_unit_list (manual traversal)
ovm_root::print_unit (uvm_component::print())
ovm_root::print_units (uvm_root::find/uvm_component::print)
ovm_env::do_test (removed)
ovm_env::do_task_phase (removed)
ovm_env::run (removed)
ovm_report_object::avm_report_message/warning/error/fatal (removed)
ovm_sequence_item::set/get_parent_seq (replaced by
uvm_sequence_item::get/set_parent_sequence)
ovm_sequencer_base::start_sequence (replaced by ovm_sequencer_base::start())

Removed Macros

`OVM_REPORT_INFO/WARNING/ERROR/FATAL (replaced by
`uvm_info/warning/error/fatal)

May 6, 2011

19

Product Version 10.2

You might also like