When executing vsim on a design containing OVM, two or more OVM banners appear on the screen and/or in the transcript file.
# -------------------------------------------------
# OVM-2.1.1
# (C) 2007-2009 Mentor Graphics Corporation
# (C) 2007-2009 Cadence Design Systems, Inc.
# -------------------------------------------------
# -------------------------------------------------
# OVM-2.1.1
# (C) 2007-2009 Mentor Graphics Corporation
# (C) 2007-2009 Cadence Design Systems, Inc.
# -------------------------------------------------
The message is printed in method ovm_report_handler::report_header() in src/base/ovm_report_handler.svh
This is called only from OVM code in method ovm_report_object::report_header() in ovm_report_object.svh
This too is called only from OVM code in ovm_root::new() in ovm_root.svh
Solution:
All possible causes of multiple printout of this message and suggestions for resolution:
1. User code has instantiated ovm_root multiple times via multiple calls to ovm_root::new(). This should not be done and will need to be corrected.
2. User code has extended ovm_root and changed its behavior. This also should be not be done and will need to be corrected.
3. User code calls ovm_report_handler::report_header() directly via an ovm_report_handler object handle.
4. User code calls ovm_report_object::report_header() directly via an ovm_report_object handle or subclass method override calling super.report_header().
5. One additional and very likely possibility is that there are multiple ovm_pkg universes compiled separately and integrated at runtime. This can happen in a simulation scripting case, which compiles separate units (e.g. VIPs or testbench bits) each of which correctly does an import ovmpkg::*. Those units are then integrated in to a toplevel testbench by `include instead of by import my_subunit1::*; import my_vip2::* etc
Don't use `include for this case. Use only `import. Otherwise the outcome is that each package, while called ovm_pkg, is actually a different package namespace with a different ovm_root etc.
1. User code has instantiated ovm_root multiple times via multiple calls to ovm_root::new(). This should not be done and will need to be corrected.
2. User code has extended ovm_root and changed its behavior. This also should be not be done and will need to be corrected.
3. User code calls ovm_report_handler::report_header() directly via an ovm_report_handler object handle.
4. User code calls ovm_report_object::report_header() directly via an ovm_report_object handle or subclass method override calling super.report_header().
5. One additional and very likely possibility is that there are multiple ovm_pkg universes compiled separately and integrated at runtime. This can happen in a simulation scripting case, which compiles separate units (e.g. VIPs or testbench bits) each of which correctly does an import ovmpkg::*. Those units are then integrated in to a toplevel testbench by `include instead of by import my_subunit1::*; import my_vip2::* etc
Don't use `include for this case. Use only `import. Otherwise the outcome is that each package, while called ovm_pkg, is actually a different package namespace with a different ovm_root etc.
No comments:
Post a Comment