uvm_object. module traffic ( input pclk, input presetn, input [31:0] paddr, input [31:0] pwdata. uvm_object

 
 module traffic ( input pclk, input presetn, input [31:0] paddr, input [31:0] pwdatauvm_object  OOP enables writing reusable code

In order to create a user-defined sequence : Derive from uvm_sequence base class with a specified data object type. A policy object can be passed along to set parameters like depth of comparison, verbosity, maximum number of. 02. You need a uvm_sequencer with seq_item_export to connect to the driver's seq_item_port. The create method internally makes a call to the factory to look up the requested type and then. The print method is used to deep print UVM object class properties in a well-formatted manner. UVM 1. Every class item derived from uvm_object will have a printer instance within it. 06 Array Operators and Methods 01. The paper explains how UVM can be integrated with SystemC using the UVM-ML Open Architecture, a framework that enables interoperability between different. 01 Simulation 환경 01장 SystemVerilog for Testbench 01. You are mixing up the terms parent and child with the principals of class inheritance. uvm_object. A uvm_queue is created for every unique field_name. Through this interface, components issue the various messages with different severity levels that occur during simulation. It is an abstract class with no data members or functions. Factory is a centralized location to make calls from look-up tables for creation of any transaction types. It is extended from its parent class uvm_resource_dbMarch 24, 2021. UVM is based on Open Verification Methodology (OVM) and Verification Methodology Manual (VVM). A uvm_queue is created for every unique field_name. 01 SystemVerilog Testbench 구조 01. Inline constraints (i. e. Your sequence would have, instead of an array of pixels, an array of ints, and then you could transform from/to in the driver and monitor. Class: UVMObjection. 7,483 1 1 gold badge 25. get_trigger_data. When set, metadata should be encoded as follows: For strings, pack an additional null byte after the string is packed. Later on, we want to run the same set of tests created above, using the same transaction. My company (Doulos) recommends you. write (), it basically cycles through. OOP enables writing reusable code. This behavior is called “overriding” and there are 2 types of overriding is possible with UVM Factory (described below). print() routines you get what you expect. How do we ensure that this Configuration class can easily be propagated across the testbench environment? In UVM, objects are often instantiated through the factory infrastructure. Abstract- SystemVerilog provides several mechanisms for layering constraints in an object. 3. path","label",value) (Adding other objects into the uvm_config_db is just as straightforward as adding a virtual interface. without modifying the object class being operated on. Each of UVM’s policy classes performs a specific task for uvm_object-based objects: printing, comparing, recording, packing, and unpacking. 01 Building blocks in SystemVerilog [email protected] to use the UVM configuration facility? Configuration values are set in the uvm_config_db class using the set() method and retrieved using the get() method. Using automation macros. Its primary role is to define a set of methods for such common operations as create, copy, compare, print, and record . The do_pack() is used to pack each propery of the jelly_bean_transaction object using a uvm_packer policy object. CB – user-defined callback type. So, a data class derived from uvm_sequence_item or uvm_component will have access to the print() function as well. It is then placed into the configuration database using uvm_config_db so that other testbench components within this environment can access the object and configure sub components accordingly. Create and register the callback object. We have already seen how to use `uvm_do set of macros. Yes, the UVM create() method calls new() constructor on the object without any arguments (string name is not passed in there). This object must be factory-enabled. This solution randomize the knobs, not the sequence (ie. ), instance identification fields (name, type name, unique id, etc. The argument will be evaluated before the quotes added. env. There are many kinds of design patterns. Gets the data, if any, provided by the last call to trigger. Teams. 01 SystemVerilog Testbench 구조 01. Create uvm_object base class. 用途は、UVMの「オートメーション」機能を適用するために使います。. When someone wants to implement object names, what they'll do is pass a "string name" in the constructor of every object, so when the object is. Using do_copy. Before moving to uvm_sequence_item will look into uvm_object concepts required to write uvm_sequence_item, The uvm_object has a number of virtual methods that are used to implement common data object functions (copy, clone, compare, print, transaction, and recording) and these should be implemented to make the sequence_item more general purpose. class uvm. uvm_object is the one of the base classes from where almost all UVM classes are derived. It is an abstract class with no data members or functions. A grandparent class of uvm_sequence_item is uvm_transaction, which contains the following field definitions: class uvm_transaction extends uvm_object; const uvm_event_pool events = new; uvm_event begin_event; uvm_event end_event; //. 1. this(obj)). UVM provides a transaction class that can be extended to create transaction objects that carry information between the DUT and the testbench. UVM Factory is a standardized mechanism to create different objects. g. It is the base class for all UVM data and hierarchical classes. factory. Uvm factory is one of the most notable term when using uvm methodology. uvm_config_db# (rx_agent_cfg)::get (null, "uvm_test_top. The uvm_object_registry serves as a lightweight proxy for a uvm_object of type T and type name Tname, a string. Read more: UVM Object [uvm_object] In my last post, I recommended that you give every SystemVerilog object either a unique ID or name. Main concepts of UVM (1) • Clear separation of test stimuli (sequences) and test bench –Sequences are treated as ‘transient objects’ and thus independent from the test bench construction and compositionHow to use the UVM configuration facility? Configuration values are set in the uvm_config_db class using the set() method and retrieved using the get() method. // For example, "set_type_override_by_type" is actually a function defined in the class uvm_factory // A wrapper function. // my_env is user-given name for this class that has been derived from "uvm_env" class my_env extends uvm_env; // [Recommended] Makes this driver more re-usable `uvm_component_utils (my_env) // This is standard code for all. A utils macro should be used inside every user-defined class that extends uvm_object directly or indirectly, including uvm_sequence_item and uvm_component. method_call() is really method_call(. The compare method returns 1 if comparison matches for the current object when it is compared with the R. Then you can do: typedef uvm_object_registry# (abc_test_seq,`STR (`SEQ_NAME (abc))) type_id;. The register model can be used to read and write registers in the DUT, including signals connected to those registers. 1. The create method internally makes a call to the factory to look up the requested type and then. PyUVM Description. Since the uvm_sequence_item class is extended from the uvm_object class, it inherits the print method which is used to display the class variables. UVM pre-defines six verbosity levels; UVM_NONE to UVM_DEBUG. UVM automation macros can. For example: `define STR (str) `"str`". The word “factory” in UVM refers to the substitution of any object or component in the verification environment without modifying any part of code in any testbench. A policy class to allow pairs of transactions to be handled as a single uvm_object type. The primary role of uvm_object class is to define a set of common utility functions like print, copy, compare and record which can be availed by any other class in a UVM testbench. 2-2020 standard. 4. uvm_objects have clone/do_copy virtual methods, that can be used to clone/ do a deep copy of an object. S. get_type_name is a virtual function. The record function takes a recording policy object as the argument (line 14). event_object event_object_h; uvm_object temp_obj; . Subtypes of uvm_printer implement different print formats, or policies. 02. com Shihua Zhang AMD, Inc. A memory may be accessible via more than one address map. You can use the uvm_object_registry (T,S) or uvm_component_registry (T,S) registration macros. All components and object classes in a UVM environment are derived from uvm_object base class. The most common UVM macros are: uvm_component_utils: registers a new class type when the class derives from the class uvm_component; uvm_object_utils: similar to uvm_component_utils, but the class is derived from the. Jun 20, 2014 at 15:54. The SystemVerilog UVM contains a uvm_printer class, which provides an interface for printing uvm_objects in various formats. A policy class to allow pairs of transactions to be handled as a single uvm_object type. module traffic ( input pclk, input presetn, input [31:0] paddr, input [31:0] pwdata. com Welcome to our site! EDAboard. UVM automation macros also include mechanisms to pack class variables into a bit or byte stream, and unpack a bit stream and populate the class contents. Universal Verification Methodology UVM Introduction The Accellera Universal Verification Methodology (UVM) is a standard verification methodology that includes a set of class libraries for the development of a verification environment. *,_ALL_,UVM_DEBUG,run I want to leave the entire testbench verbosity as sv_medium, except for one object of the following class. Instances of these classes can pass any object. このページの最後に載せておきます。. The scope, which is a uvm_component handle plus a string. A UVM sequence is just a SystemVerilog object that is constructed by calling new. The uvm_object class is the base class for all UVM data and hierarchical classes. The following methods are also part of the uvm_objection class: clear(): Immediately clears the objection state. print(); Use the uvm_object_utils and uvm_field_* macros in your uvm_sequence_item class to control what gets printed. Then you can do: typedef uvm_object_registry# (abc_test_seq,`STR (`SEQ_NAME (abc))) type_id;. The monitor captures values on the DUT's input and output pin. Alternatively, if the change is intended to be global, there is a default printer that automatically created at root called uvm_default_printer . By applying stimulus to the register model, the actual design registers will exhibit the changes applied by the stimulus. Writing user-defined callback, class user_defined_callback extends uvm_event_callback; --- endclass. This is known as the UVM factory override mechanism. Typically configuration classes and data objects are derived from this class and are passed to different testbench components during the course of a simulation. The create function asks the UVM factory to create an object. Must define a pool before use: typedef uvm_pool(. You need to create a uvm_object temp variable, then do an explicit dynamic cast, e. The utility macro `uvm_object_utils registers this class with the factory, which we will discuss later, and allows access to the create method which is needed for cloning. In other words, uvm_objects are transient, such as transactions that are created when needed and disappear when not used anymore. 02. TimConclusion. 1. Because this will be created during the run_phase it can't extend uvm_component, and it wouldn't make sense for this class to have phases. uvm_config_db is a parameterized class that is parameterized with the data type of object that is being set or get. uvm_object::new says that m_inst_id == m_inst_count++. The important thing to remember is that each entry needs a unique field name or label (if the global scope is being used), or the path needs to1 Answer. Building UVM Verification Environment from Scratch. as you can see from your log that isnt the case for IUS. UVM uses the concept of a factory where all objects are registered with it so that it can return an object of the requested type when required. The UVM object is a data structure used for testbench configuration and it is the base class available for component and sequence branch. ; uvm_resource_db is the parent class of uvm_config_db, which is used to set different values in the registry and. It consists of all the basic methods, macros, identification fields in it. // Step 1: Declare a new class that derives from "uvm_test" class base_test extends uvm_test; // Step 2: Register this class with UVM Factory `uvm. 1에서는 uvm_object에 대한 constructor가 필수 사항이 아니었지만, UVM 1. The benefit of this approach comes from. A resource is any piece of information that is shared between more than one component or object. The uvm_object_registry serves as a lightweight proxy for a uvm_object of type T and type name Tname, a string. myagent. Even the uvm_object_registry and uvm_component_registry classes contain a lot of duplicated code that could have been refactored. The monitor captures values on the DUT's input and output pin. 2) Add "-clean" to the irun command. The usage of Factory involves three steps. Factory is a singleton object and there is only one instance of the factory in a UVM environment. Say the object is "my_tb". Here are the general steps to create and use a register. There is often a need to copy, compare and print values in these classes. March 24, 2021. This flexibility allows comprehensive testing of different configurations using a single, reusable testbench, significantly reducing development time and effort. These macros form a block in which `uvm_field_* macros can be placed. 1 Answer. The uvm_object class is the base class for all uvm hierarchical classes such as uvm_report_object, uvm_component, uvm_transaction, uvm_sequence_item, uvm_sequence etc. The factory is a special class in UVM that creates an instance for you of whatever uvm_object or uvm_component type you specify. essentially take the current global id then increment the counter. First up, let’s briefly cover the semaphore and uvm_pool. This keeps your code base stable,. Such a. So all you need to do is remove the type E parameter declaration. uvm_factory. UVM stands for U niversal V erification M ethodology. UVM components can represent various parts of the testbench, such as a top-level testbench, an interface, an agent, or a sequencer. Multiple recipients accessing an object via get(), will access the same object. The UVM heartbeat can detect simulation hang or lock-up conditions at an early stage rather than the expiry of the global simulation timeout. The constructor of uvm_component adds a uvm_component parent argument which is used to create. uvm_object has many common functions like print, copy and compare that are available to all its child classes and can be used out of the box if UVM automation macros are used inside the class definition. The uvm_object_registry serves as a lightweight proxy for a uvm_object of type T and type name Tname, a string. `uvm_object_utils_begin. For more efficient and more flexible implementation, we can use user definable do_*() hooks. We would like to show you a description here but the site won’t allow us. Refer to “Macros” in the UVM 1. It allows for generic containers of objects to be created, similar to a void pointer in the C programming language. I guess the name "automation" is used, because they automatically write code so you don't have to. The uvm_void class is the base class for all UVM classes. The UVM sequencer provides the facility to have exclusive access for the sequence to a driver via a sequencer using a locking mechanism. An appropriate `uvm_field_* macro is required to use based on the data type of class properties. Accellera believes standards are an important ingredient to foster innovation and continues to encourage industry innovation based on its standards. The UVM Test typically performs three main functions: Instantiates the top-level environment, configures the environment (via configuration objects, factory overrides or the configuration database), and applies stimulus by. UVM factory is a mechanism to improve flexibility and scalability of the testbench by allowing the user to substitute an existing class object by any of its inherited child class objects. Use uvm_field_int because as far as SystemVerilog is concerned, time is just an alias for longint. 2 Class Reference represents the foundation used to create the UVM 1. Using UVM in SystemC is a tutorial paper that presents the benefits and challenges of applying the Universal Verification Methodology (UVM) to SystemC-based verification environments. A function cannot have time controlled statements like @, #, fork join, or wait; A function cannot start a task since tasks are allowed to consume. def compare_field (self, name, lhs, rhs, size, radix = UVM_NORADIX): """ Function: compare_field Compares two integral values. Two things: 1) You could extend mem_seq_item from "uvm_sequence_item" instead of "uvm_object". Previous Article. Implement the function "create()" `define m_uvm_object_create_func(T) function uvm_object create (string name=""); T tmp; `ifdef. 01 Simulation 환경 01장 SystemVerilog for Testbench 01. You're trying to assign a handle of base class type to a handle of derived class type, which isn't allowed in SV. It works with uvm_object and interface. Is this achievable in UVM 1. dave_59. 02. it does not have anything rand). Using automation macros. The name of an uvm_event is unique, you can use uvm_event_pool to get the instance of the uvm_event with the same name. That means the other parameter Tname of. Using do_pack/do_unpack. As the name suggests, it keeps a track of the sequences that are registered with it, and calls them a number of times in a random fashion. 0a version of the standards document: “The goal is to allow stimulus and tests, including coverage and results checking, to be. Please see Register Abstraction for how each property is packed. 02. 02. Use uvm_config_db# (uvm_object)::set. The UVM TLM library defines several abstract, transaction-level interfaces and the ports and exports that facilitate their use. On the other side, Static component are physical components which are present since the begining and. For example, a uvm_registry base class could have provided the required infrastructure for creation and factory overrides. Implementations of uvm_object::do_pack and uvm_object::do_unpack should regard this bit when performing their respective operation. In our previous two posts in this series on Python as a verification language, we examined Python coroutines and using coroutines to create cocotb bus functional. Share. uvm_transaction and uvm_component are also derived from uvm_object. This doesn't have any purpose, but serves as the base class for all UVM classes. All counts are cleared and the any processes waiting on a call to wait_for(UVM_ALL_DROPPED, uvm_top) are released. The important thing to remember is that each entry needs a unique field name or label (if the global scope is being used), or the path needs toThese macros are used to start sequences and sequence items on default sequencer, m_sequencer. Here are my codes: typedef class tmp_for_test; class config_agent extends uvm_agent; typedef config_agent this_type; tmp_for_test #(int, byte) tmp_f_t; // Provide implmentations of virtual me. 2-2017. UVM REPORTING The uvm_report_object provides an interface to the UVM reporting facility. Share. A flat uvm_config_db with wildcard scopes and many entries can be a performance hog. 09. sv is included. If you are using OVM/UVM then get_full_name() / get_name() will return the name of the component in the testbench hierarchy. They allow access to the functions copy, compare, pack, unpack, record. Posted November 30, 2015. Without it, registration would require an instance of the object itself. uvm_object is the main class in which common functions to print, copy, and compare two objects of the same class are defined. For objects, pack 4 bits prior to packing the object itself. UVM FACTORY. Each resource has a set of scope. メンバの型によって、さまざまあります。. You can assure clients that the. This works in conjunction with the Register Adapter, as its bus2reg() function simply grabs the data from the top of its queue and returns its uvm_reg_bus_op object. UVM utility & field macros. Connect and share knowledge within a single location that is structured and easy to search. raise_objection()을 호출하면 uvm_object 클래스의 카운트가 증가해서 0 값이 아닌 다른 값을 가지게 되고 그러면 uvm_phase의 phase executer가 시뮬레이션을 종료하지 않게 됩니다. These macros are used to start sequences and sequence items on default sequencer, m_sequencer. object queues and publishes a number of transfers equal to the total length of the burst size. On calling `uvm_do () the above-defined 6 steps will be executed. UVM 1. As an additional aside, it's also important to acknowledge that while uvm_object does provide a pack/do_pack/do_unpack interface, there's zero restrictions on where a packer can actually be used. If an uvm_event of the name does not exist, uvm_event_pool will create one when get() is called the first time. Unfortunately, SystemVerilog does not provide a good way to save Creates a new event object. However, I downloaded the UVM library from accelera's website and looked at the code and it looks like it's just some SystemVerilog. The record function of uvm_object calls the do_record. The UVM configuration database is a global repository that allows you to pass configuration information, such as parameters, objects, or handles, between different UVM components. Overriding a type involves the following steps: Firstly, the. I did not register any class with the same name, unless the parent one which, I suppose, does not present any problem. get_next_item (t). The verification testbench will be developed in UVM and has the following block diagram: The sequence generates a random stream of input values that will be passed to the driver as a uvm_sequence_item. Description. As I understood for all items inherited from uvm_component, they all need uvm_component parent as part of constructor input argument. 이때 아래의 그림과 같이 agent내부에서는 어떤 configuration이 uvm_config_db를 통하여 설정됨을 가정하여 get ()으로. The first is registering a component with the factory, so the factory knows how to create an instance of it. That is the macro call is delegated to a uvm_report_error() function call. com Each component goes through a pre-defined set of phases, and it cannot proceed to the next phase until all components finish their execution in the current phase. {"payload":{"allShortcutsEnabled":false,"fileTree":{"distrib/src/reg":{"items":[{"name":"sequences","path":"distrib/src/reg/sequences","contentType":"directory. SNUG 2018 Page 6 SystemVerilog Virtual Classes, Methods, Interfaces Rev 1. Macro. Every uvm_object instance has a compare() method for performing comparisons with another object. Blocking operationsPacking is just a way to convert your uvm_object into a bit array. The uvm_event class is directly derived from the uvm_object class. A scope is a context like an instantiation of the component in the uvm. These levels are nothing but integer enum values (the parentheses in the figure show the values). Unfortunately, SystemVerilog does not provide a good way to saveCreates a new event object. build_phase (phase) must be called in the. . Hence, it is required to have proper synchronization to avoid objects/components being called before they are created, The UVM phasing mechanism serves the purpose of synchronization. The function that is actually called depends on the context where the macro is used. uvm config db set method void uvm_config_db#(type T = int)::set(uvm_component cntxt, string inst_name, string field_name, T value); Where, T is the type of element being configured. We need to plan for it by structuring our code in certain ways. The UVM class library provides the basic building blocks for creating verification data and components. 02. The utility macros help to register each object with the factory. The verification testbench will be developed in UVM and has the following block diagram: The sequence generates a random stream of input values that will be passed to the driver as a uvm_sequence_item. You need to create a uvm_object temp variable, then do an explicit dynamic cast, e. and a whole lot more!using EDA Playground VHDL Verilog/SystemVerilog UVM EasierUVM SVAUnit SVUnit VUnit TL-Verilog e + Verilog Python + Verilog Python Only C++/SystemC. OOP design patterns take reuse another step. 2 uvm_object constructor. The utility macros help to register each object with the factory. 2 Class Reference is independent of any specific design processes and is complete for the construction ofThe UVM 1. Factory is a singleton object and there is only one instance of the factory in a UVM environment. The uvm_subscriber is derived from uvm_component and adds up the analysis_export port in the class. They automatically create a new object via calls to `uvm_create, randomize the item and send it to a sequencer. base. Then from your component, do. trigger. The first kind of queues store the handles to the uvm_resource objects that have the common field_name. 2 Comments. After all, you just set the value of data and id with the name “t1”. Both the main sequence and the other sequence get an uvm_event with. Classes deriving from uvm_object must implement the pure virtual methods such as create and get_type_name. ”. To avoid the overhead of creating an instance of every component and object that get registered, the factory holds lightweight wrappers, or proxies. uvm config db set method void uvm_config_db#(type T = int)::set(uvm_component cntxt, string inst_name, string field_name, T value); Where, T is the type of element being configured. ; Once you convert your testbench from passing individual values to passing config objects, you can see the bigger picture, which is that a testbench is configured and built from the top down, guided by the configuration. They allow access to the functions copy, compare, pack, unpack, record. zhang@amd. – dave_59. Line 11-Line 15 Use the UVM functions to automatically implement functions such as copy(), compare(), print(), pack(), and so on. The uvm_object provides methods like create, clone, copy, record, compare, print, etc. virtual function uvm_object. It also becomes easier to connect to design regardless of the number of ports it has since that information is encapsulated in an interface. randomize with {…} or `uvm_do_with) permit specifying additional constraints when randomizing an object. pyuvm uses cocotb to interact with the simulator and schedule simulation events. In UVM, is there anything in the uvm_object::compare method or uvm_comparer policy to implement a different comparison similar to the VMM compare() kind argument? For example, I would like a mechanism to be able to select between doing a full compare of all object members or a partial subset compare. It is. For Design specification and Verification plan, refer to Memory Model. It is an abstract class with no data members or functions. The UVM factory allows an object of one type to be overridden with an object of its derived type without changing the testbench structure. 02. The utility macros help to register each object with the factory. The primary purpose of a function is to return a value that can be used in an expression and cannot consume simulation time. It serves an important role to define a set of methods such as create, copy, print, clone, compare, record, etc. uvm_object. callback in uvm_sequence. drop_objection (uvm_object obj = null, string description = ” “, int count = 1) Drops number of objections for corresponding object with default count = 1uvm_object is the main class in which common functions to print, copy, and compare two objects of the same class are defined. e. ) and random seeding were defined in it. UVM pre-defines six verbosity levels; UVM_NONE to UVM_DEBUG. 8k 3 25 63. Similarly uvm_object::compare() calls the __m_uvm_field_automation() with UVM_COMPARE. The uvm_config_db class is the recommended way to access the resource database. System Verilog has virtual methods, virtual interfaces, and virtual classes. You should create a new macro that add quotes around it input argument. The handle to the uvm_resource object is stored in two kinds of uvm_queues. It has various methods to create different uvm_component or uvm_object instances and also to override it. class my_driver. Follow. The tutorial explains the UVM concepts, structure, coding style, and best practices with examples. pyuvm implements the most often-used parts of the UVM while taking advantage of the fact that Python does not have strict typing and does not require parameterized classes. This method calls uvm_event_base::wait_ptrigger followed by. Objections provide a facility for coordinating status information between two or more participating. A parent creates a child, and the uvm_component represents a hierarchal family tree in a database. uvm_comparer is the standalone class used to set a policy for doing comparisons and determines how miscompares are counted. 02 SystemVerilog 기초 1 01. It looks like you have a compilation of uvm_pkg from a previous run that is conflicting with this run. See `uvm_object_utils and `uvm_component_utils for details. This article explains how to use a verbosity threshold to filter messages. Write this register if the DUT register is out-of-date with the desired/mirrored value in the abstraction class, as determined by the uvm_reg::needs_update () method. Description. The first kind of queues store the handles to the uvm_resource objects that have the common field_name. The driver code is relatively simple. So I then downloaded UVM 2017-1. Inline constraints (i. This class will also need to be able to get information from the config_db using hierarchical paths, and plain old uvm_objects don't have hierarchy. UVM_Object. UVM 버전에 무관하게 constructor를. If we already have a data object that we simply want to send to a sequencer, we can use `uvm_send. 1 Class Reference is a comprehensive document that describes the classes, methods, macros, and callbacks that constitute the UVM 1. Pre-defined Verbosity Levels. As you see the following diagram, the uvm_object::copy() calls the __m_uvm_field_automation() with UVM_COPY as the value of the what__. UVM_DEFAULT specifies. e it is allowed to send the transaction Only after consumption of the previously sent transaction, in this case, the sender and receiver must be in sync else. You need to create an array of ral_block_traffic_cfg objects: rand ral_block_traffic_cfg cfg [2]; You created an array of type uvm_reg_block, named it ral_cfg, but it has nothing to do with the ral_block_traffic_cfg object. Memory abstraction base class. Unlike registers, memories are not mirrored because of the potentially large data space: tests that walk the entire memory space would negate any benefit from sparse memory modelling techniques. Sequences. METHOD – callback method call to invoke. by extending the uvm_object or the uvm_sequence_item base class. ; It is singleton class.