The OVM library defines a set of base classes and utilities that facilitate the design of modular, scalable, reusable verification environments.
The basic building blocks for all environments are components and the transactions they use to communicate. The OVM provides base classes for these, as shown below.
- ovm_object - All components and transactions derive from ovm_object, which defines an interface of core class-based operations: create, copy, compare, print, sprint, record, etc. It also defines interfaces for instance identification (name, type name, unique id, etc.) and random seeding.
- ovm_component - The ovm_component class is the root base class for all OVM components. Components are quasi-static objects that exist throughout simulation. This allows them to establish structural hierarchy much like modules and program blocks. Every component is uniquely addressable via a hierarchical path name, e.g. “env1.pci1.master3.driver”. The ovm_component also defines a phased test flow that components follow during the course of simulation. Each phase-- build, connect, run, etc.-- is defined by a callback that is executed in precise order. Finally, the ovm_component also defines configuration, reporting, transaction recording, and factory interfaces.
- ovm_transaction - The ovm_transaction is the root base class for OVM transactions, which, unlike ovm_components, are transient in nature. It extends ovm_object to include a timing and recording interface. Simple transactions can derive directly from ovm_transaction, while sequence-enabled transactions derive from ovm_sequence_item.
- ovm_root - The ovm_root class is special ovm_component that serves as the top-level component for all OVM components, provides phasing control for all OVM components, and other global services.