UVM 1. 2 Release Notes | |
General Overview | This is release 1.2 of the Universal Verification Methodology (UVM) reference implementation from Accellera. |
What’s Changed | Release 1.2 contains enhancements and fixes to errata. |
1. 1 to 1. 2 Migration Script | Many of the backwards compatibility concerns caused when transitioning from UVM version 1.1 to 1.2 can be addressed with a reasonably simple search-and-replace in user code. |
Mantis 3407 (+) | uvm_event should be a parameterized class |
Mantis 3472 (*) | Deprecate get_config/set_config interface for configuration |
Backwards Compatibility | Care must be taken when switching from set_config_object and get_config_object to uvm_config_object, as the clone functionality of the old API no longer exists. |
Mantis 3557 | ref guide doesn’t show names of UVM runtime phases |
Mantis 3586 (+) | UVM_DISABLE_AUTO_ITEM_RECORDING should be a run_time option |
Mantis 3693 (+) | Setting enum values by name from command line doesn’t work |
Mantis 3741 (+) | Phase’s default sequence should also have get_config string support |
Mantis 3783 | Remove all $display calls from BCL, except report_server |
Mantis 3887 (*) | request facility to identify unused factory overrides |
Backwards Compatibility: | The undocumented uvm_pkg::factory variable has been removed, as it was unsafe during static initialization, and incompatible with the uvm_coreservice_t class. |
Mantis 3893 (+) | Feature request to create a non-hierarchical objection |
Mantis 3901 | Feature request to prevent objection from throwing decrement-below-zero error if the count is 0 |
Mantis 4032 (+) | Not possible to undo a factory override. |
Mantis 4091 | bug in the get_full_name method of uvm_reg_file. |
Mantis 4160 | uvm_comparer not using verbosity setting for print_msg() |
Mantis 4181 (+) | transaction order unclear and cant be changed when bus/reg size differ |
Mantis 4253 | Volatile fields should always need updating |
Mantis 4269 (*) | Add UVM_ prefix to enumerated values |
Backawards Compatibility | References to the values within uvm_sequence_state_enum and uvm_sequencer_arb_mode must now be prefixed with UVM_. |
Mantis 4306 | Bad reference to “record_field_int” in reference guide |
Mantis 4307 | Bad reference to “DEC” in reference guide |
Mantis 4366 (+) | uvm_sequence_library documentation missing from html documentation |
Mantis 4378 | Documentation of uvm_component::set_inst_override_by_type() incorrectly documents uvm_factory::set_inst_override_by_type() |
Mantis 4382 (+) | some symbols in uvm_radix_enum undocumented |
Mantis 4389 (+) | Deprecate hierarchical propagation of objections; add mode bit in interim |
Mantis 4391 | Redundant code in uvm_port_base |
Mantis 4416 (*) | Remove the confusing uvm_severity type |
Backwards Compatibility | This change should have minimal effect on user code, as the old type was simply deprecated, as opposed to removed. |
Mantis 4418 | set_report_verbosity doc unclear about setting value or threshold |
Mantis 4425 | BUSY flag not cleared when register model is reset |
Mantis 4430 (+) | Refactor start_phase_sequence logic to be able to kill sequence on phase ending |
Backwards Compatibility | While technically acting different than the previous implementation, it is unlikely that this will result in any backwards incompatibility challenges, as the old mechanism simply terminated the process which launched the default_sequence, resulting in a “zombie” sequence. |
Mantis 4431 (*)(+) | Enhance uvm_sequence::starting_phase |
Backwards Compatibility | This change could potentially effect users, as references to the uvm_sequence_base::starting_phase variable will now miscompile. |
Mantis 4432 (+) | Provide auto-object-to-phase in uvm_sequence_base |
Mantis 4433 (*) | Clean up the number of objections created by phasing |
Backwards Compatibility | While technically acting different than the previous implementation, it is unlikely that this will result in any backwards incompatibility challenges. |
Mantis 4434 (+) | Provide get_objection_count in uvm_phase |
Mantis 4439 (+) | seq_item_port.put_response is not documented |
Mantis 4440 | jump logic too early in phase state pipeline |
Mantis 4469 (+) | Provide schedule introspection via get_predecessor/successor_nodes |
Mantis 4476 (+) | uvm_sequence fields req/rsp are not documented |
Mantis 4488 (+) | sequencer_base should throw error if user allows wait_for_relevant to return while is_relevant=0 |
Mantis 4513 (+) | Add uvm_mem_mam_policy allocator to uvm_vreg::allocate() |
Mantis 4516 (*) | Remove the unnecessary over-prioritization of uvm_sequence_base in default_sequence |
Backwards Compatibility | While technically acting different than the previous implementation, it is unlikely that this will result in any backwards incompatibility challenges. |
Mantis 4517 (+) | Add phase-transition callbacks |
Mantis 4518 (*)(+) | Make UVM_OBJECT_MUST_HAVE_CONSTRUCTOR the default behavior |
Why uvm_object constructors are now mandatory | The UVM recommends that the following constructor be specified for any class extended from uvm_object: |
Backwards Compatibility | In UVM 1.2, the UVM object factory now requires that uvm_object have a constructor with a name argument. |
Code migration script | Suitable constructors may be automatically added to classes that are missing them by using the add_uvm_object_new.pl script. |
Migrating code using UVM 1.2 | To ease the process of migrating code to UVM 1.2, the old (incorrect) behavior remain available. |
What will happen in UVM 1.3? | In UVM 1.3, the UVM object factory will have the corrected behavior ONLY. |
Mantis 4519 (+) | Enable all flavors of phase jumping |
Mantis 4532 | uvm_reg_access_seq ignoring regs with one RO field |
Mantis 4533 | initialized memory on DPI side may survive reset and will cause bad behaviour |
Mantis 4542 | uvm_test_done should be made “const” |
Backwards Compatibility | The uvm_test_done variable is not part of the UVM standard, but may have been used by users coming from the OVM. |
Mantis 4550 | are uvm tlm connections with non-uvm_object a legal/supported use model? |
Mantis 4553 (+) | Infinite recursion in uvm_reg_field::get_access |
Mantis 4548 | cleanup static dpi issues |
Mantis 4566 | comparer.show_max can cause check to pass when length mismatches |
Mantis 4567 | uvm_reg::do_predict ignoring UVM_NOT_OK |
Mantis 4570 (*)(+) | Messaging System Revamp |
Backwards Compatibility | The uvm_report_server::process_report and uvm_report_server::compose_message methods have been replaced by the object-based uvm_report_server::execute_report_message and uvm_report_server::compose_report_message methods. |
Migrating code using UVM 1.2 | To ease the process of migrating code to UVM 1.2, the old behavior remains available to the user. |
Mantis 4572 | packing/unpacking issues |
Mantis 4587 | Bugs in UVM 1.1-c: uvm_reg_tlm_adapter::reg2bus() |
Mantis 4588 | in-built sequence is not equipped to exclude a block from the test sequence |
Mantis 4590 | update uvm_hdl.c to allow VCS/IUS to perform backdoor access to VHDL |
Mantis 4606 | uvm_report_server is not really extendable/chainable |
Backwards Compatibility | If users had previously extended uvm_report_server, then their code will likely no longer compile because they are not fully implementing the pure virtual interface which the report server now provides. |
Mantis 4617 | uvm_report_cb::add_by_name example needs review |
Mantis 4618 (*) | resource lookup broken/undefined when fieldname has wildcards |
Backwards Compatibility | The previous behavior for meta characters within the field name was not fully defined. |
Mantis 4621 | printing of int fields will mask Z values with X |
Mantis 4622 | uvm_phase::unsync() does not work |
Mantis 4643 | uvm_dpi_get_next_arg_c doesnt fully adhere to -1800-lrm |
Mantis 4649 (+)(*) | Improve memory performance of ‘bitstream’ interfaces for report/record/etc. |
Backwards Compatibility | In order to provide a consistent API, the uvm_printer::print_int method was deprecated and replaced by uvm_printer::print_field_int. |
Mantis 4666 | uvm_config_db::set expects to be invoked in process context |
Mantis 4677 | remove uvm_global_copy_map |
Mantis 4686 (+) | predict updated not just the mirrored field |
Mantis 4690 | Typo in uvm_sequence_base.vh (mehod should be method) |
Mantis 4711 | uvm macros violate 1800lrm iterator requirements |
Mantis 4731 | Static initialization races |
Mantis 4732 (+) | uvm_phase_state initializes to incorrect value |
Mantis 4734 | Bug in uvm_reg_map::get_size(); |
Mantis 4738 | DPI Code does not use UVM Messaging |
Mantis 4743 (+) | Promote get_next_item, try_next_item, item_done, get, peek, and put to be a part of the standard |
Mantis 4744 (*)(+) | Recording System Revamp |
Backwards Compatibility | The changes made to the uvm_recorder API were primarily isolated to undocumented and non-standardized methods within uvm_recorder class. |
Mantis 4766 (*) | Fix broken `uvm_record_field + `uvm_record_attribute interaction |
Backwards Compatibility | Vendors which had provided an implementation of the `uvm_record_attribute macro need to add an implementation of uvm_recorder::use_record_attribute in their recorders to allow compatibility with the new macro implementation. |
Mantis 4767 (+) | `uvm_pack_int and `uvm_unpack_int bypass the uvm_packer policy methods |
Mantis 4772 | separate uvm_hdl* source into files-by-vendor |
Mantis 4783 (*) | `uvm_record_* macros bypass uvm_recorder policy class |
Backwards Compatibility | The changes to the macros should be transparent to most end users, however developers which were supporting the old undocumented macros may need to update their implementations. |
Mantis 4786 (+) | print_real is undocumented |
Mantis 4784 (+) | `uvm_record_int/string/time/real are undocumented |
Mantis 4861 | Adding a uvm_reg_map to an existing regmap instance required both maps to have the same parent. |
Mantis 4871 | Fixed a problem wherein multiple +uvm_set_* commands were ignored after a format error. |
Mantis 4882 | The instance name of the phase objection was changed to reflect the name of the phase. |
Mantis 4884 | A performance fix was implemented which avoided the copy of large QDA within the spell checker. |
Mantis 4893 | Fixed a bug within uvm_leaf_scope which could lead to stall of simulation. |
Mantis 4920 | Fixed random stability bug in lookup_name which caused instability when the config database was queried. |
Mantis 4923 | A check was added for an out-of-bound queue access in uvm_misc.svh. |
Mantis 4925 | The macros `UVM_MAX_STREAMBITS, `UVM_PACKER_MAX_BYTES and `UVM_DEFAULT_TIMEOUT were relocated to src/macros/uvm_global_defines.svh, which is included via uvm_macros.svh. |
Mantis 4931 | Various typos and bad links within the reference guide were corrected. |
This is release 1.2 of the Universal Verification Methodology (UVM) reference implementation from Accellera. This distribution includes a SystemVerilog based class library, examples, UVM Stardard Reference (PDF and HTML), and a User’s Guide.
The class library is a reference implementation of the standard. It, the examples, and User Guide provide guidance to users of the standard. For additional information on the Accellera standard, see
http://www.accellera.org/activities/vip
A good source for information, answers, and resources is http://www.accellera.org/community/uvm. It contains forums on methodology, tool specific issues, and commercial announcements. It also has links to additional resources, Accellera sponsored events, and other UVM events.
Release 1.2 contains enhancements and fixes to errata.
UVM 1.2 fixes the following enhancements and issues reported under the Mantis bug-tracking system. Issues affecting the reference documentation (API changes or semantic changes) are follwed with a plus sign (+). Issues affecting backward compatibility are folled with an asterisk (*)
For detailed information on a specific issue, refer to the Mantis database at http://www.eda.org/svdb/view.php?id=<id>, where <id> is the Mantis id.
Many of the backwards compatibility concerns caused when transitioning from UVM version 1.1 to 1.2 can be addressed with a reasonably simple search-and-replace in user code. To that end, the uvm11-to-uvm12.pl is provided.
The following command will update all SystemVerilog source files located in the current working directory and any sub-directory:
% uvm11-to-uvm12.pl --write
See the --help command-line option for additional details.
The script may not be able to automatically identify all cases of backwards incompatibility, and the user may need to fix some manually. Because most of these issues will result in a compile-time error, they should be easy to identify.
uvm_event should be a parameterized class
The uvm_event class was split into two classes, an abstract uvm_event_base, and a parameterized uvm_event#(T).
This should have minimal backwards compatibility concerns, as any code using uvm_event without explicitly declaring a #(T) will default to uvm_event#(uvm_object).
Deprecate get_config/set_config interface for configuration
The methods set_config_int, set_config_string and set_config_object (and their get counterparts) are now deprecated in favor of uvm_config_int, uvm_config_string and uvm_config_object.
Care must be taken when switching from set_config_object and get_config_object to uvm_config_object, as the clone functionality of the old API no longer exists.
ref guide doesn’t show names of UVM runtime phases
The documentation for UVM Common Phases and UVM Run-Time Phases has been updated to include a definition of how phases are named.
UVM_DISABLE_AUTO_ITEM_RECORDING should be a run_time option
uvm_sqr_if_base#(REQ,RSP)::disable_auto_item_recording and uvm_sqr_if_base#(REQ,RSP)::is_auto_item_recording_enabled have been added to the uvm_sqr_if_base#(REQ,RSP) class, allowing the driver runtime control over whether or not a sequencer should automatically record the items which flow through the sequence item port.
Setting enum values by name from command line doesn’t work
The uvm_enum_wrapper#(T) utility class has been added, which provides the ability to retrieve an enum value when provided with a string matching the enum.name() for that value.
This class is used by the `uvm_field_enum macro when performing auto-configuration, such that values can be set using uvm_config_db#(string) (or the uvm_cmdline_processor::+uvm_set_config_string plusarg).
Phase’s default sequence should also have get_config string support
A new plusarg has been added (uvm_cmdline_processor::+uvm_set_default_sequence) which allows for the default_sequence a sequencer executes in uvm_sequencer_base::start_phase_sequence to be set directly from the command line.
General support for setting default_sequence as a string was not provided, as during runtime the default_sequence should always be set using either uvm_sequence_base or uvm_object_wrapper.
Remove all $display calls from BCL, except report_server
All messaging is now routed via uvm_report_server.
request facility to identify unused factory overrides
The uvm_factory class was split into two classes, an abstract uvm_factory, a default implementation of uvm_default_factory. This allows for alternate factories (including those with additional debug functionality) to be created.
Control over the global factory was migrated to the new uvm_coreservice_t class.
The undocumented uvm_pkg::factory variable has been removed, as it was unsafe during static initialization, and incompatible with the uvm_coreservice_t class. References to this variable need to be upgraded to retrieve the factory via uvm_factory::get.
Feature request to create a non-hierarchical objection
uvm_objection::set_propagate_mode has been added to provide control over whether or not objections propagate.
Feature request to prevent objection from throwing decrement-below-zero error if the count is 0
An error is no longer produced if uvm_objection::drop_objection is called with a count of 0, when the current object count is 0.
Not possible to undo a factory override.
A factory override can now be “undone” by supplying a type as an override for itself.
i.e.
// Perform an override set_type_override_by_type(old_type::get_type(), new_type::get_type()); // Undo the override set_type_override_by_type(old_type::get_type(), old_type::get_type());
bug in the get_full_name method of uvm_reg_file.
The get_full_name method of uvm_reg_file now includes the top-level block name.
uvm_comparer not using verbosity setting for print_msg()
The uvm_comparer::print_msg method now obeys the uvm_comparer::verbosity setting.
transaction order unclear and cant be changed when bus/reg size differ
The ordering of transactions generated when the size of a register/field is different than the size of the bus can now be controlled via the new uvm_reg_transaction_order_policy class.
Volatile fields should always need updating
Volatile register fields will always cause a write(), even if mirrored and desired values are the same.
Add UVM_ prefix to enumerated values
Various top-level enumeration values (such as those declared in uvm_sequence_state_enum) did not have the UVM_ prefix. This would cause compilation errors when the uvm_pkg was wildcard imported into a scope which had already declared the same names. These enumerations have been corrected to include the proper UVM_ prefix.
References to the values within uvm_sequence_state_enum and uvm_sequencer_arb_mode must now be prefixed with UVM_.
Bad reference to “record_field_int” in reference guide
A bad reference to record_field_int has been corrected to record_field inside of uvm_recorder.
Bad reference to “DEC” in reference guide
Bad references to “DEC” have been corrected to UVM_DEC within uvm_object::do_print and uvm_object::do_record.
uvm_sequence_library documentation missing from html documentation
The uvm_sequence_library class has been updated from “beta” to “official” status. As such, it is now documented in the reference guide.
Documentation of uvm_component::set_inst_override_by_type() incorrectly documents uvm_factory::set_inst_override_by_type()
The documentation of uvm_component::set_inst_override_by_type as been updated to reflect the proper ordering of the parameters to uvm_factory::set_inst_override_by_type.
some symbols in uvm_radix_enum undocumented
Documentation was added for UVM_UNFORMAT2, UVM_UNFORMAT4, UVM_REAL, UVM_REAL_DEC, and UVM_REAL_EXP within the uvm_radix_enum.
Deprecate hierarchical propagation of objections; add mode bit in interim
Mantis 3893 (+) provides the mode bit for controlling propagation of objections. Hierarchical propagation was not outright deprecated in this release.
Redundant code in uvm_port_base
Some redundant code in the uvm_port_base#(IF) was removed.
Remove the confusing uvm_severity type
The confusing uvm_severity_type was deprecated, and replaced internally using uvm_severity.
This change should have minimal effect on user code, as the old type was simply deprecated, as opposed to removed. The 1.1 to 1.2 Migration Script can be used to replace any occurances of the old type in user code.
set_report_verbosity doc unclear about setting value or threshold
The documentation of uvm_report_object::set_report_verbosity_level, uvm_report_object::set_report_id_verbosity, and uvm_report_object::set_report_severity_id_verbosity were updated to provide a clearer definition of exactly what the verbosity values implied.
BUSY flag not cleared when register model is reset
The register model was updated to clear the BUSY flag when reset.
Refactor start_phase_sequence logic to be able to kill sequence on phase ending
The method uvm_sequencer_base::stop_phase_sequence was added which acts as the bookend to uvm_sequencer_base::start_phase_sequence. It will call uvm_sequence_base::kill on the default_sequence if the sequence is still executing when the phase ends.
While technically acting different than the previous implementation, it is unlikely that this will result in any backwards incompatibility challenges, as the old mechanism simply terminated the process which launched the default_sequence, resulting in a “zombie” sequence.
Enhance uvm_sequence::starting_phase
The uvm_sequence_base::starting_phase variable was publicly accessible and not protected from writes-after-reads. This would result in strange behavior (including FATALS and HANGS) if the value was changed between a raise and drop of the objection within the phase.
The variable was removed, and is now only accessible via the uvm_sequence_base::set_starting_phase and uvm_sequence_base::get_starting_phase accessors. An error will be thrown if there are any attempts to ‘set’ the starting phase after it has been retrieved via a ‘get’.
This change could potentially effect users, as references to the uvm_sequence_base::starting_phase variable will now miscompile. The 1.1 to 1.2 Migration Script can be used to search-and-replace within the user code, updating it to the new methods.
Provide auto-object-to-phase in uvm_sequence_base
The uvm_sequence_base::set_automatic_phase_objection method was added, simplifying the code required to object to the starting_phase inside of a phase.
Clean up the number of objections created by phasing
Objections only make sense in uvm_task_phases which are of the UVM_PHASE_IMP type. For all other phases and types, the objections have been removed, and any attempt to access the objection will result in an error.
While technically acting different than the previous implementation, it is unlikely that this will result in any backwards incompatibility challenges. Any user code which would cause the error to occur would have been silently ignored by the library in the past, which meant that whatever the user was trying to do wouldn’t have worked.
Provide get_objection_count in uvm_phase
The method uvm_phase::get_objection_count was added, providing the user with a cleaner mechanism for dropping all raised objections.
// Old Code: uvm_objection phase_done; phase_done = phase.get_objection(); phase_done.drop_objection(this, "dropping all objections", phase_done.get_objection_count(this)); // New Code: phase.drop_objection(this, "dropping all objections", phase.get_objection_count(this));
seq_item_port.put_response is not documented
The previously undocumented uvm_sqr_if_base#(REQ,RSP)::put_response was added to the standard, providing a non-blocking mechanism for sending response information from a driver.
jump logic too early in phase state pipeline
The previous implementation of the jump logic uvm_phase caused jumps during the phase_ended callback to be ignored. This has been corrected.
Provide schedule introspection via get_predecessor/successor_nodes
The uvm_phase::get_adjacent_predecessor_nodes and uvm_phase::get_adjacent_successor_nodes methods were adding the uvm_phase api. This provides the user with the ability to programmatically traverse the entire phase graph.
uvm_sequence fields req/rsp are not documented
The previously undocumented uvm_sequence#(REQ,RSP)::req and uvm_sequence#(REQ,RSP)::rsp fields were added to the standard.
sequencer_base should throw error if user allows wait_for_relevant to return while is_relevant=0
An error will now be thrown if the sequencer exceeds the allowable number of returns from uvm_sequence_base::wait_for_relevant without uvm_sequence_base::is_relevant returning true. The allowable maximum number can be controlled via the uvm_sequencer_base::set_max_zero_time_wait_relevant_count method.
Add uvm_mem_mam_policy allocator to uvm_vreg::allocate()
The uvm_vreg::allocate API was expanded to include an optional third alloc argument.
Remove the unnecessary over-prioritization of uvm_sequence_base in default_sequence
The previous implementation of uvm_sequencer_base over-prioritized default_sequence configurations which were of type uvm_sequence_base, such that they would override configurations of type uvm_object_wrapper, even if the wrapper configurations were done with higher precedence.
While technically acting different than the previous implementation, it is unlikely that this will result in any backwards incompatibility challenges. The previous implementation would have resulted in unexpected behavior at best.
Add phase-transition callbacks
The uvm_phase_cb and uvm_phase_cb_pool were added to provide additional hooks into the phasing API.
Make UVM_OBJECT_MUST_HAVE_CONSTRUCTOR the default behavior
Mantis 3770 provided the ability to optionally enforce an explicit constructor with a string-type name argument in the UVM 1.1a, via the `UVM_OBJECT_MUST_HAVE_CONSTRUCTOR symbol. This functionality is now the default behavior for the UVM.
The UVM recommends that the following constructor be specified for any class extended from uvm_object:
class my_obj extends uvm_object; ... `uvm_object_utils(my_obj) function new(string name = "my_obj") super.new(name); ... endfunction ... endclass
However, in UVM 1.0 and UVM 1.1, the presence of such a constructor were not enforced by the library and they were technically optional. If no constructor was specified, a default constructor was provided by SystemVerilog:
class my_obj extends uvm_object; ... `uvm_object_utils(my_obj) function new(); endfunction ... endclass
Note the important difference: in the default constructor, there is no name argument. Because the factory could not rely on the presence of that argument, uvm_object instances were created by calling new() without any arguments and subsequently setting the object instance name using uvm_object::set_name.
obj = new(); if (name != "") obj.set_name(name);
In most cases, this difference was not significant. However, for any class that makes use of the value of the name argument in the constructor,
class my_obj extends uvm_object; your_obj sub; `uvm_object_utils(my_obj) function new(string name = "my_obj") super.new(name); sub = your_obj::type_id::create({name,".sub"}); endfunction ... endclass
a difference in behavior was observed between instantiating an object directly:
my_obj o = new("o");
and instantiating an object via the factory:
my_obj o = my_obj::type_id::create("o");
The difference could have been worked around by overriding the uvm_object::set_name method to percolate the effect of the name change. However, that work-around was often impossible or too late. In the examples above, the former creates an instance of your_obj named “o.sub” whereas the latter creates an instance named “my_obj.sub”. It made it impossible to control the sub-object factory based on the parent object name.
Instantiating coverage group is another example where the work-around did not work. Coverage groups cannot be renamed and must be instantiated in the encapsulating object’s constructor. The following example would create coverage groups that are always named “my_obj” when using the object factory.
class my_obj extends uvm_object; covergroup my_cg(string name); option.name = name; ... endgroup `uvm_object_utils(my_obj) function new(string name = "my_obj") super.new(name); my_cg = new(name); endfunction ... endclass
Because the object factory is such a fundamental element of UVM, it is important that it be able to rely on the presence of a name argument in object constructors.
In UVM 1.2, the UVM object factory now requires that uvm_object have a constructor with a name argument. Should this constructor be missing, a syntax error will be issued. However, because much of the factory code is hidden in the utility macros, the syntax error may not point to the ultimate cause of the problem and may be confusing the diagnose.
For example, this simple file
`include "uvm_macros.svh" program test; import uvm_pkg::*; class my_obj extends uvm_object; `uvm_object_utils(my_obj) endclass endprogram
will produce the following error messages:
TBD
file: test.sv `uvm_object_utils(my_obj) | ncvlog: *E,TOOMAC (test.sv,8|24): too many actual arguments [10.2.2][10.3(IEEE)].
Error-[TMAFTC] Too many arguments to function/task call $UVM_HOME/src/base/uvm_registry.svh, 197 "my_obj::new(name)" The above function/task call is done with more arguments than needed. Error-[TMAFTC] Too many arguments to function/task call test.sv, 6 "my_obj::new(name)" The above function/task call is done with more arguments than needed.
When using VCS, ignore the first message reported in uvm_registry.svh and focus on the subsequent one identifying the invalid constructor being called. The reported line number will be on the endclass token of the class that is missing the required constructor.
Suitable constructors may be automatically added to classes that are missing them by using the add_uvm_object_new.pl script. The following command will update all SystemVerilog source files located in the current working directory and any sub-directory:
% add_uvm_object_new.pl --write
See the --help command-line option for more details.
The script may not be able to automatically identify all classes with missing constructors, or users may prefer to manually modify their source files. The script is also unable to fix unsuitable constructors; those will need to be fixed manually. Because the error is a compile-time error, it will be easy to identify any remaining changes that are required.
To ease the process of migrating code to UVM 1.2, the old (incorrect) behavior remain available. To restore the old behavior, it is necessary to define the `UVM_OBJECT_DO_NOT_NEED_CONSTRUCTOR symbol when compiling the UVM library:
% ... +define+UVM_OBJECT_DO_NOT_NEED_CONSTRUCTOR uvm_pkg.sv
Users must be aware that this may result in difference in behavior in code that now relies on the correct implementation of the UVM object factory.
In UVM 1.3, the UVM object factory will have the corrected behavior ONLY. The old (incorrect) behavior will no longer remain available.
This is to encourage users to migrate their code forward and enable VIP providers to eventually rely on the correct behavior of the UVM object factory.
Enable all flavors of phase jumping
The uvm_phase’s jump API was extended to include uvm_phase::set_jump_phase and uvm_phase::end_prematurely. These methods allow for a “softer” jump wherein the phase’s execution is not immediately terminated.
uvm_reg_access_seq ignoring regs with one RO field
The uvm_reg_access_seq implementation was incorrectly skipping registers which contained any ‘RO’ fields, as opposed to registers which had only ‘RO’ fields. This behavior has been corrected.
initialized memory on DPI side may survive reset and will cause bad behaviour
The C-side of the UVM’s internal DPI calls was not safe during a simulation reset, and could potentially cause memory leaks and bad behavior. This has been corrected.
uvm_test_done should be made “const”
The undocumented and deprecated uvm_pkg::uvm_test_done reference was made const to prevent users from accidently changing it.
The uvm_test_done variable is not part of the UVM standard, but may have been used by users coming from the OVM. As such, this change does not have any backward compatibility concerns for the UVM standard.
are uvm tlm connections with non-uvm_object a legal/supported use model?
The TLM documentation was expanded to explicitly allow non-uvm_object-based types within their parameterization.
Infinite recursion in uvm_reg_field::get_access
An error message within the uvm_reg_field::get_access method was recursively calling uvm_reg_field::get_access, resulting in an infinite recursion. This behavior was corrected.
Additionally, while fixing this mantis is was determined that the map of field accesses defined in uvm_reg_field::set_access was lacking a name for the scenario caused when a ‘RO’ field was added to a ‘WO’ map. The “NOACCESS” policy was added to handle this scenario.
cleanup static dpi issues
This mantis wrapped various fixes within the C-side of DPI used within the UVM.
comparer.show_max can cause check to pass when length mismatches
A bug in the uvm_comparer class caused queues of different sizes to false-pass when the uvm_comparer::show_max value was not equal to ‘1’. This behavior has been corrected.
uvm_reg::do_predict ignoring UVM_NOT_OK
The uvm_reg::do_predict method was overwriting UVM_NOT_OK status under certain circumstances, and replacing it with UVM_IS_OK. This behavior has been corrected.
Messaging System Revamp
The reporting system was overhauled to use an object-based approach to passing information (as opposed to passing many fields multiple times). This simultaneously expanded the functionality of the messaging API while providing an easier path for adding functionality to this section of the standard in the future.
The uvm_report_server::process_report and uvm_report_server::compose_message methods have been replaced by the object-based uvm_report_server::execute_report_message and uvm_report_server::compose_report_message methods. User code which used the old methods will not behave as expected with the new implementation.
To ease the process of migrating code to UVM 1.2, the old behavior remains available to the user. To restore the old behavior, it is necessary to define the `UVM_DEPRECATED_REPORTING symbol when compiling the UVM library:
% ... +define+UVM_DEPRECATED_REPORTING uvm_pkg.sv
Users must be aware that this will result in different behavior in code that now relies on the new implementation of uvm_report_server.
packing/unpacking issues
The uvm_packer::pack_int method (which has been renamed to uvm_packer::pack_field) was incorrectly implemented, causing big endian packs of 64+ bits to be preocessed incorrectly. Additionally, the `uvm_unpack_array implementation did not work properly when uvm_packer::use_metadata was set to ‘0’. These behaviors have been corrected.
Bugs in UVM 1.1-c: uvm_reg_tlm_adapter::reg2bus()
Various fixes we provided for uvm_reg_tlm_adapter::reg2bus such that iw would properly adhere to uvm_tlm_gp rules for length, byte_enable, and byte_enable_length.
in-built sequence is not equipped to exclude a block from the test sequence
The uvm_reg_hw_reset_seq was updated to ensure sub-blocks were properly excluded when relevant NO_REG_TEST attributes were set.
update uvm_hdl.c to allow VCS/IUS to perform backdoor access to VHDL
The capability to allow VHDL UVM_REG backdoor access using VCS and IUS were added.
uvm_report_server is not really extendable/chainable
In a fix similar to Mantis 3887 (*), uvm_report_server was also split into two classes, an abstract uvm_report_server and a default implementation of uvm_default_report_server. This allows uvm_report_server to be fully extended, and multiple report servers can be chained together using a “delegate” pattern.
Control over the global report server was migrated to the new uvm_coreservice_t class.
If users had previously extended uvm_report_server, then their code will likely no longer compile because they are not fully implementing the pure virtual interface which the report server now provides. The fix to reinstate the previous functionality is to extend the uvm_default_report_server instead of the uvm_report_server.
The 1.1 to 1.2 Migration Script can be used to replace any occurances of the old type in user code.
uvm_report_cb::add_by_name example needs review
A bad example in the documentation of uvm_report_cb::add_by_name has been fixed.
resource lookup broken/undefined when fieldname has wildcards
Meta characters (globs or regular expressions) within the fieldname of a resource are no longer interpretted by the resource pool.
The previous behavior for meta characters within the field name was not fully defined.
printing of int fields will mask Z values with X
The uvm_printer::print_field and uvm_printer::print_field_int methods were incorrectly implemented, causing ‘Z’ values to appear as ‘X’ when printed. This behavior has been corrected.
uvm_phase::unsync() does not work
The implementation of uvm_phase::unsync was updated to properly remove the sync relationship.
uvm_dpi_get_next_arg_c doesnt fully adhere to -1800-lrm
The internal method uvm_dpi_get_next_arg_c was updated to completely adhere to the 1800 lrm.
Improve memory performance of ‘bitstream’ interfaces for report/record/etc.
The new uvm_integral_t was standardized, which is a less memory-expensive packed vector than the uvm_bitstream_t. Support for this new type was added to the uvm_printer, uvm_packer, uvm_recorder and uvm_comparer, as well as the auto-configuration provided by the `uvm_field_*macros.
In order to provide a consistent API, the uvm_printer::print_int method was deprecated and replaced by uvm_printer::print_field_int.
uvm_config_db::set expects to be invoked in process context
The implementation of uvm_config_db::set was improperly assuming that the method would be invoked within a process context (i.e. process.self() != null). This behavior has been corrected.
remove uvm_global_copy_map
The internal and undocumented uvm_global_copy_map was removed and replaced by a simple associative array.
predict updated not just the mirrored field
The documentation of the uvm_reg::predict and uvm_reg_field::predict methods was clarified to indicate that the methods update both the mirrored and desired values.
Typo in uvm_sequence_base.vh (mehod should be method)
A typo in the documentation of uvm_sequence_base was corrected.
uvm macros violate 1800lrm iterator requirements
The `uvm_field_*macros were updated to obey 1800 LRM requirements for the iterators of arrays.
Static initialization races
The fix to Mantis 4606 accidently included a static race condition which was fixed.
uvm_phase_state initializes to incorrect value
The new phase state UVM_PHASE_UNINITIALIZED was added to the uvm_phase_state. This new state is the default state for all phases after construction.
Bug in uvm_reg_map::get_size();
The implementation of uvm_reg_map::get_size had a typo which resulted in the value of the last offset added being used instead of the value of the largest offset. This behavior has been corrected.
DPI Code does not use UVM Messaging
Similar to Mantis 3783, the messages generated from the C-side implementation of the UVM dpi code have been refactored to route through standard UVM messaging.
Promote get_next_item, try_next_item, item_done, get, peek, and put to be a part of the standard
The documentation of the uvm_sequencer#(REQ,RSP)::Sequencer Interface was expanded to include the implementations of the various methods.
Recording System Revamp
Similar to Mantis 4570 (*)(+), the recording system was overhauled to use an object-based approach to connecting to transaction databases. This resulted in two new classes uvm_tr_stream and uvm_tr_database, which provided an object-based implementation of the undocumented implementation API for the uvm_recorder.
Additionally, a new data policy uvm_link_base was added for expressing arbitrary relationships in a compile-safe manner.
The changes made to the uvm_recorder API were primarily isolated to undocumented and non-standardized methods within uvm_recorder class. New examples are provided via uvm_text_recorder, uvm_text_tr_stream and uvm_text_tr_database to illustrate to developers how the new system works.
Fix broken `uvm_record_field + `uvm_record_attribute interaction
The fix for this mantis involved creating a new method uvm_recorder::use_record_attribute. The new method allows for a conditional usage of the `uvm_record_attribute macro, allowing users to create their own recorders without interfering with vendor-specific recorders
Vendors which had provided an implementation of the `uvm_record_attribute macro need to add an implementation of uvm_recorder::use_record_attribute in their recorders to allow compatibility with the new macro implementation.
`uvm_pack_int and `uvm_unpack_int bypass the uvm_packer policy methods
The previous implementation of the `uvm_pack_* macros bypassed the uvm_packer policy methods, and directly accessed an undocumented member variable of the uvm_packer class. This implementation was refactored to use the policy methods without accessing any undocumented functionality.
Additionally, a new API was added to the uvm_packer to provide the ability to pack/unpack an arbrary number of bits from an array of bits, bytes or ints. This new API provides easier compatibility with the SystemVerilog stream operator.
separate uvm_hdl* source into files-by-vendor
Related to Mantis 4588, the fix for this mantis separated the hdl vendor dpi implementations into vendor-specific files.
`uvm_record_* macros bypass uvm_recorder policy class
The previously undocumented `uvm_record_* macros bypassed the uvm_recorder policy methods, and called undocumented and non-standard methods. Their implementation has been refactored to use the uvm_recorder policy methods by default.
The changes to the macros should be transparent to most end users, however developers which were supporting the old undocumented macros may need to update their implementations.
print_real is undocumented
A typo in the documentation of uvm_printer::print_real resulted in the method being absent from the standard. This has been corrected.
`uvm_record_int/string/time/real are undocumented
After fixing Mantis 4783 (*), the previously undocumented `uvm_record_int, `uvm_record_field, `uvm_record_real, `uvm_record_string and `uvm_record_time have been officially added to the standard.
Adding a uvm_reg_map to an existing regmap instance required both maps to have the same parent. The behavior was fixed and the bad error message corrected.
Fixed a problem wherein multiple +uvm_set_* commands were ignored after a format error.
The instance name of the phase objection was changed to reflect the name of the phase.
A performance fix was implemented which avoided the copy of large QDA within the spell checker.
Fixed a bug within uvm_leaf_scope which could lead to stall of simulation.
Fixed random stability bug in lookup_name which caused instability when the config database was queried.
A check was added for an out-of-bound queue access in uvm_misc.svh. This check caused no functional change, but prevents certain tools from throwing a warning when processing the code.
The macros `UVM_MAX_STREAMBITS, `UVM_PACKER_MAX_BYTES and `UVM_DEFAULT_TIMEOUT were relocated to src/macros/uvm_global_defines.svh, which is included via uvm_macros.svh. These changes will make the UVM 1.2 Reference HTML out of sync with the UVM 1.2 Reference PDF, however this change is strictly contained to the formatting/location of documentation, not a functional difference.
Various typos and bad links within the reference guide were corrected.
The singleton instance of uvm_coreservice_t provides a common point for all central uvm services such as uvm_factory, uvm_report_server, ...
virtual class uvm_coreservice_t
Register file abstraction base class
virtual class uvm_reg_file extends uvm_object
The uvm_object class is the base class for all UVM data and hierarchical classes.
virtual class uvm_object extends uvm_void
Processes the provided message per the actions contained within.
pure virtual function void execute_report_message( uvm_report_message report_message, string composed_message )
Constructs the actual string sent to the file or command line from the severity, component name, report id, and the message itself.
pure virtual function string compose_report_message( uvm_report_message report_message, string report_object_name = "" )
Prints an integral field (up to 64 bits).
virtual function void print_field_int ( string name, uvm_integral_t value, int size, uvm_radix_enum radix = UVM_NORADIX, byte scope_separator = ".", string type_name = "" )
Abstract class which defines the recorder API.
virtual class uvm_recorder extends uvm_object
Indicates that this recorder does (or does not) support usage of the `uvm_record_attribute macro.
virtual function bit use_record_attribute()
The uvm_event_base class is an abstract wrapper class around the SystemVerilog event construct.
virtual class uvm_event_base extends uvm_object
The uvm_event class is an extension of the abstract uvm_event_base class.
class uvm_event#( type T = uvm_object ) extends uvm_event_base
By default, item recording is performed automatically when get_next_item() and item_done() are called.
virtual function void disable_auto_item_recording()
Return TRUE if automatic item recording is enabled for this port instance.
virtual function bit is_auto_item_recording_enabled()
This class defines an interface for sequence drivers to communicate with sequencers.
virtual class uvm_sqr_if_base #( type T1 = uvm_object, T2 = T1 )
The uvm_enum_wrapper#(T) class is a utility mechanism provided as a convenience to the end user.
class uvm_enum_wrapper#( type T = uvm_active_passive_enum )
Start the default sequence for this phase, if any.
virtual function void start_phase_sequence( uvm_phase phase )
The uvm_sequence_base class provides the interfaces needed to create streams of sequence items and/or other sequences.
class uvm_sequence_base extends uvm_sequence_item
The uvm_object_wrapper provides an abstract interface for creating object and component proxies.
virtual class uvm_object_wrapper
As the name implies, uvm_factory is used to manufacture (create) UVM objects and components.
virtual class uvm_factory
Default implementation of the UVM factory.
class uvm_default_factory extends uvm_factory
Static accessor for uvm_factory
static function uvm_factory get()
Sets the propagation mode for this objection.
function void set_propagate_mode ( bit prop_mode )
Drops the number of objections for the source object by count, which defaults to 1.
virtual function void drop_objection ( uvm_object obj = null, string description = "", int count = 1 )
Causes the error count to be incremented and the message, msg, to be appended to the miscompares string (a newline is used to separate messages).
function void print_msg ( string msg )
Sets the verbosity for printed messages.
int unsigned verbosity = UVM_LOW
virtual class uvm_reg_transaction_order_policy extends uvm_object
The do_print method is the user-definable hook called by print and sprint that allows users to customize what gets printed or sprinted beyond the field information provided by the `uvm_field_* macros, Utility and Field Macros for Components and Objects.
virtual function void do_print ( uvm_printer printer )
The do_record method is the user-definable hook called by the record method.
virtual function void do_record ( uvm_recorder recorder )
The uvm_sequence_library is a sequence that contains a list of registered sequence types.
class uvm_sequence_library #( type REQ = uvm_sequence_item, RSP = REQ ) extends uvm_sequence #(REQ,RSP)
A convenience function for uvm_factory::set_inst_override_by_type, this method registers a factory override for components and objects created at this level of hierarchy or below.
function void set_inst_override_by_type( string relative_inst_path, uvm_object_wrapper original_type, uvm_object_wrapper override_type )
pure virtual function void set_inst_override_by_type ( uvm_object_wrapper original_type, uvm_object_wrapper override_type, string full_inst_path )
Transaction-level communication between components is handled via its ports, exports, and imps, all of which derive from this class.
virtual class uvm_port_base #( type IF = uvm_void ) extends IF
This method sets the maximum verbosity level for reports for this component.
function void set_report_verbosity_level ( int verbosity_level )
function void set_report_id_verbosity ( string id, int verbosity )
These methods associate the specified verbosity threshold with reports of the given severity, id, or severity-id pair.
function void set_report_severity_id_verbosity ( uvm_severity severity, string id, int verbosity )
Stop the default sequence for this phase, if any exists, and it is still executing.
virtual function void stop_phase_sequence( uvm_phase phase )
This function will kill the sequence, and cause all current locks and requests in the sequence’s default sequencer to be removed.
function void kill()
Sets the ‘starting phase’.
function void set_starting_phase( uvm_phase phase )
Returns the ‘starting phase’.
function uvm_phase get_starting_phase()
Sets the ‘automatically object to starting phase’ bit.
function void set_automatic_phase_objection( bit value )
Base class for all task phases.
virtual class uvm_task_phase extends uvm_phase
Returns the current number of objections to ending this phase raised by the given object.
virtual function int get_objection_count( uvm_object obj = null )
Sends a response back to the sequence that issued the request.
virtual function void put_response( input T2 t )
This base class defines everything about a phase: behavior, state, and context.
class uvm_phase extends uvm_object
Provides an array of nodes which are predecessors to this phase node.
function void get_adjacent_predecessor_nodes( ref uvm_phase pred[] )
Provides an array of nodes which are successors to this phase node.
function void get_adjacent_successor_nodes( ref uvm_phase succ[] )
The sequence contains a field of the request type called req.
REQ req
The sequence contains a field of the response type called rsp.
RSP rsp
This method is called by the sequencer when all available sequences are not relevant.
virtual task wait_for_relevant()
The default is_relevant implementation returns 1, indicating that the sequence is always relevant.
virtual function bit is_relevant()
Can be called at any time to change the maximum number of times wait_for_relevant() can be called by the sequencer in zero time before an error is declared.
virtual function void set_max_zero_time_wait_relevant_count( int new_val )
Randomly implement, resize or relocate a virtual register array
virtual function uvm_mem_region allocate( longint unsigned n, uvm_mem_mam mam, uvm_mem_mam_policy alloc = null )
Controls the flow of sequences, which generate the stimulus (sequence item transactions) that is passed on to drivers for execution.
class uvm_sequencer_base extends uvm_component
This class defines a callback method that is invoked by the phaser during the execution of a specific node in the phase graph or all phase nodes.
class uvm_phase_cb extends uvm_callback
Convenience type for the uvm_callbacks#(uvm_phase, uvm_phase_cb) class.
typedef uvm_callbacks#( uvm_phase, uvm_phase_cb ) uvm_phase_cb_pool
Sets the instance name of this object, overwriting any previously given name.
virtual function void set_name ( string name )
Specify a phase to transition to when phase is complete.
function void set_jump_phase( uvm_phase phase )
Set a flag to cause the phase to end prematurely.
function void end_prematurely()
Verify the accessibility of all registers in a block by executing the uvm_reg_single_access_seq sequence on every register within it.
class uvm_reg_access_seq extends uvm_reg_sequence #( uvm_sequence #(uvm_reg_item) )
Get the access policy of the field
virtual function string get_access( uvm_reg_map map = null )
Modify the access policy of the field
virtual function string set_access( string mode )
The uvm_comparer class provides a policy object for doing comparisons.
class uvm_comparer
Sets the maximum number of messages to send to the printer for miscompares of an object.
int unsigned show_max = 1
Packs an integral value (less than or equal to 4096 bits) into the packed array.
virtual function void pack_field ( uvm_bitstream_t value, int size )
This flag indicates whether to encode metadata when packing dynamic data, or to decode metadata when unpacking.
bit use_metadata
Converts a uvm_reg_bus_op struct to a uvm_tlm_gp item.
virtual function uvm_sequence_item reg2bus( const ref uvm_reg_bus_op rw )
This typedef provides a short, more convenient name for the uvm_tlm_generic_payload type.
typedef uvm_tlm_generic_payload uvm_tlm_gp
Test the hard reset values of registers
class uvm_reg_hw_reset_seq extends uvm_reg_sequence #( uvm_sequence #(uvm_reg_item) )
Default implementation of the UVM report server.
class uvm_default_report_server extends uvm_report_server
Prints an integral field (up to 4096 bits).
virtual function void print_field ( string name, uvm_bitstream_t value, int size, uvm_radix_enum radix = UVM_NORADIX, byte scope_separator = ".", string type_name = "" )
Remove synchronization between two domains, fully or partially
function void unsync( uvm_domain target, uvm_phase phase = null, uvm_phase with_phase = null )
The uvm_printer class provides an interface for printing uvm_objects in various formats.
virtual class uvm_printer
Create a new or update an existing configuration setting for field_name in inst_name from cntxt.
static function void set( uvm_component cntxt, string inst_name, string field_name, T value )
Update the mirrored and desired value for this register.
virtual function bit predict ( uvm_reg_data_t value, uvm_reg_byte_en_t be = -1, uvm_predict_e kind = UVM_PREDICT_DIRECT, uvm_path_e path = UVM_FRONTDOOR, uvm_reg_map map = null, string fname = "", int lineno = 0 )
Update the mirrored and desired value for this field.
function bit predict ( uvm_reg_data_t value, uvm_reg_byte_en_t be = -1, uvm_predict_e kind = UVM_PREDICT_DIRECT, uvm_path_e path = UVM_FRONTDOOR, uvm_reg_map map = null, string fname = "", int lineno = 0 )
The uvm_tr_stream base class is a representation of a stream of records within a uvm_tr_database.
virtual class uvm_tr_stream extends uvm_object
The uvm_tr_database class is intended to hide the underlying database implementation from the end user, as these details are often vendor or tool-specific.
virtual class uvm_tr_database extends uvm_object
The uvm_link_base class presents a simple API for defining a link between any two objects.
virtual class uvm_link_base extends uvm_object
The uvm_text_recorder is the default recorder implementation for the uvm_text_tr_database.
class uvm_text_recorder extends uvm_recorder
The uvm_text_tr_stream is the default stream implementation for the uvm_text_tr_database.
class uvm_text_tr_stream extends uvm_tr_stream
The uvm_text_tr_database is the default implementation for the uvm_tr_database.
class uvm_text_tr_database extends uvm_tr_database
Prints a real field.
virtual function void print_real ( string name, real value, byte scope_separator = "." )