ovm_component.svh

Go to the documentation of this file.
00001 // $Id: ovm_component.svh 15 2009-06-21 17:30:53Z seanoboyle $
00002 //------------------------------------------------------------------------------
00003 //   Copyright 2007-2009 Mentor Graphics Corporation
00004 //   Copyright 2007-2009 Cadence Design Systems, Inc.
00005 //   All Rights Reserved Worldwide
00006 //
00007 //   Licensed under the Apache License, Version 2.0 (the
00008 //   "License"); you may not use this file except in
00009 //   compliance with the License.  You may obtain a copy of
00010 //   the License at
00011 //
00012 //       http://www.apache.org/licenses/LICENSE-2.0
00013 //
00014 //   Unless required by applicable law or agreed to in
00015 //   writing, software distributed under the License is
00016 //   distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
00017 //   CONDITIONS OF ANY KIND, either express or implied.  See
00018 //   the License for the specific language governing
00019 //   permissions and limitations under the License.
00020 //------------------------------------------------------------------------------
00021 
00022 `ifndef OVM_COMPONENT_SVH
00023 `define OVM_COMPONENT_SVH
00024 
00025 //typedef class ovm_config_setting;      
00026 //typedef class ovm_phase;
00027 //typedef class ovm_event_pool;
00028 //typedef class ovm_object;
00029 //typedef class ovm_transaction;
00030 //typedef class ovm_printer;
00031 //typedef class ovm_root;
00032 
00033 `include "base/ovm_config.svh"
00034 
00035 //------------------------------------------------------------------------------
00036 //
00037 // CLASS: ovm_component
00038 //
00039 // The ovm_component class is the root base class for OVM components. In
00040 // addition to the features inherited from <ovm_object> and <ovm_report_object>,
00041 // ovm_component provides the following interfaces:
00042 //
00043 // Hierarchy - provides methods for searching and traversing the component
00044 //     hierarchy.
00045 //
00046 // Configuration - provides methods for configuring component topology and other
00047 //     parameters ahead of and during component construction.
00048 //
00049 // Phasing - defines a phased test flow that all components follow. Derived
00050 //     components implement one or more of the predefined phase callback methods
00051 //     to perform their function. During simulation, all components' callbacks
00052 //     are executed in precise order. Phasing is controlled by ovm_top, the
00053 //     singleton instance of <ovm_root>.
00054 //
00055 // Reporting - provides a convenience interface to the <ovm_report_handler>. All
00056 //     messages, warnings, and errors are processed through this interface.
00057 //
00058 // Transaction recording - provides methods for recording the transactions
00059 //     produced or consumed by the component to a transaction database (vendor
00060 //     specific). 
00061 //
00062 // Factory - provides a convenience interface to the <ovm_factory>. The factory
00063 //     is used to create new components and other objects based on type-wide and
00064 //     instance-specific configuration.
00065 //
00066 // The ovm_component is automatically seeded during construction using OVM
00067 // seeding, if enabled. All other objects must be manually reseeded, if
00068 // appropriate. See <ovm_object::reseed> for more information.
00069 //
00070 //------------------------------------------------------------------------------
00071 
00072 virtual class ovm_component extends ovm_report_object;
00073 
00074   // Function: new
00075   //
00076   // Creates a new component with the given leaf instance ~name~ and handle to
00077   // to its ~parent~.  If the component is a top-level component (i.e. it is
00078   // created in a static module or interface), ~parent~ should be null.
00079   //
00080   // The component will be inserted as a child of the ~parent~ object, if any.
00081   // If ~parent~ already has a child by the given ~name~, an error is produced.
00082   //
00083   // If ~parent~ is null, then the component will become a child of the
00084   // implicit top-level component, ~ovm_top~.
00085   //
00086   // All classes derived from ovm_component must call super.new(name,parent).
00087 
00088   extern function new (string name, ovm_component parent);
00089 
00090 
00091   //----------------------------------------------------------------------------
00092   // Group: Hierarchy Interface
00093   //----------------------------------------------------------------------------
00094   //
00095   // These methods provide user access to information about the component
00096   // hierarchy, i.e., topology.
00097   // 
00098   //----------------------------------------------------------------------------
00099 
00100   // Function: get_parent
00101   //
00102   // Returns a handle to this component's parent, or null if it has no parent.
00103 
00104   extern virtual function ovm_component get_parent ();
00105 
00106 
00107   // Function: get_full_name
00108   //
00109   // Returns the full hierarchical name of this object. The default
00110   // implementation concatenates the hierarchical name of the parent, if any,
00111   // with the leaf name of this object, as given by <ovm_object::get_name>. 
00112 
00113   extern virtual function string get_full_name ();
00114 
00115 
00116   // Function: get_child
00117   extern function ovm_component get_child (string name);
00118 
00119   // Function: get_next_child
00120   extern function int get_next_child (ref string name);
00121 
00122   // Function: get_first_child
00123   //
00124   // These methods are used to iterate through this component's children, if
00125   // any. For example, given a component with an object handle, ~comp~, the
00126   // following code calls <ovm_object::print> for each child:
00127   //
00128   //|    string name;
00129   //|    ovm_component child;
00130   //|    if (comp.get_first_child(name))
00131   //|      do begin
00132   //|        child = comp.get_child(name);
00133   //|        child.print();
00134   //|      end while (comp.get_next_child(name));
00135 
00136   extern function int get_first_child (ref string name);
00137 
00138 
00139   // Function: get_num_children
00140   //
00141   // Returns the number of this component's children. 
00142 
00143   extern function int get_num_children ();
00144 
00145 
00146   // Function: has_child
00147   //
00148   // Returns 1 if this component has a child with the given ~name~, 0 otherwise.
00149 
00150   extern function int has_child (string name);
00151 
00152 
00153   // Function: set_name
00154   //
00155   // Renames this component to ~name~ and recalculates all descendants'
00156   // full names.
00157 
00158   extern virtual function void set_name (string name);
00159 
00160   
00161   // Function: lookup
00162   //
00163   // Looks for a component with the given hierarchical ~name~ relative to this
00164   // component. If the given ~name~ is preceded with a '.' (dot), then the search
00165   // begins relative to the top level (absolute lookup). The handle of the
00166   // matching component is returned, else null. The name must not contain
00167   // wildcards.
00168 
00169   extern function ovm_component lookup (string name);
00170 
00171 
00172 
00173   //----------------------------------------------------------------------------
00174   // Group: Phasing Interface
00175   //----------------------------------------------------------------------------
00176   // Components execute their behavior in strictly ordered, pre-defined phases.
00177   // Each phase is defined by its own method, which derived components can
00178   // override to incorporate component-specific behavior. During simulation,
00179   // the phases are executed one by one, where one phase must complete before
00180   // the next phase begins. The following briefly describe each phase:
00181   //
00182   // new - Also known as the ~constructor~, the component does basic
00183   //     initialization of any members not subject to configuration.
00184   //
00185   // build - The component constructs its children. It uses the get_config
00186   //     interface to obtain any configuration for itself, the set_config
00187   //     interface to set any configuration for its own children, and the
00188   //     factory interface for actually creating the children and other
00189   //     objects it might need.
00190   // 
00191   // connect - The component now makes connections (binds TLM ports and
00192   //     exports) from child-to-child or from child-to-self (i.e. to promote a
00193   //     child port or export up the hierarchy for external access. Afterward,
00194   //     all connections are checked via <resolve_bindings> before entering
00195   //     the <end_of_elaboration> phase. 
00196   //
00197   // end_of_elaboration - At this point, the entire testbench environment has
00198   //     been built and connected. No new components and connections may be
00199   //     created from this point forward. Components can do final checks for
00200   //     proper connectivity, and it can initiate communication with other tools
00201   //     that require stable, quasi-static component structure..
00202   //
00203   // start_of_simulation - The simulation is about to begin, and this phase
00204   //     can be used to perform any pre-run activity such as displaying banners,
00205   //     printing final testbench topology and configuration information.
00206   //
00207   // run - This is where verification takes place. It is the only predefined,
00208   //     time-consuming phase. A component's primary function is implemented
00209   //     in the <run> task. Other processes may be forked if desired. When
00210   //     a component returns from its run task, it does not signify completion
00211   //     of its run phase. Any processes that it may have forked ~continue to
00212   //     run~. The run phase terminates in one of three ways:
00213   //
00214   //     stop - When a component's <enable_stop_interrupt> bit is set and
00215   //            <global_stop_request> is called, the component's <stop> task
00216   //            is called. Components can implement stop to allow completion
00217   //            of in-progress transactions, <flush> queues, etc. Upon return
00218   //            from stop() by all enabled components, a <kill> is issued.
00219   //
00220   //     kill - When called, all component's <run> processes are killed
00221   //            immediately. While kill can be called directly, it is
00222   //            recommended that components use the stopping mechanism,
00223   //            which affords a more ordered and safe shut-down.
00224   //
00225   //     timeout - If a timeout was set, then the phase ends if it expires
00226   //            before either of the above occur. Without a stop, kill, or
00227   //            timeout, simulation can continue "forever", or the simulator
00228   //            may end simulation prematurely if it determines that
00229   //            all processes are waiting.
00230   //
00231   // extract - This phase can be used to extract simulation results from
00232   //     coverage collectors and scoreboards, collect status/error counts,
00233   //     statistics, and other information from components in bottom-up order.
00234   //     Being a separate phase, extract ensures all relevant data from
00235   //     potentially independent sources (i.e. other components) are collected
00236   //     before being checked in the next phase.
00237   //
00238   // check - Having extracted vital simulation results in the previous phase,
00239   //     the check phase can be used to validate such data and determine
00240   //     the overall simulation outcome. It too executes bottom-up.
00241   //
00242   // report - Finally, the report phase is used to output results to files
00243   //     and/or the screen. 
00244   //
00245   // All task-based phases (<run> is the only pre-defined task phase) will run
00246   // forever until killed or stopped via <kill> or <global_stop_request>.
00247   // The latter causes each component's <stop> task to get called back if
00248   // its <enable_stop_interrupt> bit is set. After all components' stop tasks
00249   // return, the OVM will end the phase.
00250   //
00251   // Note- the post_new, export_connections, import_connections, configure,
00252   // and pre_run phases are deprecated. <build> replaces post_new, <connect>
00253   // replaces both import_ and export_connections, and <start_of_simulation>
00254   // replaces pre_run.
00255   //
00256   //----------------------------------------------------------------------------
00257 
00258   // Function: build
00259   //
00260   // The build phase callback is the first of several methods automatically
00261   // called during the course of simulation. The build phase is the second of
00262   // a two-pass construction process (the first is the built-in new method).
00263   //
00264   // The build phase can add additional hierarchy based on configuration
00265   // information not available at time of initial construction. 
00266   // Any override should call super.build().
00267   //
00268   // Starting after the initial construction phase (<new> method) has completed,
00269   // the build phase consists of calling all components' build methods
00270   // recursively top-down, i.e., parents' build are executed before the
00271   // children. This is the only phase that executes top-down.
00272   //
00273   // See <ovm_phase> for more information on phases.
00274 
00275   extern virtual function void build ();
00276 
00277 
00278   // Function: connect
00279   //
00280   // The connect phase callback is one of several methods automatically called
00281   // during the course of simulation.
00282   //
00283   // Starting after the <build> phase has completed, the connect phase consists
00284   // of calling all components' connect methods recursively in depth-first,
00285   // bottom-up order, i.e., children are executed before their parents.
00286   //
00287   // Generally, derived classes should override this method to make port and
00288   // export connections via the similarly-named <ovm_port_base #(IF)::connect>
00289   // method. Any override should call super.connect().
00290   //
00291   // This method should never be called directly. 
00292   //
00293   // See <ovm_phase> for more information on phases.
00294 
00295   extern virtual function void connect ();
00296 
00297 
00298   // Function: end_of_elaboration
00299   //
00300   // The end_of_elaboration phase callback is one of several methods
00301   // automatically called during the course of simulation.
00302   //
00303   // Starting after the <connect> phase has completed, this phase consists of
00304   // calling all components' end_of_elaboration methods recursively in
00305   // depth-first, bottom-up order, i.e., children are executed before their
00306   // parents. 
00307   //
00308   // Generally, derived classes should override this method to perform any
00309   // checks on the elaborated hierarchy before the simulation phases begin.
00310   // Any override should call super.end_of_elaboration().
00311   //
00312   // This method should never be called directly.
00313   //
00314   // See <ovm_phase> for more information on phases.
00315 
00316   extern virtual function void end_of_elaboration ();
00317 
00318 
00319   // Function: start_of_simulation
00320   //
00321   // The start_of_simulation phase callback is one of several methods
00322   // automatically called during the course of simulation.
00323   //
00324   // Starting after the <end_of_elaboration> phase has completed, this phase
00325   // consists of calling all components' start_of_simulation methods recursively
00326   // in depth-first, bottom-up order, i.e. children are executed before their
00327   // parents. 
00328   //
00329   // Generally, derived classes should override this method to perform component-
00330   // specific pre-run operations, such as discovery of the elaborated hierarchy,
00331   // printing banners, etc. Any override should call super.start_of_simulation().
00332   //
00333   // This method should never be called directly.
00334   //
00335   // See <ovm_phase> for more information on phases.
00336 
00337   extern virtual function void start_of_simulation ();
00338 
00339 
00340   // Task: run
00341   //
00342   // The run phase callback is the only predefined phase that is time-consuming,
00343   // i.e., task-based. It executes after the <start_of_simulation> phase has
00344   // completed. Derived classes should override this method to perform the bulk
00345   // of its functionality, forking additional processes if needed.
00346   //
00347   // In the run phase, all components' run tasks are forked as independent
00348   // processes.  Returning from its run task does not signify completion of a
00349   // component's run phase; any processes forked by run continue to run.
00350   //
00351   // The run phase terminates in one of three ways.
00352   //
00353   // 1 - explicit call to <global_stop_request> - 
00354   //   When <global_stop_request> is called, an ordered shut-down for the
00355   //   currently running phase begins. First, all enabled components' status
00356   //   tasks are called bottom-up, i.e., childrens' <stop> tasks are called before
00357   //   the parent's. A component is enabled by its enable_stop_interrupt bit.
00358   //   Each component can implement stop to allow completion of in-progress
00359   //   transactions, flush queues, and other shut-down activities. Upon return
00360   //   from stop by all enabled components, the recursive do_kill_all is called
00361   //   on all top-level component(s).
00362   //
00363   // 2 - explicit call to <kill> or do_kill_all -
00364   //   When kill called, this component's run processes are killed immediately.
00365   //   The do_kill_all methods applies to this component and all its
00366   //   descendants. Use of this method is not recommended. It is better to use
00367   //   the stopping mechanism, which affords a more ordered, safer shut-down.
00368   //
00369   // 3 - timeout -
00370   //   The phase ends if the timeout expires before an explicit call to
00371   //   <global_stop_request> or kill. By default, the timeout is set to near the
00372   //   maximum simulation time possible. You may override this via
00373   //   <set_global_timeout>, but you cannot disable the timeout completely.
00374   //
00375   //   If the default timeout occurs in your simulation, or if simulation never
00376   //   ends despite completion of your test stimulus, then it usually indicates
00377   //   a missing call to <global_stop_request>.
00378   //
00379   // The run task should never be called directly.
00380   //
00381   // See <ovm_phase> for more information on phases.
00382 
00383   extern virtual task run ();
00384 
00385 
00386   // Function: extract
00387   //
00388   // The extract phase callback is one of several methods automatically called
00389   // during the course of simulation. 
00390   //
00391   // Starting after the <run> phase has completed, the extract phase consists of
00392   // calling all components' extract methods recursively in depth-first,
00393   // bottom-up order, i.e., children are executed before their parents. 
00394   //
00395   // Generally, derived classes should override this method to collect
00396   // information for the subsequent <check> phase when such information needs to
00397   // be collected in a hierarchical, bottom-up manner. Any override should
00398   // call super.extract().
00399   //
00400   // This method should never be called directly.
00401   //
00402   // See <ovm_phase> for more information on phases.
00403 
00404   extern virtual function void extract ();
00405 
00406 
00407   // Function: check
00408   //
00409   // The check phase callback is one of several methods automatically called
00410   // during the course of simulation.
00411   //
00412   // Starting after the <extract> phase has completed, the check phase consists of
00413   // calling all components' check methods recursively in depth-first, bottom-up
00414   // order, i.e., children are executed before their parents. 
00415   //
00416   // Generally, derived classes should override this method to perform component
00417   // specific, end-of-test checks. Any override should call super.check().
00418   //
00419   // This method should never be called directly.
00420   //
00421   // See <ovm_phase> for more information on phases.
00422 
00423   extern virtual function void check ();
00424 
00425 
00426   // Function: report
00427   //
00428   // The report phase callback is the last of several predefined phase
00429   // methods automatically called during the course of simulation.
00430   //
00431   // Starting after the <check> phase has completed, the report phase consists
00432   // of calling all components' report methods recursively in depth-first,
00433   // bottom-up order, i.e., children are executed before their parents. 
00434   //
00435   // Generally, derived classes should override this method to perform
00436   // component-specific reporting of test results. Any override should
00437   // call super.report().
00438   //
00439   // This method should never be called directly.
00440   //
00441   // See <ovm_phase> for more information on phases.
00442 
00443   extern virtual function void report ();
00444 
00445 
00446   // Task: suspend
00447   //
00448   // Suspends the process tree spawned from this component's currently
00449   // executing task-based phase, e.g. <run>.
00450 
00451   extern virtual task suspend ();
00452 
00453 
00454   // Task: resume
00455   //
00456   // Resumes the process tree spawned from this component's currently
00457   // executing task-based phase, e.g. <run>.
00458 
00459   extern virtual task resume ();
00460 
00461 
00462   // Function: status
00463   //
00464   // Returns the status of the parent process associated with the currently
00465   // running task-based phase, e.g., <run>.
00466 
00467   extern function string status ();
00468 
00469  
00470   // Function: kill
00471   //
00472   // Kills the process tree associated with this component's currently running
00473   // task-based phase, e.g., <run>.
00474   //
00475   // An alternative mechanism for stopping the <run> phase is the stop request.
00476   // Calling <global_stop_request> causes all components' run processes to be
00477   // killed, but only after all components have had the opportunity to complete
00478   // in progress transactions and shutdown cleanly via their <stop> tasks.
00479 
00480   extern virtual function void kill ();
00481 
00482 
00483   // Task: stop
00484   //
00485   // The stop task is called when this component's <enable_stop_interrupt> bit
00486   // is set and <global_stop_request> is called during a task-based phase,
00487   // e.g., <run>.
00488   //
00489   // Before a phase is abruptly ended, e.g., when a test deems the simulation
00490   // complete, some components may need extra time to shut down cleanly. Such
00491   // components may implement stop to finish the currently executing
00492   // transaction, flush the queue, or perform other cleanup. Upon return from
00493   // its stop, a component signals it is ready to be stopped. 
00494   //
00495   // The stop method will not be called if <enable_stop_interrupt> is 0.
00496   //
00497   // The default implementation of stop is empty, i.e., it will return immediately.
00498   //
00499   // This method should never be called directly.
00500 
00501   extern virtual task stop (string ph_name);
00502 
00503 
00504   // Variable: enable_stop_interrupt
00505   //
00506   // This bit allows a component to raise an objection to the stopping of the
00507   // current phase. It affects only time consuming phases (such as the <run>
00508   // phase).
00509   //
00510   // When this bit is set, the <stop> task in the component is called as a result
00511   // of a call to <global_stop_request>. Components that are sensitive to an
00512   // immediate killing of its run-time processes should set this bit and
00513   // implement the stop task to prepare for shutdown.
00514 
00515   protected int enable_stop_interrupt = 0;
00516 
00517 
00518   // Function: resolve_bindings
00519   //
00520   // Processes all port, export, and imp connections. Checks whether each port's
00521   // min and max connection requirements are met.
00522   //
00523   // It is called just before the <end_of_elaboration> phase.
00524   //
00525   // Users should not call directly.
00526 
00527   extern virtual function void resolve_bindings ();
00528 
00529 
00530 
00531   //----------------------------------------------------------------------------
00532   // Group: Configuration Interface
00533   //----------------------------------------------------------------------------
00534   //
00535   // Components can be designed to be user-configurable in terms of its
00536   // topology (the type and number of children it has), mode of operation, and
00537   // run-time parameters (knobs). The configuration interface accommodates
00538   // this common need, allowing component composition and state to be modified
00539   // without having to derive new classes or new class hierarchies for
00540   // every configuration scenario. 
00541   //
00542   //----------------------------------------------------------------------------
00543 
00544 
00545   // Function: set_config_int
00546 
00547   extern virtual function void set_config_int (string inst_name,  
00548                                                string field_name,
00549                                                ovm_bitstream_t value);
00550 
00551   // Function: set_config_string
00552 
00553   extern virtual function void set_config_string (string inst_name,  
00554                                                   string field_name,
00555                                                   string value);
00556 
00557   // Function: set_config_object
00558   //
00559   // Calling set_config_* causes configuration settings to be created and
00560   // placed in a table internal to this component. There are similar global
00561   // methods that store settings in a global table. Each setting stores the
00562   // supplied ~inst_name~, ~field_name~, and ~value~ for later use by descendent
00563   // components during their construction. (The global table applies to
00564   // all components and takes precedence over the component tables.)
00565   //
00566   // When a descendant component calls a get_config_* method, the ~inst_name~
00567   // and ~field_name~ provided in the get call are matched against all the
00568   // configuration settings stored in the global table and then in each
00569   // component in the parent hierarchy, top-down. Upon the first match, the
00570   // value stored in the configuration setting is returned. Thus, precedence is
00571   // global, following by the top-level component, and so on down to the
00572   // descendent component's parent.
00573   //
00574   // These methods work in conjunction with the get_config_* methods to
00575   // provide a configuration setting mechanism for integral, string, and
00576   // ovm_object-based types. Settings of other types, such as virtual interfaces
00577   // and arrays, can be indirectly supported by defining a class that contains
00578   // them.
00579   //
00580   // Both ~inst_name~ and ~field_name~ may contain wildcards.
00581   //
00582   // - For set_config_int, ~value~ is an integral value that can be anything
00583   //   from 1 bit to 4096 bits.
00584   //
00585   // - For set_config_string, ~value~ is a string.
00586   //
00587   // - For set_config_object, ~value~ must be an <ovm_object>-based object or
00588   //   null.  Its clone argument specifies whether the object should be cloned.
00589   //   If set, the object is cloned both going into the table (during the set)
00590   //   and coming out of the table (during the get), so that multiple components
00591   //   matched to the same setting (by way of wildcards) do not end up sharing
00592   //   the same object.
00593   //
00594   //   The following message tags are used for configuration setting. You can
00595   //   use the standard ovm report messaging interface to control these
00596   //   messages.
00597   //     CFGNTS    -- The configuration setting was not used by any component.
00598   //                  This is a warning.
00599   //     CFGOVR    -- The configuration setting was overridden by a setting above.
00600   //     CFGSET    -- The configuration setting was used at least once.
00601   //
00602   //
00603   // See <get_config_int>, <get_config_string>, and <get_config_object> for
00604   // information on getting the configurations set by these methods.
00605 
00606 
00607   extern virtual function void set_config_object (string inst_name,  
00608                                                   string field_name,
00609                                                   ovm_object value,  
00610                                                   bit clone=1);
00611 
00612 
00613   // Function: get_config_int
00614 
00615   extern virtual function bit get_config_int (string field_name,
00616                                               inout ovm_bitstream_t value);
00617 
00618   // Function: get_config_string
00619 
00620   extern virtual function bit get_config_string (string field_name,
00621                                                  inout string value);
00622 
00623   // Function: get_config_object
00624   //
00625   // These methods retrieve configuration settings made by previous calls to
00626   // their set_config_* counterparts. As the methods' names suggest, there is
00627   // direct support for integral types, strings, and objects.  Settings of other
00628   // types can be indirectly supported by defining an object to contain them.
00629   //
00630   // Configuration settings are stored in a global table and in each component
00631   // instance. With each call to a get_config_* method, a top-down search is
00632   // made for a setting that matches this component's full name and the given
00633   // ~field_name~. For example, say this component's full instance name is
00634   // top.u1.u2. First, the global configuration table is searched. If that
00635   // fails, then it searches the configuration table in component 'top',
00636   // followed by top.u1. 
00637   //
00638   // The first instance/field that matches causes ~value~ to be written with the
00639   // value of the configuration setting and 1 is returned. If no match
00640   // is found, then ~value~ is unchanged and the 0 returned.
00641   //
00642   // Calling the get_config_object method requires special handling. Because
00643   // ~value~ is an output of type <ovm_object>, you must provide an ovm_object
00644   // handle to assign to (_not_ a derived class handle). After the call, you can
00645   // then $cast to the actual type.
00646   //
00647   // For example, the following code illustrates how a component designer might
00648   // call upon the configuration mechanism to assign its ~data~ object property,
00649   // whose type myobj_t derives from ovm_object.
00650   //
00651   //|  class mycomponent extends ovm_component;
00652   //|
00653   //|    local myobj_t data;
00654   //|
00655   //|    function void build();
00656   //|      ovm_object tmp;
00657   //|      super.build();
00658   //|      if(get_config_object("data", tmp))
00659   //|        if (!$cast(data, tmp))
00660   //|          $display("error! config setting for 'data' not of type myobj_t");
00661   //|        endfunction
00662   //|      ...
00663   //
00664   // The above example overrides the <build> method. If you want to retain
00665   // any base functionality, you must call super.build().
00666   //
00667   // The ~clone~ bit clones the data inbound. The get_config_object method can
00668   // also clone the data outbound.
00669   //
00670   // See Members for information on setting the global configuration table.
00671 
00672   extern virtual function bit get_config_object (string field_name,
00673                                                  inout ovm_object value,  
00674                                                  input bit clone=1);
00675 
00676 
00677   // Function: check_config_usage
00678   //
00679   // Check all configuration settings in a components configuration table
00680   // to determine if the setting has been used, overridden or not used.
00681   // When ~recurse~ is 1 (default), configuration for this and all child
00682   // components are recursively checked. This function is automatically
00683   // called in the check phase, but can be manually called at any time.
00684   //
00685   // Additional detail is provided by the following message tags:
00686   // * CFGOVR -- lists all configuration settings that have been overridden
00687   // from above.  
00688   // * CFGSET -- lists all configuration settings that have been set.
00689   //
00690   // To get all configuration information prior to the run phase, do something 
00691   // like this in your top object:
00692   //|  function void start_of_simulation();
00693   //|    set_report_id_action_hier(CFGOVR, OVM_DISPLAY);
00694   //|    set_report_id_action_hier(CFGSET, OVM_DISPLAY);
00695   //|    check_config_usage();
00696   //|  endfunction
00697 
00698   extern function void check_config_usage (bit recurse=1);
00699 
00700 
00701   // Function: apply_config_settings
00702   //
00703   // Searches for all config settings matching this component's instance path.
00704   // For each match, the appropriate set_*_local method is called using the
00705   // matching config setting's field_name and value. Provided the set_*_local
00706   // method is implemented, the component property associated with the
00707   // field_name is assigned the given value. 
00708   //
00709   // This function is called by <ovm_component::build>.
00710   //
00711   // The apply_config_settings method determines all the configuration
00712   // settings targeting this component and calls the appropriate set_*_local
00713   // method to set each one. To work, you must override one or more set_*_local
00714   // methods to accommodate setting of your component's specific properties.
00715   // Any properties registered with the optional `ovm_*_field macros do not
00716   // require special handling by the set_*_local methods; the macros provide
00717   // the set_*_local functionality for you. 
00718   //
00719   // If you do not want apply_config_settings to be called for a component,
00720   // then the build() method should be overloaded and you should not call
00721   // super.build(). If this case, you must also set the m_build_done
00722   // bit. Likewise, apply_config_settings can be overloaded to customize
00723   // automated configuration.
00724   //
00725   // When the ~verbose~ bit is set, all overrides are printed as they are
00726   // applied. If the component's <print_config_matches> property is set, then
00727   // apply_config_settings is automatically called with ~verbose~ = 1.
00728 
00729   extern virtual function void apply_config_settings (bit verbose=0);
00730  
00731 
00732   // Function: print_config_settings
00733   //
00734   // Called without arguments, print_config_settings prints all configuration
00735   // information for this component, as set by previous calls to set_config_*.
00736   // The settings are printing in the order of their precedence.
00737   // 
00738   // If ~field~ is specified and non-empty, then only configuration settings
00739   // matching that field, if any, are printed. The field may not contain
00740   // wildcards. 
00741   //
00742   // If ~comp~ is specified and non-null, then the configuration for that
00743   // component is printed.
00744   //
00745   // If ~recurse~ is set, then configuration information for all ~comp~'s
00746   // children and below are printed as well.
00747 
00748   extern function void print_config_settings (string field="", 
00749                                               ovm_component comp=null, 
00750                                               bit recurse=0);
00751 
00752 
00753   // Variable: print_config_matches
00754   //
00755   // Setting this static variable causes get_config_* to print info about
00756   // matching configuration settings as they are being applied.
00757 
00758   static bit print_config_matches = 0; 
00759 
00760 
00761   //----------------------------------------------------------------------------
00762   // Group: Factory Interface
00763   //----------------------------------------------------------------------------
00764   //
00765   // The factory interface provides convenient access to a portion of OVM's
00766   // <ovm_factory> interface. For creating new objects and components, the
00767   // preferred method of accessing the factory is via the object or component
00768   // wrapper (see <ovm_component_registry #(T,Tname)> and
00769   // <ovm_object_registry #(T,Tname)>). The wrapper also provides functions
00770   // for setting type and instance overrides.
00771   //
00772   //----------------------------------------------------------------------------
00773 
00774   // Function: create_component
00775   //
00776   // A convenience function for <ovm_factory::create_component_by_name>,
00777   // this method calls upon the factory to create a new child component
00778   // whose type corresponds to the preregistered type name, ~requested_type_name~,
00779   // and instance name, ~name~. This method is equivalent to:
00780   //
00781   //|  factory.create_component_by_name(requested_type_name,
00782   //|                                   get_full_name(), name, this);
00783   //
00784   // If the factory determines that a type or instance override exists, the type
00785   // of the component created may be different than the requested type. See
00786   // <set_type_override> and <set_inst_override>. See also <ovm_factory> for
00787   // details on factory operation.
00788 
00789   extern function ovm_component create_component (string requested_type_name, 
00790                                                   string name);
00791 
00792 
00793   // Function: create_object
00794   //
00795   // A convenience function for <ovm_factory::create_object_by_name>,
00796   // this method calls upon the factory to create a new object
00797   // whose type corresponds to the preregistered type name,
00798   // ~requested_type_name~, and instance name, ~name~. This method is
00799   // equivalent to:
00800   //
00801   //|  factory.create_object_by_name(requested_type_name,
00802   //|                                get_full_name(), name);
00803   //
00804   // If the factory determines that a type or instance override exists, the
00805   // type of the object created may be different than the requested type.  See
00806   // <ovm_factory> for details on factory operation.
00807 
00808   extern function ovm_object create_object (string requested_type_name,
00809                                             string name="");
00810 
00811 
00812   // Function: set_type_override_by_type
00813   //
00814   // A convenience function for <ovm_factory::set_type_override_by_type>, this
00815   // method registers a factory override for components and objects created at
00816   // this level of hierarchy or below. This method is equivalent to:
00817   //
00818   //|  factory.set_type_override_by_type(original_type, override_type,replace);
00819   //
00820   // The ~relative_inst_path~ is relative to this component and may include
00821   // wildcards. The ~original_type~ represents the type that is being overridden.
00822   // In subsequent calls to <ovm_factory::create_object_by_type> or
00823   // <ovm_factory::create_component_by_type>, if the requested_type matches the
00824   // ~original_type~ and the instance paths match, the factory will produce
00825   // the ~override_type~. 
00826   //
00827   // The original and override type arguments are lightweight proxies to the
00828   // types they represent. See <set_inst_override_by_type> for information
00829   // on usage.
00830 
00831   extern static function void set_type_override_by_type
00832                                              (ovm_object_wrapper original_type, 
00833                                               ovm_object_wrapper override_type,
00834                                               bit replace=1);
00835 
00836 
00837   // Function: set_inst_override_by_type
00838   //
00839   // A convenience function for <ovm_factory::set_inst_override_by_type>, this
00840   // method registers a factory override for components and objects created at
00841   // this level of hierarchy or below. In typical usage, this method is
00842   // equivalent to:
00843   //
00844   //|  factory.set_inst_override_by_type({get_full_name(),".",
00845   //|                                     relative_inst_path},
00846   //|                                     original_type,
00847   //|                                     override_type);
00848   //
00849   // The ~relative_inst_path~ is relative to this component and may include
00850   // wildcards. The ~original_type~ represents the type that is being overridden.
00851   // In subsequent calls to <ovm_factory::create_object_by_type> or
00852   // <ovm_factory::create_component_by_type>, if the requested_type matches the
00853   // ~original_type~ and the instance paths match, the factory will produce the
00854   // ~override_type~. 
00855   //
00856   // The original and override types are lightweight proxies to the types they
00857   // represent. They can be obtained by calling type::get_type(), if
00858   // implemented, or by directly calling type::type_id::get(), where type is the
00859   // user type and type_id is the name of the typedef to
00860   // <ovm_object_registry #(T,Tname)> or <ovm_component_registry #(T,Tname)>.
00861   //
00862   // If you are employing the `ovm_*_utils macros, the typedef and the get_type
00863   // method will be implemented for you.
00864   //
00865   // The following example shows `ovm_*_utils usage:
00866   //
00867   //|  class comp extends ovm_component;
00868   //|    `ovm_component_utils(comp)
00869   //|    ...
00870   //|  endclass
00871   //|
00872   //|  class mycomp extends ovm_component;
00873   //|    `ovm_component_utils(mycomp)
00874   //|    ...
00875   //|  endclass
00876   //|
00877   //|  class block extends ovm_component;
00878   //|    `ovm_component_utils(block)
00879   //|    comp c_inst;
00880   //|    virtual function void build();
00881   //|      set_inst_override_by_type("c_inst",comp::get_type(),
00882   //|                                         mycomp::get_type());
00883   //|    endfunction
00884   //|    ...
00885   //|  endclass
00886 
00887   extern function void set_inst_override_by_type(string relative_inst_path,  
00888                                                  ovm_object_wrapper original_type,
00889                                                  ovm_object_wrapper override_type);
00890 
00891 
00892   // Function: set_type_override
00893   //
00894   // A convenience function for <ovm_factory::set_type_override_by_name>,
00895   // this method configures the factory to create an object of type
00896   // ~override_type_name~ whenever the factory is asked to produce a type
00897   // represented by ~original_type_name~.  This method is equivalent to:
00898   //
00899   //|  factory.set_type_override_by_name(original_type_name,
00900   //|                                    override_type_name, replace);
00901   //
00902   // The ~original_type_name~ typically refers to a preregistered type in the
00903   // factory. It may, however, be any arbitrary string. Subsequent calls to
00904   // create_component or create_object with the same string and matching
00905   // instance path will produce the type represented by override_type_name.
00906   // The ~override_type_name~ must refer to a preregistered type in the factory. 
00907 
00908   extern static function void set_type_override(string original_type_name, 
00909                                                 string override_type_name,
00910                                                 bit    replace=1);
00911 
00912 
00913   // Function: set_inst_override
00914   //
00915   // A convenience function for <ovm_factory::set_inst_override_by_type>, this
00916   // method registers a factory override for components created at this level
00917   // of hierarchy or below. In typical usage, this method is equivalent to:
00918   //
00919   //|  factory.set_inst_override_by_name({get_full_name(),".",
00920   //|                                     relative_inst_path},
00921   //|                                      original_type_name,
00922   //|                                     override_type_name);
00923   //
00924   // The ~relative_inst_path~ is relative to this component and may include
00925   // wildcards. The ~original_type_name~ typically refers to a preregistered type
00926   // in the factory. It may, however, be any arbitrary string. Subsequent calls
00927   // to create_component or create_object with the same string and matching
00928   // instance path will produce the type represented by ~override_type_name~.
00929   // The ~override_type_name~ must refer to a preregistered type in the factory. 
00930 
00931   extern function void set_inst_override(string relative_inst_path,  
00932                                          string original_type_name,
00933                                          string override_type_name);
00934 
00935 
00936   // Function: print_override_info
00937   //
00938   // This factory debug method performs the same lookup process as create_object
00939   // and create_component, but instead of creating an object, it prints
00940   // information about what type of object would be created given the
00941   // provided arguments.
00942 
00943   extern function void print_override_info(string requested_type_name,
00944                                            string name="");
00945 
00946 
00947   //----------------------------------------------------------------------------
00948   // Group: Hierarchical Reporting Interface
00949   //----------------------------------------------------------------------------
00950   //
00951   // This interface provides versions of the set_report_* methods in the
00952   // <ovm_report_object> base class that are applied recursively to this
00953   // component and all its children.
00954   //
00955   // When a report is issued and its associated action has the LOG bit set, the
00956   // report will be sent to its associated FILE descriptor.
00957   //----------------------------------------------------------------------------
00958 
00959   // Function: set_report_severity_action_hier
00960 
00961   extern function void set_report_severity_action_hier (ovm_severity severity,
00962                                                         ovm_action action);
00963 
00964   // Function: set_report_id_action_hier
00965 
00966   extern function void set_report_id_action_hier (string id,
00967                                                   ovm_action action);
00968 
00969   // Function: set_report_severity_id_action_hier
00970   //
00971   // These methods recursively associate the specified action with reports of
00972   // the given ~severity~, ~id~, or ~severity-id~ pair. An action associated
00973   // with a particular severity-id pair takes precedence over an action
00974   // associated with id, which takes precedence over an an action associated
00975   // with a severity.
00976   //
00977   // For a list of severities and their default actions, refer to
00978   // <ovm_report_handler>.
00979 
00980   extern function void set_report_severity_id_action_hier(ovm_severity severity,
00981                                                           string id,
00982                                                           ovm_action action);
00983 
00984 
00985 
00986   // Function: set_report_default_file_hier
00987 
00988   extern function void set_report_default_file_hier (OVM_FILE file);
00989 
00990   // Function: set_report_severity_file_hier
00991 
00992   extern function void set_report_severity_file_hier (ovm_severity severity,
00993                                                       OVM_FILE file);
00994 
00995   // Function: set_report_id_file_hier
00996 
00997   extern function void set_report_id_file_hier (string id,
00998                                                 OVM_FILE file);
00999 
01000   // Function: set_report_severity_id_file_hier
01001   //
01002   // These methods recursively associate the specified FILE descriptor with
01003   // reports of the given ~severity~, ~id~, or ~severity-id~ pair. A FILE
01004   // associated with a particular severity-id pair takes precedence over a FILE
01005   // associated with id, which take precedence over an a FILE associated with a
01006   // severity, which takes precedence over the default FILE descriptor.
01007   //
01008   // For a list of severities and other information related to the report
01009   // mechanism, refer to <ovm_report_handler>.
01010 
01011   extern function void set_report_severity_id_file_hier(ovm_severity severity,
01012                                                         string id,
01013                                                         OVM_FILE file);
01014 
01015 
01016   // Function: set_report_verbosity_level_hier
01017   //
01018   // This method recursively sets the maximum verbosity level for reports for
01019   // this component and all those below it. Any report from this component
01020   // subtree whose verbosity exceeds this maximum will be ignored.
01021   // 
01022   // See <ovm_report_handler> for a list of predefined message verbosity levels
01023   // and their meaning.
01024 
01025     extern function void set_report_verbosity_level_hier (int verbosity);
01026   
01027 
01028   //----------------------------------------------------------------------------
01029   // Group: Recording Interface
01030   //----------------------------------------------------------------------------
01031   // These methods comprise the component-based transaction recording
01032   // interface. The methods can be used to record the transactions that
01033   // this component "sees", i.e. produces or consumes.
01034   //
01035   // The API and implementation are subject to change once a vendor-independent
01036   // use-model is determined.
01037   //----------------------------------------------------------------------------
01038 
01039   // Function: accept_tr
01040   //
01041   // This function marks the acceptance of a transaction, ~tr~, by this
01042   // component. Specifically, it performs the following actions:
01043   //
01044   // - Calls the ~tr~'s <ovm_transaction::accept_tr> method, passing to it the
01045   //   ~accept_time~ argument.
01046   //
01047   // - Calls this component's <do_accept_tr> method to allow for any post-begin
01048   //   action in derived classes.
01049   //
01050   // - Triggers the component's internal accept_tr event. Any processes waiting
01051   //   on this event will resume in the next delta cycle. 
01052 
01053   extern function void accept_tr (ovm_transaction tr, time accept_time=0);
01054 
01055 
01056   // Function: do_accept_tr
01057   //
01058   // The <accept_tr> method calls this function to accommodate any user-defined
01059   // post-accept action. Implementations should call super.do_accept_tr to
01060   // ensure correct operation.
01061     
01062   extern virtual protected function void do_accept_tr (ovm_transaction tr);
01063 
01064 
01065   // Function: begin_tr
01066   //
01067   // This function marks the start of a transaction, ~tr~, by this component.
01068   // Specifically, it performs the following actions:
01069   //
01070   // - Calls ~tr~'s <ovm_transaction::begin_tr> method, passing to it the
01071   //   ~begin_time~ argument. The ~begin_time~ should be greater than or equal
01072   //   to the accept time. By default, when ~begin_time~ = 0, the current
01073   //   simulation time is used.
01074   //
01075   //   If recording is enabled (recording_detail != OVM_OFF), then a new
01076   //   database-transaction is started on the component's transaction stream
01077   //   given by the stream argument. No transaction properties are recorded at
01078   //   this time.
01079   //
01080   // - Calls the component's <do_begin_tr> method to allow for any post-begin
01081   //   action in derived classes.
01082   //
01083   // - Triggers the component's internal begin_tr event. Any processes waiting
01084   //   on this event will resume in the next delta cycle. 
01085   //
01086   // A handle to the transaction is returned. The meaning of this handle, as
01087   // well as the interpretation of the arguments ~stream_name~, ~label~, and
01088   // ~desc~ are vendor specific.
01089 
01090   extern function integer begin_tr (ovm_transaction tr,
01091                                     string stream_name="main",
01092                                     string label="",
01093                                     string desc="",
01094                                     time begin_time=0);
01095 
01096 
01097   // Function: begin_child_tr
01098   //
01099   // This function marks the start of a child transaction, ~tr~, by this
01100   // component. Its operation is identical to that of <begin_tr>, except that
01101   // an association is made between this transaction and the provided parent
01102   // transaction. This association is vendor-specific.
01103 
01104   extern function integer begin_child_tr (ovm_transaction tr,
01105                                           integer parent_handle=0,
01106                                           string stream_name="main",
01107                                           string label="",
01108                                           string desc="",
01109                                           time begin_time=0);
01110 
01111 
01112   // Function: do_begin_tr
01113   //
01114   // The <begin_tr> and <begin_child_tr> methods call this function to
01115   // accommodate any user-defined post-begin action. Implementations should call
01116   // super.do_begin_tr to ensure correct operation.
01117 
01118   extern virtual protected 
01119                  function void do_begin_tr (ovm_transaction tr,
01120                                             string stream_name,
01121                                             integer tr_handle);
01122 
01123 
01124   // Function: end_tr
01125   //
01126   // This function marks the end of a transaction, ~tr~, by this component.
01127   // Specifically, it performs the following actions:
01128   //
01129   // - Calls ~tr~'s <ovm_transaction::end_tr> method, passing to it the
01130   //   ~end_time~ argument. The ~end_time~ must at least be greater than the
01131   //   begin time. By default, when ~end_time~ = 0, the current simulation time
01132   //   is used.
01133   //
01134   //   The transaction's properties are recorded to the database-transaction on
01135   //   which it was started, and then the transaction is ended. Only those
01136   //   properties handled by the transaction's do_record method (and optional
01137   //   `ovm_*_field macros) are recorded.
01138   //
01139   // - Calls the component's <do_end_tr> method to accommodate any post-end
01140   //   action in derived classes.
01141   //
01142   // - Triggers the component's internal end_tr event. Any processes waiting on
01143   //   this event will resume in the next delta cycle. 
01144   //
01145   // The ~free_handle~ bit indicates that this transaction is no longer needed.
01146   // The implementation of free_handle is vendor-specific.
01147 
01148   extern function void end_tr (ovm_transaction tr,
01149                                time end_time=0,
01150                                bit free_handle=1);
01151 
01152 
01153   // Function: do_end_tr
01154   //
01155   // The <end_tr> method calls this function to accommodate any user-defined
01156   // post-end action. Implementations should call super.do_end_tr to ensure
01157   // correct operation.
01158 
01159   extern virtual protected function void do_end_tr (ovm_transaction tr,
01160                                                     integer tr_handle);
01161 
01162 
01163   // Function: record_error_tr
01164   //
01165   // This function marks an error transaction by a component. Properties of the
01166   // given ovm_object, ~info~, as implemented in its <do_record> method, are
01167   // recorded to the transaction database.
01168   //
01169   // An ~error_time~ of 0 indicates to use the current simulation time. The
01170   // ~keep_active~ bit determines if the handle should remain active. If 0,
01171   // then a zero-length error transaction is recorded. A handle to the
01172   // database-transaction is returned. 
01173   //
01174   // Interpretation of this handle, as well as the strings ~stream_name~,
01175   // ~label~, and ~desc~, are vendor-specific.
01176 
01177   extern function integer record_error_tr (string stream_name="main",
01178                                            ovm_object info=null,
01179                                            string label="error_tr",
01180                                            string desc="",
01181                                            time   error_time=0,
01182                                            bit    keep_active=0);
01183 
01184 
01185   // Function: record_event_tr
01186   //
01187   // This function marks an event transaction by a component. 
01188   //
01189   // An ~event_time~ of 0 indicates to use the current simulation time. 
01190   //
01191   // A handle to the transaction is returned. The ~keep_active~ bit determines
01192   // if the handle may be used for other vendor-specific purposes. 
01193   //
01194   // The strings for ~stream_name~, ~label~, and ~desc~ are vendor-specific
01195   // identifiers for the transaction.
01196 
01197   extern function integer record_event_tr (string stream_name="main",
01198                                            ovm_object info=null,
01199                                            string label="event_tr",
01200                                            string desc="",
01201                                            time   event_time=0,
01202                                            bit    keep_active=0);
01203 
01204 
01205   // Variable: print_enabled
01206   //
01207   // This bit determines if this component should automatically be printed as a
01208   // child of its parent object. 
01209   // 
01210   // By default, all children are printed. However, this bit allows a parent
01211   // component to disable the printing of specific children.
01212 
01213   bit print_enabled = 1;
01214 
01215 
01216   //----------------------------------------------------------------------------
01217   //                     PRIVATE or PSUEDO-PRIVATE members
01218   //                      *** Do not call directly ***
01219   //         Implementation and even existence are subject to change. 
01220   //----------------------------------------------------------------------------
01221   // Most local methods are prefixed with m_, indicating they are not
01222   // user-level methods. SystemVerilog does not support friend classes,
01223   // which forces some otherwise internal methods to be exposed (i.e. not
01224   // be protected via 'local' keyword). These methods are also prefixed
01225   // with m_ to indicate they are not intended for public use.
01226   //
01227   // Internal methods will not be documented, although their implementa-
01228   // tions are freely available via the open-source license.
01229   //----------------------------------------------------------------------------
01230 
01231   extern local function void m_component_path (ref ovm_component path[$]);
01232   extern local function void m_get_config_matches
01233                              (ref ovm_config_setting cfg_matches[$], 
01234                               input ovm_config_setting::ovm_config_type cfgtype, 
01235                               string field_name);
01236 
01237   /*protected*/ ovm_component m_parent;
01238   protected ovm_component m_children[string];
01239   protected ovm_component m_children_by_handle[ovm_component];
01240   extern local function bit m_add_child (ovm_component child);
01241   extern virtual local function void m_set_full_name ();
01242 
01243   extern virtual function void  do_func_phase (ovm_phase phase);
01244   extern virtual task do_task_phase (ovm_phase phase);
01245 
01246   extern virtual  function void  do_kill_all ();
01247   extern          function void  do_resolve_bindings ();
01248   extern          function void  do_flush();
01249 
01250   extern virtual function void flush ();
01251 
01252   ovm_phase m_curr_phase=null;
01253 
01254   protected ovm_config_setting m_configuration_table[$];
01255 
01256   protected bit m_build_done=0;
01257 
01258   extern local function void m_extract_name(string name ,
01259                                             output string leaf ,
01260                                             output string remainder );
01261   local static bit m_phases_loaded = 0;
01262 
01263   // overridden to disable
01264   extern virtual function ovm_object create (string name=""); 
01265   extern virtual function ovm_object clone  ();
01266 
01267   local integer m_stream_handle[string];
01268   local integer m_tr_h[ovm_transaction];
01269   extern protected function integer m_begin_tr (ovm_transaction tr,
01270               integer parent_handle=0, bit has_parent=0,
01271               string stream_name="main", string label="",
01272               string desc="", time begin_time=0);
01273 
01274   `ifndef INCA
01275   protected process m_phase_process;
01276   `endif
01277   protected event m_kill_request;
01278 
01279   string m_name;
01280 
01281   protected ovm_event_pool event_pool;
01282 
01283 
01284   extern virtual task restart ();
01285 
01286   //----------------------------------------------------------------------------
01287   //                          DEPRECATED MEMBERS
01288   //                      *** Do not use in new code ***
01289   //                  Convert existing code when appropriate.
01290   //----------------------------------------------------------------------------
01291   // Deprecated static methods:
01292   // 
01293   // global_stop_request
01294   //   replaced by ovm_top.stop_request
01295   //
01296   // Deprecated phases:
01297   //
01298   // post_new
01299   //   replaced by build (top-down)
01300   //
01301   // import/export_connections
01302   //   Consolidated into the connect phase; deferred binding enforcement
01303   //   via resolve_bindings allows connections to be order-independent
01304   //
01305   // pre_run
01306   //   replaced by start_of_simulation
01307   //----------------------------------------------------------------------------
01308 
01309   extern static  function  void  global_stop_request();
01310 
01311   extern virtual function  void  post_new ();
01312   extern virtual function  void  import_connections ();
01313   extern virtual function  void  configure ();
01314   extern virtual function  void  export_connections ();
01315   extern virtual function  void  pre_run (); 
01316 
01317   extern static  function ovm_component find_component   (string comp_match);
01318   extern static  function void          find_components  (string comp_match, 
01319                                                     ref ovm_component comps[$]);
01320   extern static  function ovm_component get_component    (int ele);
01321   extern static  function int           get_num_components ();
01322 
01323   `include "compatibility/urm_message_compatibility.svh"
01324 
01325 endclass : ovm_component
01326 
01327 // for backward compatibility
01328 typedef ovm_component ovm_threaded_component;
01329             
01330 `endif // OVM_COMPONENT_SVH
01331 

Intelligent Design Verification
Intelligent Design Verification
Project: OVM, Revision: 2.0.2
Copyright (c) 2008-2010 Intelligent Design Verification.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included here:
http://www.intelligentdv.com/licenses/fdl.txt
doxygen
Doxygen Version: 1.6.3
IDV SV Filter Version: 2.6.3
Sat Jun 19 11:43:33 2010
Find a documentation bug? Report bugs to: bugs.intelligentdv.com Project: DoxygenFilterSV