The ovm_component class is the root base class for OVM components. In addition to the features inherited from ovm_object and ovm_report_object, ovm_component provides the following interfaces:
Hierarchy | provides methods for searching and traversing the component hierarchy. |
Configuration | provides methods for configuring component topology and other parameters ahead of and during component construction. |
Phasing | defines a phased test flow that all components follow. Derived components implement one or more of the predefined phase callback methods to perform their function. During simulation, all components’ callbacks are executed in precise order. Phasing is controlled by ovm_top, the singleton instance of ovm_root. |
Reporting | provides a convenience interface to the ovm_report_handler. All messages, warnings, and errors are processed through this interface. |
Transaction recording | provides methods for recording the transactions produced or consumed by the component to a transaction database (vendor specific). |
Factory | provides a convenience interface to the ovm_factory. The factory is used to create new components and other objects based on type-wide and instance-specific configuration. |
The ovm_component is automatically seeded during construction using OVM seeding, if enabled. All other objects must be manually reseeded, if appropriate. See ovm_object::reseed for more information.
ovm_component | ||||
The ovm_component class is the root base class for OVM components. | ||||
Class Hierarchy | ||||
| ||||
Class Declaration | ||||
| ||||
new | Creates a new component with the given leaf instance name and handle to to its parent. | |||
Hierarchy Interface | These methods provide user access to information about the component hierarchy, i.e., topology. | |||
get_parent | Returns a handle to this component’s parent, or null if it has no parent. | |||
get_full_name | Returns the full hierarchical name of this object. | |||
get_child | ||||
get_next_child | ||||
get_first_child | These methods are used to iterate through this component’s children, if any. | |||
get_num_children | Returns the number of this component’s children. | |||
has_child | Returns 1 if this component has a child with the given name, 0 otherwise. | |||
set_name | Renames this component to name and recalculates all descendants’ full names. | |||
lookup | Looks for a component with the given hierarchical name relative to this component. | |||
Phasing Interface | Components execute their behavior in strictly ordered, pre-defined phases. | |||
build | The build phase callback is the first of several methods automatically called during the course of simulation. | |||
connect | The connect phase callback is one of several methods automatically called during the course of simulation. | |||
end_of_elaboration | The end_of_elaboration phase callback is one of several methods automatically called during the course of simulation. | |||
start_of_simulation | The start_of_simulation phase callback is one of several methods automatically called during the course of simulation. | |||
run | The run phase callback is the only predefined phase that is time-consuming, i.e., task-based. | |||
extract | The extract phase callback is one of several methods automatically called during the course of simulation. | |||
check | The check phase callback is one of several methods automatically called during the course of simulation. | |||
report | The report phase callback is the last of several predefined phase methods automatically called during the course of simulation. | |||
suspend | Suspends the process tree spawned from this component’s currently executing task-based phase, e.g. | |||
resume | Resumes the process tree spawned from this component’s currently executing task-based phase, e.g. | |||
status | Returns the status of the parent process associated with the currently running task-based phase, e.g., run. | |||
kill | Kills the process tree associated with this component’s currently running task-based phase, e.g., run. | |||
do_kill_all | Recursively calls kill on this component and all its descendants, which abruptly ends the currently running task-based phase, e.g., run. | |||
stop | The stop task is called when this component’s enable_stop_interrupt bit is set and global_stop_request is called during a task-based phase, e.g., run. | |||
enable_stop_interrupt | This bit allows a component to raise an objection to the stopping of the current phase. | |||
resolve_bindings | Processes all port, export, and imp connections. | |||
Configuration Interface | Components can be designed to be user-configurable in terms of its topology (the type and number of children it has), mode of operation, and run-time parameters (knobs). | |||
set_config_int | ||||
set_config_string | ||||
set_config_object | Calling set_config_* causes configuration settings to be created and placed in a table internal to this component. | |||
get_config_int | ||||
get_config_string | ||||
get_config_object | These methods retrieve configuration settings made by previous calls to their set_config_* counterparts. | |||
check_config_usage | Check all configuration settings in a components configuration table to determine if the setting has been used, overridden or not used. | |||
apply_config_settings | Searches for all config settings matching this component’s instance path. | |||
print_config_settings | Called without arguments, print_config_settings prints all configuration information for this component, as set by previous calls to set_config_*. | |||
print_config_matches | Setting this static variable causes get_config_* to print info about matching configuration settings as they are being applied. | |||
Objection Interface | These methods provide object level hooks into the ovm_objection mechanism. | |||
raised | The raised callback is called when a decendant of the component instance raises the specfied objection. | |||
dropped | The dropped callback is called when a decendant of the component instance raises the specfied objection. | |||
all_dropped | The all_dropped callback is called when a decendant of the component instance raises the specfied objection. | |||
Factory Interface | The factory interface provides convenient access to a portion of OVM’s ovm_factory interface. | |||
create_component | A convenience function for ovm_factory::create_component_by_name, this method calls upon the factory to create a new child component whose type corresponds to the preregistered type name, requested_type_name, and instance name, name. | |||
create_object | A convenience function for ovm_factory::create_object_by_name, this method calls upon the factory to create a new object whose type corresponds to the preregistered type name, requested_type_name, and instance name, name. | |||
set_type_override_by_type | A convenience function for ovm_factory::set_type_override_by_type, this method registers a factory override for components and objects created at this level of hierarchy or below. | |||
set_inst_override_by_type | A convenience function for ovm_factory::set_inst_override_by_type, this method registers a factory override for components and objects created at this level of hierarchy or below. | |||
set_type_override | A convenience function for ovm_factory::set_type_override_by_name, this method configures the factory to create an object of type override_type_name whenever the factory is asked to produce a type represented by original_type_name. | |||
set_inst_override | A convenience function for ovm_factory::set_inst_override_by_type, this method registers a factory override for components created at this level of hierarchy or below. | |||
print_override_info | This factory debug method performs the same lookup process as create_object and create_component, but instead of creating an object, it prints information about what type of object would be created given the provided arguments. | |||
Hierarchical Reporting Interface | This interface provides versions of the set_report_* methods in the ovm_report_object base class that are applied recursively to this component and all its children. | |||
set_report_severity_action_hier | ||||
set_report_id_action_hier | ||||
set_report_severity_id_action_hier | These methods recursively associate the specified action with reports of the given severity, id, or severity-id pair. | |||
set_report_default_file_hier | ||||
set_report_severity_file_hier | ||||
set_report_id_file_hier | ||||
set_report_severity_id_file_hier | These methods recursively associate the specified FILE descriptor with reports of the given severity, id, or severity-id pair. | |||
set_report_verbosity_level_hier | This method recursively sets the maximum verbosity level for reports for this component and all those below it. | |||
Recording Interface | These methods comprise the component-based transaction recording interface. | |||
accept_tr | This function marks the acceptance of a transaction, tr, by this component. | |||
do_accept_tr | The accept_tr method calls this function to accommodate any user-defined post-accept action. | |||
begin_tr | This function marks the start of a transaction, tr, by this component. | |||
begin_child_tr | This function marks the start of a child transaction, tr, by this component. | |||
do_begin_tr | The begin_tr and begin_child_tr methods call this function to accommodate any user-defined post-begin action. | |||
end_tr | This function marks the end of a transaction, tr, by this component. | |||
do_end_tr | The end_tr method calls this function to accommodate any user-defined post-end action. | |||
record_error_tr | This function marks an error transaction by a component. | |||
record_event_tr | This function marks an event transaction by a component. | |||
print_enabled | This bit determines if this component should automatically be printed as a child of its parent object. |
function new ( string name, ovm_component parent )
Creates a new component with the given leaf instance name and handle to to its parent. If the component is a top-level component (i.e. it is created in a static module or interface), parent should be null.
The component will be inserted as a child of the parent object, if any. If parent already has a child by the given name, an error is produced.
If parent is null, then the component will become a child of the implicit top-level component, ovm_top.
All classes derived from ovm_component must call super.new(name,parent).
These methods provide user access to information about the component hierarchy, i.e., topology.
virtual function ovm_component get_parent ()
Returns a handle to this component’s parent, or null if it has no parent.
virtual function string get_full_name ()
Returns the full hierarchical name of this object. The default implementation concatenates the hierarchical name of the parent, if any, with the leaf name of this object, as given by ovm_object::get_name.
function ovm_component get_child ( string name )
function int get_next_child ( ref string name )
function int get_first_child ( ref string name )
These methods are used to iterate through this component’s children, if any. For example, given a component with an object handle, comp, the following code calls ovm_object::print for each child:
string name; ovm_component child; if (comp.get_first_child(name)) do begin child = comp.get_child(name); child.print(); end while (comp.get_next_child(name));
function int has_child ( string name )
Returns 1 if this component has a child with the given name, 0 otherwise.
virtual function void set_name ( string name )
Renames this component to name and recalculates all descendants’ full names.
function ovm_component lookup ( string name )
Looks for a component with the given hierarchical name relative to this component. If the given name is preceded with a ‘.’ (dot), then the search begins relative to the top level (absolute lookup). The handle of the matching component is returned, else null. The name must not contain wildcards.
Components execute their behavior in strictly ordered, pre-defined phases. Each phase is defined by its own method, which derived components can override to incorporate component-specific behavior. During simulation, the phases are executed one by one, where one phase must complete before the next phase begins. The following briefly describe each phase:
new | Also known as the constructor, the component does basic initialization of any members not subject to configuration. |
build | The component constructs its children. It uses the get_config interface to obtain any configuration for itself, the set_config interface to set any configuration for its own children, and the factory interface for actually creating the children and other objects it might need. |
connect | The component now makes connections (binds TLM ports and exports) from child-to-child or from child-to-self (i.e. to promote a child port or export up the hierarchy for external access. Afterward, all connections are checked via resolve_bindings before entering the end_of_elaboration phase. |
end_of_elaboration | At this point, the entire testbench environment has been built and connected. No new components and connections may be created from this point forward. Components can do final checks for proper connectivity, and it can initiate communication with other tools that require stable, quasi-static component structure.. |
start_of_simulation | The simulation is about to begin, and this phase can be used to perform any pre-run activity such as displaying banners, printing final testbench topology and configuration information. |
run | This is where verification takes place. It is the only predefined, time-consuming phase. A component’s primary function is implemented in the run task. Other processes may be forked if desired. When a component returns from its run task, it does not signify completion of its run phase. Any processes that it may have forked continue to run. The run phase terminates in one of four ways: |
stop | When a component’s enable_stop_interrupt bit is set and global_stop_request is called, the component’s stop task is called. Components can implement stop to allow completion of in-progress transactions, <flush> queues, etc. Upon return from stop() by all enabled components, a do_kill_all is issued. If the ovm_test_done_objection is being used, this stopping procedure is deferred until all outstanding objections on ovm_test_done have been dropped. |
objections dropped | The ovm_test_done_objection will implicitly call global_stop_request when all objections to ending the phase are dropped. The stop procedure described above is then allowed to proceed normally. |
kill | When called, all component’s run processes are killed immediately. While kill can be called directly, it is recommended that components use the stopping mechanism, which affords a more ordered and safe shut-down. |
timeout | If a timeout was set, then the phase ends if it expires before either of the above occur. Without a stop, kill, or timeout, simulation can continue “forever”, or the simulator may end simulation prematurely if it determines that all processes are waiting. |
extract | This phase can be used to extract simulation results from coverage collectors and scoreboards, collect status/error counts, statistics, and other information from components in bottom-up order. Being a separate phase, extract ensures all relevant data from potentially independent sources (i.e. other components) are collected before being checked in the next phase. |
check | Having extracted vital simulation results in the previous phase, the check phase can be used to validate such data and determine the overall simulation outcome. It too executes bottom-up. |
report | Finally, the report phase is used to output results to files and/or the screen. |
All task-based phases (run is the only pre-defined task phase) will run forever until killed or stopped via kill or global_stop_request. The latter causes each component’s stop task to get called back if its enable_stop_interrupt bit is set. After all components’ stop tasks return, the OVM will end the phase.
Note- the post_new, export_connections, import_connections, configure, and pre_run phases are deprecated. build replaces post_new, connect replaces both import_ and export_connections, and start_of_simulation replaces pre_run.
virtual function void build ()
The build phase callback is the first of several methods automatically called during the course of simulation. The build phase is the second of a two-pass construction process (the first is the built-in new method).
The build phase can add additional hierarchy based on configuration information not available at time of initial construction. Any override should call super.build().
Starting after the initial construction phase (new method) has completed, the build phase consists of calling all components’ build methods recursively top-down, i.e., parents’ build are executed before the children. This is the only phase that executes top-down.
The build phase of the ovm_component class executes the automatic configuration of fields registed in the component by calling apply_config_settings. To turn off automatic configuration for a component, do not call super.build() in the subtype’s build method.
See ovm_phase for more information on phases.
virtual function void connect ()
The connect phase callback is one of several methods automatically called during the course of simulation.
Starting after the build phase has completed, the connect phase consists of calling all components’ connect methods recursively in depth-first, bottom-up order, i.e., children are executed before their parents.
Generally, derived classes should override this method to make port and export connections via the similarly-named ovm_port_base #(IF)::connect method. Any override should call super.connect().
This method should never be called directly.
See ovm_phase for more information on phases.
virtual function void end_of_elaboration ()
The end_of_elaboration phase callback is one of several methods automatically called during the course of simulation.
Starting after the connect phase has completed, this phase consists of calling all components’ end_of_elaboration methods recursively in depth-first, bottom-up order, i.e., children are executed before their parents.
Generally, derived classes should override this method to perform any checks on the elaborated hierarchy before the simulation phases begin. Any override should call super.end_of_elaboration().
This method should never be called directly.
See ovm_phase for more information on phases.
virtual function void start_of_simulation ()
The start_of_simulation phase callback is one of several methods automatically called during the course of simulation.
Starting after the end_of_elaboration phase has completed, this phase consists of calling all components’ start_of_simulation methods recursively in depth-first, bottom-up order, i.e. children are executed before their parents.
Generally, derived classes should override this method to perform component- specific pre-run operations, such as discovery of the elaborated hierarchy, printing banners, etc. Any override should call super.start_of_simulation().
This method should never be called directly.
See ovm_phase for more information on phases.
virtual task run ()
The run phase callback is the only predefined phase that is time-consuming, i.e., task-based. It executes after the start_of_simulation phase has completed. Derived classes should override this method to perform the bulk of its functionality, forking additional processes if needed.
In the run phase, all components’ run tasks are forked as independent processes. Returning from its run task does not signify completion of a component’s run phase; any processes forked by run continue to run.
The run phase terminates in one of four ways.
1 | explicit call to global_stop_request - When global_stop_request is called, an ordered shut-down for the currently running phase begins. First, all enabled components’ status tasks are called bottom-up, i.e., childrens’ stop tasks are called before the parent’s. A component is enabled by its enable_stop_interrupt bit. Each component can implement stop to allow completion of in-progress transactions, flush queues, and other shut-down activities. Upon return from stop by all enabled components, the recursive do_kill_all is called on all top-level component(s). If the ovm_test_done objection> is being used, this stopping procedure is deferred until all outstanding objections on ovm_test_done have been dropped. |
2 | all objections to ovm_test_done have been dropped - When all objections on the ovm_test_done objection have been dropped, global_stop_request is called automatically, thus kicking off the stopping procedure described above. See ovm_objection for details on using the objection mechanism. |
3 | explicit call to kill or do_kill_all - When kill is called, this component’s run processes are killed immediately. The do_kill_all methods applies to this component and all its descendants. Use of this method is not recommended. It is better to use the stopping mechanism, which affords a more ordered, safer shut-down. |
4 | timeout - The phase ends if the timeout expires before an explicit call to global_stop_request or kill. By default, the timeout is set to near the maximum simulation time possible. You may override this via set_global_timeout, but you cannot disable the timeout completely. |
If the default timeout occurs in your simulation, or if simulation never ends despite completion of your test stimulus, then it usually indicates a missing call to global_stop_request.
The run task should never be called directly.
See ovm_phase for more information on phases.
virtual function void extract ()
The extract phase callback is one of several methods automatically called during the course of simulation.
Starting after the run phase has completed, the extract phase consists of calling all components’ extract methods recursively in depth-first, bottom-up order, i.e., children are executed before their parents.
Generally, derived classes should override this method to collect information for the subsequent check phase when such information needs to be collected in a hierarchical, bottom-up manner. Any override should call super.extract().
This method should never be called directly.
See ovm_phase for more information on phases.
virtual function void check ()
The check phase callback is one of several methods automatically called during the course of simulation.
Starting after the extract phase has completed, the check phase consists of calling all components’ check methods recursively in depth-first, bottom-up order, i.e., children are executed before their parents.
Generally, derived classes should override this method to perform component specific, end-of-test checks. Any override should call super.check().
This method should never be called directly.
See ovm_phase for more information on phases.
virtual function void report ()
The report phase callback is the last of several predefined phase methods automatically called during the course of simulation.
Starting after the check phase has completed, the report phase consists of calling all components’ report methods recursively in depth-first, bottom-up order, i.e., children are executed before their parents.
Generally, derived classes should override this method to perform component-specific reporting of test results. Any override should call super.report().
This method should never be called directly.
See ovm_phase for more information on phases.
virtual function void kill ()
Kills the process tree associated with this component’s currently running task-based phase, e.g., run.
An alternative mechanism for stopping the run phase is the stop request. Calling global_stop_request causes all components’ run processes to be killed, but only after all components have had the opportunity to complete in progress transactions and shutdown cleanly via their stop tasks.
virtual function void do_kill_all ()
virtual task stop ( string ph_name )
The stop task is called when this component’s enable_stop_interrupt bit is set and global_stop_request is called during a task-based phase, e.g., run.
Before a phase is abruptly ended, e.g., when a test deems the simulation complete, some components may need extra time to shut down cleanly. Such components may implement stop to finish the currently executing transaction, flush the queue, or perform other cleanup. Upon return from its stop, a component signals it is ready to be stopped.
The stop method will not be called if enable_stop_interrupt is 0.
The default implementation of stop is empty, i.e., it will return immediately.
This method should never be called directly.
protected int enable_stop_interrupt = 0
This bit allows a component to raise an objection to the stopping of the current phase. It affects only time consuming phases (such as the run phase).
When this bit is set, the stop task in the component is called as a result of a call to global_stop_request. Components that are sensitive to an immediate killing of its run-time processes should set this bit and implement the stop task to prepare for shutdown.
virtual function void resolve_bindings ()
Processes all port, export, and imp connections. Checks whether each port’s min and max connection requirements are met.
It is called just before the end_of_elaboration phase.
Users should not call directly.
Components can be designed to be user-configurable in terms of its topology (the type and number of children it has), mode of operation, and run-time parameters (knobs). The configuration interface accommodates this common need, allowing component composition and state to be modified without having to derive new classes or new class hierarchies for every configuration scenario.
virtual function void set_config_int ( string inst_name, string field_name, ovm_bitstream_t value )
virtual function void set_config_string ( string inst_name, string field_name, string value )
virtual function void set_config_object ( string inst_name, string field_name, ovm_object value, bit clone = 1 )
Calling set_config_* causes configuration settings to be created and placed in a table internal to this component. There are similar global methods that store settings in a global table. Each setting stores the supplied inst_name, field_name, and value for later use by descendent components during their construction. (The global table applies to all components and takes precedence over the component tables.)
When a descendant component calls a get_config_* method, the inst_name and field_name provided in the get call are matched against all the configuration settings stored in the global table and then in each component in the parent hierarchy, top-down. Upon the first match, the value stored in the configuration setting is returned. Thus, precedence is global, following by the top-level component, and so on down to the descendent component’s parent.
These methods work in conjunction with the get_config_* methods to provide a configuration setting mechanism for integral, string, and ovm_object-based types. Settings of other types, such as virtual interfaces and arrays, can be indirectly supported by defining a class that contains them.
Both inst_name and field_name may contain wildcards.
The following message tags are used for configuration setting. You can use the standard ovm report messaging interface to control these messages. CFGNTS -- The configuration setting was not used by any component. This is a warning. CFGOVR -- The configuration setting was overridden by a setting above. CFGSET -- The configuration setting was used at least once.
See get_config_int, get_config_string, and get_config_object for information on getting the configurations set by these methods.
virtual function bit get_config_int ( string field_name, inout ovm_bitstream_t value )
virtual function bit get_config_string ( string field_name, inout string value )
virtual function bit get_config_object ( string field_name, inout ovm_object value, input bit clone = 1 )
These methods retrieve configuration settings made by previous calls to their set_config_* counterparts. As the methods’ names suggest, there is direct support for integral types, strings, and objects. Settings of other types can be indirectly supported by defining an object to contain them.
Configuration settings are stored in a global table and in each component instance. With each call to a get_config_* method, a top-down search is made for a setting that matches this component’s full name and the given field_name. For example, say this component’s full instance name is top.u1.u2. First, the global configuration table is searched. If that fails, then it searches the configuration table in component ‘top’, followed by top.u1.
The first instance/field that matches causes value to be written with the value of the configuration setting and 1 is returned. If no match is found, then value is unchanged and the 0 returned.
Calling the get_config_object method requires special handling. Because value is an output of type ovm_object, you must provide an ovm_object handle to assign to (not a derived class handle). After the call, you can then $cast to the actual type.
For example, the following code illustrates how a component designer might call upon the configuration mechanism to assign its data object property, whose type myobj_t derives from ovm_object.
class mycomponent extends ovm_component; local myobj_t data; function void build(); ovm_object tmp; super.build(); if(get_config_object("data", tmp)) if (!$cast(data, tmp)) $display("error! config setting for 'data' not of type myobj_t"); endfunction ...
The above example overrides the build method. If you want to retain any base functionality, you must call super.build().
The clone bit clones the data inbound. The get_config_object method can also clone the data outbound.
See Members for information on setting the global configuration table.
function void check_config_usage ( bit recurse = 1 )
Check all configuration settings in a components configuration table to determine if the setting has been used, overridden or not used. When recurse is 1 (default), configuration for this and all child components are recursively checked. This function is automatically called in the check phase, but can be manually called at any time.
To get all configuration information prior to the run phase, do something like this in your top object:
function void start_of_simulation(); set_report_id_action_hier(CFGOVR, OVM_DISPLAY); set_report_id_action_hier(CFGSET, OVM_DISPLAY); check_config_usage(); endfunction
virtual function void apply_config_settings ( bit verbose = )
Searches for all config settings matching this component’s instance path. For each match, the appropriate set_*_local method is called using the matching config setting’s field_name and value. Provided the set_*_local method is implemented, the component property associated with the field_name is assigned the given value.
This function is called by ovm_component::build.
The apply_config_settings method determines all the configuration settings targeting this component and calls the appropriate set_*_local method to set each one. To work, you must override one or more set_*_local methods to accommodate setting of your component’s specific properties. Any properties registered with the optional `ovm_*_field macros do not require special handling by the set_*_local methods; the macros provide the set_*_local functionality for you.
If you do not want apply_config_settings to be called for a component, then the build() method should be overloaded and you should not call super.build(). If this case, you must also set the m_build_done bit. Likewise, apply_config_settings can be overloaded to customize automated configuration.
When the verbose bit is set, all overrides are printed as they are applied. If the component’s print_config_matches property is set, then apply_config_settings is automatically called with verbose = 1.
function void print_config_settings ( string field = "", ovm_component comp = null, bit recurse = 0 )
Called without arguments, print_config_settings prints all configuration information for this component, as set by previous calls to set_config_*. The settings are printing in the order of their precedence.
If field is specified and non-empty, then only configuration settings matching that field, if any, are printed. The field may not contain wildcards.
If comp is specified and non-null, then the configuration for that component is printed.
If recurse is set, then configuration information for all comp’s children and below are printed as well.
static bit print_config_matches = 0
Setting this static variable causes get_config_* to print info about matching configuration settings as they are being applied.
These methods provide object level hooks into the ovm_objection mechanism.
virtual function void raised ( ovm_objection objection, ovm_object source_obj, int count )
The raised callback is called when a decendant of the component instance raises the specfied objection. The source_obj is the object which originally raised the object. count is an optional count that was used to indicate a number of objections which were raised.
virtual function void dropped ( ovm_objection objection, ovm_object source_obj, int count )
The dropped callback is called when a decendant of the component instance raises the specfied objection. The source_obj is the object which originally dropped the object. count is an optional count that was used to indicate a number of objections which were dropped.
virtual task all_dropped ( ovm_objection objection, ovm_object source_obj, int count )
The all_dropped callback is called when a decendant of the component instance raises the specfied objection. The source_obj is the object which originally all_dropped the object. count is an optional count that was used to indicate a number of objections which were dropped. This callback is time-consuming and the all_dropped conditional will not be propagated up to the object’s parent until the callback returns.
The factory interface provides convenient access to a portion of OVM’s ovm_factory interface. For creating new objects and components, the preferred method of accessing the factory is via the object or component wrapper (see ovm_component_registry #(T,Tname) and ovm_object_registry #(T,Tname)). The wrapper also provides functions for setting type and instance overrides.
function ovm_component create_component ( string requested_type_name, string name )
A convenience function for ovm_factory::create_component_by_name, this method calls upon the factory to create a new child component whose type corresponds to the preregistered type name, requested_type_name, and instance name, name. This method is equivalent to:
factory.create_component_by_name(requested_type_name, get_full_name(), name, this);
If the factory determines that a type or instance override exists, the type of the component created may be different than the requested type. See set_type_override and set_inst_override. See also ovm_factory for details on factory operation.
function ovm_object create_object ( string requested_type_name, string name = "" )
A convenience function for ovm_factory::create_object_by_name, this method calls upon the factory to create a new object whose type corresponds to the preregistered type name, requested_type_name, and instance name, name. This method is equivalent to:
factory.create_object_by_name(requested_type_name, get_full_name(), name);
If the factory determines that a type or instance override exists, the type of the object created may be different than the requested type. See ovm_factory for details on factory operation.
static function void set_type_override_by_type ( ovm_object_wrapper original_type, ovm_object_wrapper override_type, bit replace = 1 )
A convenience function for ovm_factory::set_type_override_by_type, this method registers a factory override for components and objects created at this level of hierarchy or below. This method is equivalent to:
factory.set_type_override_by_type(original_type, override_type,replace);
The relative_inst_path is relative to this component and may include wildcards. The original_type represents the type that is being overridden. In subsequent calls to ovm_factory::create_object_by_type or ovm_factory::create_component_by_type, if the requested_type matches the original_type and the instance paths match, the factory will produce the override_type.
The original and override type arguments are lightweight proxies to the types they represent. See set_inst_override_by_type for information on usage.
function void set_inst_override_by_type( string relative_inst_path, ovm_object_wrapper original_type, ovm_object_wrapper override_type )
A convenience function for ovm_factory::set_inst_override_by_type, this method registers a factory override for components and objects created at this level of hierarchy or below. In typical usage, this method is equivalent to:
factory.set_inst_override_by_type({get_full_name(),".", relative_inst_path}, original_type, override_type);
The relative_inst_path is relative to this component and may include wildcards. The original_type represents the type that is being overridden. In subsequent calls to ovm_factory::create_object_by_type or ovm_factory::create_component_by_type, if the requested_type matches the original_type and the instance paths match, the factory will produce the override_type.
The original and override types are lightweight proxies to the types they represent. They can be obtained by calling type::get_type(), if implemented, or by directly calling type::type_id::get(), where type is the user type and type_id is the name of the typedef to ovm_object_registry #(T,Tname) or ovm_component_registry #(T,Tname).
If you are employing the `ovm_*_utils macros, the typedef and the get_type method will be implemented for you.
class comp extends ovm_component; `ovm_component_utils(comp) ... endclass class mycomp extends ovm_component; `ovm_component_utils(mycomp) ... endclass class block extends ovm_component; `ovm_component_utils(block) comp c_inst; virtual function void build(); set_inst_override_by_type("c_inst",comp::get_type(), mycomp::get_type()); endfunction ... endclass
static function void set_type_override( string original_type_name, string override_type_name, bit replace = 1 )
A convenience function for ovm_factory::set_type_override_by_name, this method configures the factory to create an object of type override_type_name whenever the factory is asked to produce a type represented by original_type_name. This method is equivalent to:
factory.set_type_override_by_name(original_type_name, override_type_name, replace);
The original_type_name typically refers to a preregistered type in the factory. It may, however, be any arbitrary string. Subsequent calls to create_component or create_object with the same string and matching instance path will produce the type represented by override_type_name. The override_type_name must refer to a preregistered type in the factory.
function void set_inst_override( string relative_inst_path, string original_type_name, string override_type_name )
A convenience function for ovm_factory::set_inst_override_by_type, this method registers a factory override for components created at this level of hierarchy or below. In typical usage, this method is equivalent to:
factory.set_inst_override_by_name({get_full_name(),".", relative_inst_path}, original_type_name, override_type_name);
The relative_inst_path is relative to this component and may include wildcards. The original_type_name typically refers to a preregistered type in the factory. It may, however, be any arbitrary string. Subsequent calls to create_component or create_object with the same string and matching instance path will produce the type represented by override_type_name. The override_type_name must refer to a preregistered type in the factory.
function void print_override_info( string requested_type_name, string name = "" )
This factory debug method performs the same lookup process as create_object and create_component, but instead of creating an object, it prints information about what type of object would be created given the provided arguments.
This interface provides versions of the set_report_* methods in the ovm_report_object base class that are applied recursively to this component and all its children.
When a report is issued and its associated action has the LOG bit set, the report will be sent to its associated FILE descriptor.
function void set_report_severity_action_hier ( ovm_severity severity, ovm_action action )
function void set_report_id_action_hier ( string id, ovm_action action )
function void set_report_severity_id_action_hier( ovm_severity severity, string id, ovm_action action )
These methods recursively associate the specified action with reports of the given severity, id, or severity-id pair. An action associated with a particular severity-id pair takes precedence over an action associated with id, which takes precedence over an an action associated with a severity.
For a list of severities and their default actions, refer to ovm_report_handler.
function void set_report_default_file_hier ( OVM_FILE file )
function void set_report_severity_file_hier ( ovm_severity severity, OVM_FILE file )
function void set_report_id_file_hier ( string id, OVM_FILE file )
function void set_report_severity_id_file_hier( ovm_severity severity, string id, OVM_FILE file )
These methods recursively associate the specified FILE descriptor with reports of the given severity, id, or severity-id pair. A FILE associated with a particular severity-id pair takes precedence over a FILE associated with id, which take precedence over an a FILE associated with a severity, which takes precedence over the default FILE descriptor.
For a list of severities and other information related to the report mechanism, refer to ovm_report_handler.
function void set_report_verbosity_level_hier ( int verbosity )
This method recursively sets the maximum verbosity level for reports for this component and all those below it. Any report from this component subtree whose verbosity exceeds this maximum will be ignored.
See ovm_report_handler for a list of predefined message verbosity levels and their meaning.
These methods comprise the component-based transaction recording interface. The methods can be used to record the transactions that this component “sees”, i.e. produces or consumes.
The API and implementation are subject to change once a vendor-independent use-model is determined.
function void accept_tr ( ovm_transaction tr, time accept_time = )
This function marks the acceptance of a transaction, tr, by this component. Specifically, it performs the following actions:
virtual protected function void do_accept_tr ( ovm_transaction tr )
The accept_tr method calls this function to accommodate any user-defined post-accept action. Implementations should call super.do_accept_tr to ensure correct operation.
function integer begin_tr ( ovm_transaction tr, string stream_name = "main", string label = "", string desc = "", time begin_time = 0 )
This function marks the start of a transaction, tr, by this component. Specifically, it performs the following actions:
If recording is enabled (recording_detail != OVM_OFF), then a new database-transaction is started on the component’s transaction stream given by the stream argument. No transaction properties are recorded at this time.
A handle to the transaction is returned. The meaning of this handle, as well as the interpretation of the arguments stream_name, label, and desc are vendor specific.
function integer begin_child_tr ( ovm_transaction tr, integer parent_handle = 0, string stream_name = "main", string label = "", string desc = "", time begin_time = 0 )
This function marks the start of a child transaction, tr, by this component. Its operation is identical to that of begin_tr, except that an association is made between this transaction and the provided parent transaction. This association is vendor-specific.
virtual protected function void do_begin_tr ( ovm_transaction tr, string stream_name, integer tr_handle )
The begin_tr and begin_child_tr methods call this function to accommodate any user-defined post-begin action. Implementations should call super.do_begin_tr to ensure correct operation.
function void end_tr ( ovm_transaction tr, time end_time = 0, bit free_handle = 1 )
This function marks the end of a transaction, tr, by this component. Specifically, it performs the following actions:
The transaction’s properties are recorded to the database-transaction on which it was started, and then the transaction is ended. Only those properties handled by the transaction’s do_record method (and optional `ovm_*_field macros) are recorded.
The free_handle bit indicates that this transaction is no longer needed. The implementation of free_handle is vendor-specific.
function integer record_error_tr ( string stream_name = "main", ovm_object info = null, string label = "error_tr", string desc = "", time error_time = 0, bit keep_active = 0 )
This function marks an error transaction by a component. Properties of the given ovm_object, info, as implemented in its <do_record> method, are recorded to the transaction database.
An error_time of 0 indicates to use the current simulation time. The keep_active bit determines if the handle should remain active. If 0, then a zero-length error transaction is recorded. A handle to the database-transaction is returned.
Interpretation of this handle, as well as the strings stream_name, label, and desc, are vendor-specific.
function integer record_event_tr ( string stream_name = "main", ovm_object info = null, string label = "event_tr", string desc = "", time event_time = 0, bit keep_active = 0 )
This function marks an event transaction by a component.
An event_time of 0 indicates to use the current simulation time.
A handle to the transaction is returned. The keep_active bit determines if the handle may be used for other vendor-specific purposes.
The strings for stream_name, label, and desc are vendor-specific identifiers for the transaction.
bit print_enabled = 1
This bit determines if this component should automatically be printed as a child of its parent object.
By default, all children are printed. However, this bit allows a parent component to disable the printing of specific children.
The ovm_object class is the base class for all OVM data and hierarchical classes.
virtual class ovm_object extends ovm_void
The ovm_report_object provides an interface to the OVM reporting facility.
class ovm_report_object extends ovm_object
The ovm_component class is the root base class for OVM components.
virtual class ovm_component extends ovm_report_object
Creates a new component with the given leaf instance name and handle to to its parent.
function new ( string name, ovm_component parent )
Returns a handle to this component’s parent, or null if it has no parent.
virtual function ovm_component get_parent ()
Returns the full hierarchical name of this object.
virtual function string get_full_name ()
function ovm_component get_child ( string name )
function int get_next_child ( ref string name )
These methods are used to iterate through this component’s children, if any.
function int get_first_child ( ref string name )
Returns the number of this component’s children.
function int get_num_children ()
Returns 1 if this component has a child with the given name, 0 otherwise.
function int has_child ( string name )
Renames this component to name and recalculates all descendants’ full names.
virtual function void set_name ( string name )
Looks for a component with the given hierarchical name relative to this component.
function ovm_component lookup ( string name )
The build phase callback is the first of several methods automatically called during the course of simulation.
virtual function void build ()
The connect phase callback is one of several methods automatically called during the course of simulation.
virtual function void connect ()
The end_of_elaboration phase callback is one of several methods automatically called during the course of simulation.
virtual function void end_of_elaboration ()
The start_of_simulation phase callback is one of several methods automatically called during the course of simulation.
virtual function void start_of_simulation ()
The run phase callback is the only predefined phase that is time-consuming, i.e., task-based.
virtual task run ()
The extract phase callback is one of several methods automatically called during the course of simulation.
virtual function void extract ()
The check phase callback is one of several methods automatically called during the course of simulation.
virtual function void check ()
The report phase callback is the last of several predefined phase methods automatically called during the course of simulation.
virtual function void report ()
Suspends the process tree spawned from this component’s currently executing task-based phase, e.g.
virtual task suspend ()
Resumes the process tree spawned from this component’s currently executing task-based phase, e.g.
virtual task resume ()
Returns the status of the parent process associated with the currently running task-based phase, e.g., run.
function string status ()
Kills the process tree associated with this component’s currently running task-based phase, e.g., run.
virtual function void kill ()
Recursively calls kill on this component and all its descendants, which abruptly ends the currently running task-based phase, e.g., run.
virtual function void do_kill_all ()
The stop task is called when this component’s enable_stop_interrupt bit is set and global_stop_request is called during a task-based phase, e.g., run.
virtual task stop ( string ph_name )
This bit allows a component to raise an objection to the stopping of the current phase.
protected int enable_stop_interrupt = 0
Convenience function for ovm_top.stop_request().
function void global_stop_request()
Processes all port, export, and imp connections.
virtual function void resolve_bindings ()
virtual function void set_config_int ( string inst_name, string field_name, ovm_bitstream_t value )
virtual function void set_config_string ( string inst_name, string field_name, string value )
Calling set_config_* causes configuration settings to be created and placed in a table internal to this component.
virtual function void set_config_object ( string inst_name, string field_name, ovm_object value, bit clone = 1 )
virtual function bit get_config_int ( string field_name, inout ovm_bitstream_t value )
virtual function bit get_config_string ( string field_name, inout string value )
These methods retrieve configuration settings made by previous calls to their set_config_* counterparts.
virtual function bit get_config_object ( string field_name, inout ovm_object value, input bit clone = 1 )
Check all configuration settings in a components configuration table to determine if the setting has been used, overridden or not used.
function void check_config_usage ( bit recurse = 1 )
Searches for all config settings matching this component’s instance path.
virtual function void apply_config_settings ( bit verbose = )
Called without arguments, print_config_settings prints all configuration information for this component, as set by previous calls to set_config_*.
function void print_config_settings ( string field = "", ovm_component comp = null, bit recurse = 0 )
Setting this static variable causes get_config_* to print info about matching configuration settings as they are being applied.
static bit print_config_matches = 0
Objections provide a facility for coordinating status information between two or more participating components, objects, and even module-based IP.
class ovm_objection extends ovm_report_object
The raised callback is called when a decendant of the component instance raises the specfied objection.
virtual function void raised ( ovm_objection objection, ovm_object source_obj, int count )
The dropped callback is called when a decendant of the component instance raises the specfied objection.
virtual function void dropped ( ovm_objection objection, ovm_object source_obj, int count )
The all_dropped callback is called when a decendant of the component instance raises the specfied objection.
virtual task all_dropped ( ovm_objection objection, ovm_object source_obj, int count )
As the name implies, ovm_factory is used to manufacture (create) OVM objects and components.
class ovm_factory
A convenience function for ovm_factory::create_component_by_name, this method calls upon the factory to create a new child component whose type corresponds to the preregistered type name, requested_type_name, and instance name, name.
function ovm_component create_component ( string requested_type_name, string name )
Creates and returns a component or object of the requested type, which may be specified by type or by name.
function ovm_component create_component_by_name ( string requested_type_name, string parent_inst_path = "", string name, ovm_component parent )
A convenience function for ovm_factory::create_object_by_name, this method calls upon the factory to create a new object whose type corresponds to the preregistered type name, requested_type_name, and instance name, name.
function ovm_object create_object ( string requested_type_name, string name = "" )
function ovm_object create_object_by_name ( string requested_type_name, string parent_inst_path = "", string name = "" )
A convenience function for ovm_factory::set_type_override_by_type, this method registers a factory override for components and objects created at this level of hierarchy or below.
static function void set_type_override_by_type ( ovm_object_wrapper original_type, ovm_object_wrapper override_type, bit replace = 1 )
function void set_type_override_by_type ( ovm_object_wrapper original_type, ovm_object_wrapper override_type, bit replace = 1 )
A convenience function for ovm_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, ovm_object_wrapper original_type, ovm_object_wrapper override_type )
function void set_inst_override_by_type ( ovm_object_wrapper original_type, ovm_object_wrapper override_type, string full_inst_path )
A convenience function for ovm_factory::set_type_override_by_name, this method configures the factory to create an object of type override_type_name whenever the factory is asked to produce a type represented by original_type_name.
static function void set_type_override( string original_type_name, string override_type_name, bit replace = 1 )
Configures the factory to create an object of the override’s type whenever a request is made to create an object of the original type, provided no instance override applies.
function void set_type_override_by_name ( string original_type_name, string override_type_name, bit replace = 1 )
A convenience function for ovm_factory::set_inst_override_by_type, this method registers a factory override for components created at this level of hierarchy or below.
function void set_inst_override( string relative_inst_path, string original_type_name, string override_type_name )
This factory debug method performs the same lookup process as create_object and create_component, but instead of creating an object, it prints information about what type of object would be created given the provided arguments.
function void print_override_info( string requested_type_name, string name = "" )
function void set_report_severity_action_hier ( ovm_severity severity, ovm_action action )
function void set_report_id_action_hier ( string id, ovm_action action )
These methods recursively associate the specified action with reports of the given severity, id, or severity-id pair.
function void set_report_severity_id_action_hier( ovm_severity severity, string id, ovm_action action )
function void set_report_default_file_hier ( OVM_FILE file )
function void set_report_severity_file_hier ( ovm_severity severity, OVM_FILE file )
function void set_report_id_file_hier ( string id, OVM_FILE file )
These methods recursively associate the specified FILE descriptor with reports of the given severity, id, or severity-id pair.
function void set_report_severity_id_file_hier( ovm_severity severity, string id, OVM_FILE file )
This method recursively sets the maximum verbosity level for reports for this component and all those below it.
function void set_report_verbosity_level_hier ( int verbosity )
This function marks the acceptance of a transaction, tr, by this component.
function void accept_tr ( ovm_transaction tr, time accept_time = )
The accept_tr method calls this function to accommodate any user-defined post-accept action.
virtual protected function void do_accept_tr ( ovm_transaction tr )
This function marks the start of a transaction, tr, by this component.
function integer begin_tr ( ovm_transaction tr, string stream_name = "main", string label = "", string desc = "", time begin_time = 0 )
This function marks the start of a child transaction, tr, by this component.
function integer begin_child_tr ( ovm_transaction tr, integer parent_handle = 0, string stream_name = "main", string label = "", string desc = "", time begin_time = 0 )
The begin_tr and begin_child_tr methods call this function to accommodate any user-defined post-begin action.
virtual protected function void do_begin_tr ( ovm_transaction tr, string stream_name, integer tr_handle )
This function marks the end of a transaction, tr, by this component.
function void end_tr ( ovm_transaction tr, time end_time = 0, bit free_handle = 1 )
The end_tr method calls this function to accommodate any user-defined post-end action.
virtual protected function void do_end_tr ( ovm_transaction tr, integer tr_handle )
This function marks an error transaction by a component.
function integer record_error_tr ( string stream_name = "main", ovm_object info = null, string label = "error_tr", string desc = "", time error_time = 0, bit keep_active = 0 )
This function marks an event transaction by a component.
function integer record_event_tr ( string stream_name = "main", ovm_object info = null, string label = "event_tr", string desc = "", time event_time = 0, bit keep_active = 0 )
This bit determines if this component should automatically be printed as a child of its parent object.
bit print_enabled = 1
The ovm_root class serves as the implicit top-level and phase controller for all OVM components.
class ovm_root extends ovm_component
The ovm_report_handler is the class to which most methods in ovm_report_object delegate.
class ovm_report_handler
Calls srandom on the object to reseed the object using the OVM seeding mechanism, which sets the seed based on type name and instance name instead of based on instance position in a thread.
function void reseed ()
Returns the name of the object, as provided by the name argument in the new constructor or set_name method.
virtual function string get_name ()
The print method deep-prints this object’s properties in a format and manner governed by the given printer argument; if the printer argument is not provided, the global ovm_default_printer is used.
function void print ( ovm_printer printer = null )
Built-in end-of-test coordination
class ovm_test_done_objection extends ovm_objection
An instance of the ovm_test_done_objection class, this object is used by components to coordinate when to end the currently running task-based phase.
ovm_test_done_objection ovm_test_done = ovm_test_done_objection::get()
The ovm_phase class is used for defining phases for ovm_component and its subclasses.
virtual class ovm_phase
Connects this port to the given provider port.
virtual function void connect ( this_type provider )
Convenience function for ovm_top.phase_timeout = timeout.
function void set_global_timeout( time timeout )
The ovm_component_registry serves as a lightweight proxy for a component of type T and type name Tname, a string.
class ovm_component_registry #( type T = ovm_component, string Tname = "<unknown>" ) extends ovm_object_wrapper
The ovm_object_registry serves as a lightweight proxy for an ovm_object of type T and type name Tname, a string.
class ovm_object_registry #( type T = ovm_object, string Tname = "<unknown>" ) extends ovm_object_wrapper
function ovm_object create_object_by_type ( ovm_object_wrapper requested_type, string parent_inst_path = "", string name = "" )
function ovm_component create_component_by_type ( ovm_object_wrapper requested_type, string parent_inst_path = "", string name, ovm_component parent )
Calling accept_tr indicates that the transaction has been accepted for processing by a consumer component, such as an ovm_driver.
function void accept_tr ( time accept_time = )
This function indicates that the transaction has been started and is not the child of another transaction.
function integer begin_tr ( time begin_time = )
This function indicates that the transaction execution has ended.
function void end_tr ( time end_time = 0, bit free_handle = 1 )