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 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 Version: 1.6.3 IDV SV Filter Version: 2.6.3 Sat Jun 19 11:43:33 2010 |