diff --git a/src/base/uvm_cmdline_report.svh b/src/base/uvm_cmdline_report.svh index fe47525..53eb347 100644 --- a/src/base/uvm_cmdline_report.svh +++ b/src/base/uvm_cmdline_report.svh @@ -41,12 +41,11 @@ class uvm_cmdline_verbosity extends uvm_cmdline_setting_base; // Instance Methods/Variables int verbosity; enum {STANDARD, NON_STANDARD, ILLEGAL} src; - + localparam string prefix = "+UVM_VERBOSITY="; + // Static Methods/Variables - static const string prefix = "+UVM_VERBOSITY="; static uvm_cmdline_verbosity settings[$]; - // Function --NODOCS-- init // Initializes the ~settings~ queue with the command line verbosity settings. // @@ -179,8 +178,8 @@ class uvm_cmdline_set_verbosity extends uvm_cmdline_setting_base; string phase; time offset; - // Static Methods/Variables - static const string prefix = "+uvm_set_verbosity="; + localparam string prefix = "+uvm_set_verbosity="; + // Static Methods/Variables static uvm_cmdline_set_verbosity settings[$]; // Processed command line settings @@ -375,8 +374,9 @@ class uvm_cmdline_set_action extends uvm_cmdline_setting_base; uvm_severity sev; uvm_action action; + localparam string prefix = "+uvm_set_action="; + // Static Methods/Variables - static const string prefix="+uvm_set_action="; static uvm_cmdline_set_action settings[$]; // Processed command line settings // Function --NODOCS-- init @@ -505,8 +505,9 @@ class uvm_cmdline_set_severity extends uvm_cmdline_setting_base; uvm_severity orig_sev; uvm_severity sev; + localparam string prefix="+uvm_set_severity="; + // Static Methods/Variables - static const string prefix="+uvm_set_severity="; static uvm_cmdline_set_severity settings[$]; // Processed command line settings // Function --NODOCS-- init diff --git a/src/base/uvm_globals.svh b/src/base/uvm_globals.svh index 8ca4ae6..89d7783 100644 --- a/src/base/uvm_globals.svh +++ b/src/base/uvm_globals.svh @@ -39,7 +39,7 @@ typedef class uvm_root; typedef class uvm_report_object; typedef class uvm_report_message; -// Title: Globals +// Title -- NODOCS -- Globals //------------------------------------------------------------------------------ // diff --git a/src/base/uvm_hdl_polling.svh b/src/base/uvm_hdl_polling.svh index ccb7824..56eba76 100644 --- a/src/base/uvm_hdl_polling.svh +++ b/src/base/uvm_hdl_polling.svh @@ -27,8 +27,6 @@ // //---------------------------------------------------------------------- -// Title: HDL Signal Polling - `ifndef UVM_HDL_POLLING `define UVM_HDL_POLLING typedef class uvm_hdl_polling_cbs; diff --git a/src/base/uvm_report_catcher.svh b/src/base/uvm_report_catcher.svh index c87ae48..be3fbbf 100644 --- a/src/base/uvm_report_catcher.svh +++ b/src/base/uvm_report_catcher.svh @@ -87,8 +87,8 @@ virtual class uvm_report_catcher extends uvm_callback; local static int m_caught_warning; // Flag counts - const static int DO_NOT_CATCH = 1; - const static int DO_NOT_MODIFY = 2; + localparam int DO_NOT_CATCH = 1; + localparam int DO_NOT_MODIFY = 2; local static int m_debug_flags; local static bit do_report; diff --git a/src/base/uvm_spell_chkr.svh b/src/base/uvm_spell_chkr.svh index 3674ba1..22f594c 100644 --- a/src/base/uvm_spell_chkr.svh +++ b/src/base/uvm_spell_chkr.svh @@ -39,7 +39,7 @@ class uvm_spell_chkr #(type T=int); typedef T tab_t[string]; - static const int unsigned max = '1; + localparam int unsigned max = '1; //-------------------------------------------------------------------- // check diff --git a/src/comps/uvm_random_stimulus.svh b/src/comps/uvm_random_stimulus.svh index c660a3f..56e04bb 100644 --- a/src/comps/uvm_random_stimulus.svh +++ b/src/comps/uvm_random_stimulus.svh @@ -56,7 +56,7 @@ //@uvm_compat class uvm_random_stimulus #(type T=uvm_transaction) extends uvm_component; - const static string type_name = "uvm_random_stimulus #(T)"; + localparam string type_name = "uvm_random_stimulus #(T)"; typedef uvm_random_stimulus #(T) this_type; `uvm_component_param_utils(this_type) diff --git a/src/deprecated/macros/uvm_object_defines.svh b/src/deprecated/macros/uvm_object_defines.svh deleted file mode 100644 index 8a996ef..0000000 --- a/src/deprecated/macros/uvm_object_defines.svh +++ /dev/null @@ -1,2516 +0,0 @@ -//------------------------------------------------------------------------------ -// Copyright 2012 Aldec -// Copyright 2007-2012 Mentor Graphics Corporation -// Copyright 2014 Intel Corporation -// Copyright 2010-2013 Synopsys, Inc. -// Copyright 2007-2018 Cadence Design Systems, Inc. -// Copyright 2012 AMD -// Copyright 2012-2018 NVIDIA Corporation -// Copyright 2012-2018 Cisco Systems, Inc. -// Copyright 2012 Accellera Systems Initiative -// All Rights Reserved Worldwide -// -// Licensed under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in -// compliance with the License. You may obtain a copy of -// the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in -// writing, software distributed under the License is -// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, either express or implied. See -// the License for the specific language governing -// permissions and limitations under the License. -//------------------------------------------------------------------------------ - - -// This file is the DEPRECATED version of uvm_object_defines.svh -// it contains versions of the macros that support functionality which was -// deprecated between UVM 1.2 and 1800.2-2017. - - - -`ifndef UVM_OBJECT_DEFINES_SVH -`define UVM_OBJECT_DEFINES_SVH - -`ifdef UVM_EMPTY_MACROS - -`define uvm_field_utils_begin(T) -`define uvm_field_utils_end -`define uvm_object_utils(T) -`define uvm_object_param_utils(T) -`define uvm_object_utils_begin(T) -`define uvm_object_param_utils_begin(T) -`define uvm_object_abstract_utils(T) -`define uvm_object_abstract_param_utils(T) -`define uvm_object_abstract_utils_begin(T) -`define uvm_object_abstract_param_utils_begin(T) -`define uvm_object_abstract_utils_end -`define uvm_component_utils(T) -`define uvm_component_param_utils(T) -`define uvm_component_utils_begin(T) -`define uvm_component_param_utils_begin(T) -`define uvm_component_abstract_utils(T) -`define uvm_component_abstract_param_utils(T) -`define uvm_component_abstract_utils_begin(T) -`define uvm_component_abstract_param_utils_begin(T) -`define uvm_component_utils_end -`define uvm_field_int(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_real(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_enum(T,ARG,FLAG=UVM_DEFAULT) -`define uvm_field_object(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_event(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_string(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_array_enum(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_array_int(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_sarray_int(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_sarray_enum(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_array_object(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_sarray_object(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_array_string(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_sarray_string(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_queue_enum(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_queue_int(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_queue_object(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_queue_string(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_int_string(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_string_string(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_object_string(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_int_int(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_int_int(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_int_int_unsigned(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_int_integer(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_int_integer_unsigned(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_int_byte(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_int_byte_unsigned(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_int_shortint(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_int_shortint_unsigned(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_int_longint(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_int_longint_unsigned(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_int_key(KEY, ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_string_int(ARG,FLAG=UVM_DEFAULT) -`define uvm_field_aa_object_int(ARG,FLAG=UVM_DEFAULT) - -`else - -//------------------------------------------------------------------------------ -// -// Title -- NODOCS -- Utility and Field Macros for Components and Objects -// -// Group -- NODOCS -- Utility Macros -// -// The ~utils~ macros define the infrastructure needed to enable the -// object/component for correct factory operation. See <`uvm_object_utils> and -// <`uvm_component_utils> for details. -// -// A ~utils~ macro should be used inside ~every~ user-defined class that extends -// directly or indirectly, including and -// . -// -// Below is an example usage of the ~utils~ macro for a user-defined object. -// -//| class mydata extends uvm_object; -//| -//| `uvm_object_utils(mydata) -//| -//| // declare data properties -//| -//| function new(string name="mydata_inst"); -//| super.new(name); -//| endfunction -//| -//| endclass -// -// Below is an example usage of a ~utils~ macro for a user-defined component. -// -//| class my_comp extends uvm_component; -//| -//| `uvm_component_utils(my_comp) -//| -//| // declare data properties -//| -//| function new(string name, uvm_component parent=null); -//| super.new(name,parent); -//| endfunction -//| -//| endclass -// -//------------------------------------------------------------------------------ - - -// Define - UVM_FIELD_FLAG_SIZE -// -// The macro defines the number of bits in uvm_field_flag_t. It may be defined by the user but it -// must be at least as large as parameter UVM_FIELD_FLAG_RESERVED_BITS. -// -`ifndef UVM_FIELD_FLAG_SIZE - `define UVM_FIELD_FLAG_SIZE UVM_FIELD_FLAG_RESERVED_BITS -`endif - - -// Definitions for the user to use inside their derived data class declarations. - -// MACRO -- NODOCS -- `uvm_field_utils_begin - -// MACRO -- NODOCS -- `uvm_field_utils_end -// -// These macros form a block in which `uvm_field_* macros can be placed. -// Used as -// -//| `uvm_field_utils_begin(TYPE) -//| `uvm_field_* macros here -//| `uvm_field_utils_end -// -// -// These macros do ~not~ perform factory registration nor implement the -// ~get_type_name~ and ~create~ methods. Use this form when you need custom -// implementations of these two methods, or when you are setting up field macros -// for an abstract class (i.e. virtual class). - -// Implementation Note: The `uvm_field_utils_begin macro creates a new local -// function "__m_uvm_execute_field_op", which has a similar signature to -// , but the arguments are named differently so as to prevent -// potential collisions with field names. For example, if the user had a -// field named "op", then that could collide with the "op" argument of the -// method. - -`define uvm_field_utils_begin(T) \ -function void do_execute_op( uvm_field_op op ); \ - super.do_execute_op(op); \ - __m_uvm_execute_field_op(op); \ -endfunction : do_execute_op \ -function void __m_uvm_execute_field_op( uvm_field_op __local_op__ ); \ - uvm_field_flag_t local_op_type__; /* Used to avoid re-querying */ \ - T local_rhs__; /* Used for $casting copy and compare */ \ - uvm_resource_base local_rsrc__; /* Used for UVM_SET ops */ \ - string local_rsrc_name__; \ - uvm_object local_obj__; /* Used when trying to read uvm_object resources */ \ - bit local_success__; /* Used when trying to read resources */ \ - typedef T __local_type__; /* Used for referring to type T in field macros */ \ - int local_size__; /* Used when unpacking size values */ \ - /* All possible policy classes */ \ - /* Using the same name as the do_* methods, allows macro reuse */ \ - uvm_printer __local_printer__; \ - uvm_comparer __local_comparer__; \ - uvm_recorder __local_recorder__; \ - uvm_packer __local_packer__; \ - uvm_copier __local_copier__; \ - void'($cast(local_rhs__, __local_op__.get_rhs())); \ - if (($cast(local_rsrc__, __local_op__.get_rhs())) && \ - (local_rsrc__ != null)) \ - local_rsrc_name__ = local_rsrc__.get_name(); \ - local_op_type__ = __local_op__.get_op_type(); \ - case (local_op_type__) \ - UVM_PRINT: begin \ - $cast(__local_printer__, __local_op__.get_policy()); \ - end \ - UVM_COMPARE: begin \ - if (local_rhs__ == null) return; \ - $cast(__local_comparer__, __local_op__.get_policy()); \ - end \ - UVM_RECORD: begin \ - $cast(__local_recorder__, __local_op__.get_policy()); \ - end \ - UVM_PACK, UVM_UNPACK: begin \ - $cast(__local_packer__, __local_op__.get_policy()); \ - end \ - UVM_COPY: begin \ - if (local_rhs__ == null) return; \ - $cast(__local_copier__, __local_op__.get_policy()); \ - end \ - UVM_SET: begin \ - if (local_rsrc__ == null) return; \ - end \ - default: \ - return; /* unknown op, just return */ \ - endcase \ - -`define uvm_field_utils_end \ -endfunction : __m_uvm_execute_field_op - - -// MACRO -- NODOCS -- `uvm_object_utils - -// MACRO -- NODOCS -- `uvm_object_param_utils - -// MACRO -- NODOCS -- `uvm_object_utils_begin - -// MACRO -- NODOCS -- `uvm_object_param_utils_begin - -// MACRO -- NODOCS -- `uvm_object_utils_end -// -// -based class declarations may contain one of the above forms of -// utility macros. -// -// For simple objects with no field macros, use -// -//| `uvm_object_utils(TYPE) -// -// For simple objects with field macros, use -// -//| `uvm_object_utils_begin(TYPE) -//| `uvm_field_* macro invocations here -//| `uvm_object_utils_end -// -// For parameterized objects with no field macros, use -// -//| `uvm_object_param_utils(TYPE) -// -// For parameterized objects, with field macros, use -// -//| `uvm_object_param_utils_begin(TYPE) -//| `uvm_field_* macro invocations here -//| `uvm_object_utils_end -// -// Simple (non-parameterized) objects use the uvm_object_utils* versions, which -// do the following: -// -// o Implements get_type_name, which returns TYPE as a string -// -// o Implements create, which allocates an object of type TYPE by calling its -// constructor with no arguments. TYPE's constructor, if defined, must have -// default values on all it arguments. -// -// o Registers the TYPE with the factory, using the string TYPE as the factory -// lookup string for the type. -// -// o Implements the static get_type() method which returns a factory -// proxy object for the type. -// -// o Implements the virtual get_object_type() method which works just like the -// static get_type() method, but operates on an already allocated object. -// -// Parameterized classes must use the uvm_object_param_utils* versions. They -// differ from <`uvm_object_utils> only in that they do not supply a type name -// when registering the object with the factory. As such, name-based lookup with -// the factory for parameterized classes is not possible. -// -// The macros with _begin suffixes are the same as the non-suffixed versions -// except that they also start a block in which `uvm_field_* macros can be -// placed. The block must be terminated by `uvm_object_utils_end. -// - -`define uvm_object_utils(T) \ - `m_uvm_object_registry_internal(T,T) \ - `m_uvm_object_create_func(T) \ - `uvm_type_name_decl(`"T`") - -`define uvm_object_param_utils(T) \ - `m_uvm_object_registry_param(T) \ - `m_uvm_object_create_func(T) - -`define uvm_object_utils_begin(T) \ - `uvm_object_utils(T) \ - `uvm_field_utils_begin(T) - -`define uvm_object_param_utils_begin(T) \ - `uvm_object_param_utils(T) \ - `uvm_field_utils_begin(T) - -`define uvm_object_abstract_utils(T) \ - `m_uvm_object_abstract_registry_internal(T,T) \ - `uvm_type_name_decl(`"T`") - -`define uvm_object_abstract_param_utils(T) \ - `m_uvm_object_abstract_registry_param(T) - -`define uvm_object_abstract_utils_begin(T) \ - `uvm_object_abstract_utils(T) \ - `uvm_field_utils_begin(T) - -`define uvm_object_abstract_param_utils_begin(T) \ - `uvm_object_abstract_param_utils(T) \ - `uvm_field_utils_begin(T) - -`define uvm_object_utils_end \ - `uvm_field_utils_end - -// MACRO -- NODOCS -- `uvm_component_utils - -// MACRO -- NODOCS -- `uvm_component_param_utils - -// MACRO -- NODOCS -- `uvm_component_utils_begin - -// MACRO -- NODOCS -- `uvm_component_param_utils_begin - -// MACRO -- NODOCS -- `uvm_component_end -// -// uvm_component-based class declarations may contain one of the above forms of -// utility macros. -// -// For simple components with no field macros, use -// -//| `uvm_component_utils(TYPE) -// -// For simple components with field macros, use -// -//| `uvm_component_utils_begin(TYPE) -//| `uvm_field_* macro invocations here -//| `uvm_component_utils_end -// -// For parameterized components with no field macros, use -// -//| `uvm_component_param_utils(TYPE) -// -// For parameterized components with field macros, use -// -//| `uvm_component_param_utils_begin(TYPE) -//| `uvm_field_* macro invocations here -//| `uvm_component_utils_end -// -// Simple (non-parameterized) components must use the uvm_components_utils* -// versions, which do the following: -// -// o Implements get_type_name, which returns TYPE as a string. -// -// o Implements create, which allocates a component of type TYPE using a two -// argument constructor. TYPE's constructor must have a name and a parent -// argument. -// -// o Registers the TYPE with the factory, using the string TYPE as the factory -// lookup string for the type. -// -// o Implements the static get_type() method which returns a factory -// proxy object for the type. -// -// o Implements the virtual get_object_type() method which works just like the -// static get_type() method, but operates on an already allocated object. -// -// Parameterized classes must use the uvm_object_param_utils* versions. They -// differ from `uvm_object_utils only in that they do not supply a type name -// when registering the object with the factory. As such, name-based lookup with -// the factory for parameterized classes is not possible. -// -// The macros with _begin suffixes are the same as the non-suffixed versions -// except that they also start a block in which `uvm_field_* macros can be -// placed. The block must be terminated by `uvm_component_utils_end. -// - -`define uvm_component_utils(T) \ - `m_uvm_component_registry_internal(T,T) \ - `uvm_type_name_decl(`"T`") \ - -`define uvm_component_param_utils(T) \ - `m_uvm_component_registry_param(T) \ - - -`define uvm_component_utils_begin(T) \ - `uvm_component_utils(T) \ - `uvm_field_utils_begin(T) - -`define uvm_component_param_utils_begin(T) \ - `uvm_component_param_utils(T) \ - `uvm_field_utils_begin(T) - -`define uvm_component_abstract_utils(T) \ - `m_uvm_component_abstract_registry_internal(T,T) \ - `uvm_type_name_decl(`"T`") \ - -`define uvm_component_abstract_param_utils(T) \ - `m_uvm_component_abstract_registry_param(T) \ - - -`define uvm_component_abstract_utils_begin(T) \ - `uvm_component_abstract_utils(T) \ - `uvm_field_utils_begin(T) - -`define uvm_component_abstract_param_utils_begin(T) \ - `uvm_component_abstract_param_utils(T) \ - `uvm_field_utils_begin(T) - -`define uvm_component_utils_end \ - `uvm_field_utils_end - - -// MACRO -- NODOCS -- `uvm_object_registry -// -// Register a uvm_object-based class with the factory -// -//| `uvm_object_registry(T,S) -// -// Registers a uvm_object-based class ~T~ and lookup -// string ~S~ with the factory. ~S~ typically is the -// name of the class in quotes. The <`uvm_object_utils> -// family of macros uses this macro. - -`define uvm_object_registry(T,S) \ - typedef uvm_object_registry#(T,S) type_id; \ - static function type_id get_type(); \ - return type_id::get(); \ - endfunction \ - virtual function uvm_object_wrapper get_object_type(); \ - return type_id::get(); \ - endfunction - - -// MACRO -- NODOCS -- `uvm_component_registry -// -// Registers a uvm_component-based class with the factory -// -//| `uvm_component_registry(T,S) -// -// Registers a uvm_component-based class ~T~ and lookup -// string ~S~ with the factory. ~S~ typically is the -// name of the class in quotes. The <`uvm_object_utils> -// family of macros uses this macro. - -`define uvm_component_registry(T,S) \ - typedef uvm_component_registry #(T,S) type_id; \ - static function type_id get_type(); \ - return type_id::get(); \ - endfunction \ - virtual function uvm_object_wrapper get_object_type(); \ - return type_id::get(); \ - endfunction - - -`define uvm_declare_type_alias(TYPE,NAME,SFX=) \ - static bit m__alias_declared``SFX = TYPE::type_id::set_type_alias(NAME); - - -// uvm_new_func -// ------------ - -`define uvm_new_func \ - function new (string name, uvm_component parent); \ - super.new(name, parent); \ - endfunction - - -//----------------------------------------------------------------------------- -// INTERNAL MACROS - in support of *_utils macros -- do not use directly -//----------------------------------------------------------------------------- - -// m_uvm_object_create_func -// ------------------------ - -`define m_uvm_object_create_func(T) \ - function uvm_object create (string name=""); \ - T tmp; \ - if (name=="") tmp = new(); \ - else tmp = new(name); \ - return tmp; \ - endfunction - -// Macro --NODOCS-- uvm_type_name_decl(TNAME_STRING) -// Potentially public macro for Mantis 5003. -// -// This macro creates a statically accessible -// ~type_name~, and implements the virtual -// method. -// -// *Note:* When running with <`UVM_ENABLE_DEPRECATED_API>, -// the ~type_name~ member is declared as: -//| const static string type_name = TNAME_STRING; -// This is unsafe, as static initialization can cause races -// to occur. When running without <`UVM_ENABLE_DEPRECATED_API>, -// the implementation is an static initialization safe function: -//| static function string type_name(); -//| return TNAME_STRING; -//| endfunction : type_name -// -`ifdef UVM_ENABLE_DEPRECATED_API - `define uvm_type_name_decl(TNAME_STRING) \ - const static string type_name = TNAME_STRING; \ - virtual function string get_type_name(); \ - return TNAME_STRING; \ - endfunction : get_type_name -`else - `define uvm_type_name_decl(TNAME_STRING) \ - static function string type_name(); \ - return TNAME_STRING; \ - endfunction : type_name \ - virtual function string get_type_name(); \ - return TNAME_STRING; \ - endfunction : get_type_name -`endif // !`ifdef UVM_ENABLE_DEPRECATED_API - - -// m_uvm_object_registry_internal -// ------------------------------ - -//This is needed due to an issue in of passing down strings -//created by args to lower level macros. -`define m_uvm_object_registry_internal(T,S) \ - typedef uvm_object_registry#(T,`"S`") type_id; \ - static function type_id get_type(); \ - return type_id::get(); \ - endfunction \ - virtual function uvm_object_wrapper get_object_type(); \ - return type_id::get(); \ - endfunction - - -// m_uvm_object_registry_param -// --------------------------- - -`define m_uvm_object_registry_param(T) \ - typedef uvm_object_registry #(T) type_id; \ - static function type_id get_type(); \ - return type_id::get(); \ - endfunction \ - virtual function uvm_object_wrapper get_object_type(); \ - return type_id::get(); \ - endfunction - -// m_uvm_object_abstract_registry_internal -// --------------------------------------- - -//This is needed due to an issue in of passing down strings -//created by args to lower level macros. -`define m_uvm_object_abstract_registry_internal(T,S) \ - typedef uvm_abstract_object_registry#(T,`"S`") type_id; \ - static function type_id get_type(); \ - return type_id::get(); \ - endfunction \ - virtual function uvm_object_wrapper get_object_type(); \ - return type_id::get(); \ - endfunction - - -// m_uvm_object_abstract_registry_param -// ------------------------------------ - -`define m_uvm_object_abstract_registry_param(T) \ - typedef uvm_abstract_object_registry #(T) type_id; \ - static function type_id get_type(); \ - return type_id::get(); \ - endfunction \ - virtual function uvm_object_wrapper get_object_type(); \ - return type_id::get(); \ - endfunction - - -// m_uvm_component_registry_internal -// --------------------------------- - -//This is needed due to an issue in of passing down strings -//created by args to lower level macros. -`define m_uvm_component_registry_internal(T,S) \ - typedef uvm_component_registry #(T,`"S`") type_id; \ - static function type_id get_type(); \ - return type_id::get(); \ - endfunction \ - virtual function uvm_object_wrapper get_object_type(); \ - return type_id::get(); \ - endfunction - -// versions of the uvm_component_registry macros to be used with -// parameterized classes - -// m_uvm_component_registry_param -// ------------------------------ - -`define m_uvm_component_registry_param(T) \ - typedef uvm_component_registry #(T) type_id; \ - static function type_id get_type(); \ - return type_id::get(); \ - endfunction \ - virtual function uvm_object_wrapper get_object_type(); \ - return type_id::get(); \ - endfunction - -// m_uvm_component_abstract_registry_internal -// ------------------------------------------ - -//This is needed due to an issue in of passing down strings -//created by args to lower level macros. -`define m_uvm_component_abstract_registry_internal(T,S) \ - typedef uvm_abstract_component_registry #(T,`"S`") type_id; \ - static function type_id get_type(); \ - return type_id::get(); \ - endfunction \ - virtual function uvm_object_wrapper get_object_type(); \ - return type_id::get(); \ - endfunction - -// versions of the uvm_component_abstract_registry macros to be used with -// parameterized classes - -// m_uvm_component_abstract_registry_param -// --------------------------------------- - -`define m_uvm_component_abstract_registry_param(T) \ - typedef uvm_abstract_component_registry #(T) type_id; \ - static function type_id get_type(); \ - return type_id::get(); \ - endfunction \ - virtual function uvm_object_wrapper get_object_type(); \ - return type_id::get(); \ - endfunction - - - -//------------------------------------------------------------------------------ -// -// Group -- NODOCS -- Field Macros -// -// The `uvm_field_* macros are invoked inside of the `uvm_*_utils_begin and -// `uvm_*_utils_end macro blocks to form "automatic" implementations of the -// core data methods: copy, compare, pack, unpack, record, print, and sprint. -// -// By using the macros, you do not have to implement any of the do_* methods -// inherited from . However, be aware that the field macros expand -// into general inline code that is not as run-time efficient nor as flexible -// as direct implementations of the do_* methods. -// -// Below is an example usage of the field macros for a sequence item. -// -//| class my_trans extends uvm_sequence_item; -//| -//| cmd_t cmd; -//| int addr; -//| int data[$]; -//| my_ext ext; -//| string str; -//| -//| `uvm_object_utils_begin(my_trans) -//| `uvm_field_enum (cmd_t, cmd, UVM_ALL_ON) -//| `uvm_field_int (addr, UVM_ALL_ON) -//| `uvm_field_queue_int(data, UVM_ALL_ON) -//| `uvm_field_object (ext, UVM_ALL_ON) -//| `uvm_field_string (str, UVM_ALL_ON) -//| `uvm_object_utils_end -//| -//| function new(string name="mydata_inst"); -//| super.new(name); -//| endfunction -//| -//| endclass -// -// Below is an example usage of the field macros for a component. -// -//| class my_comp extends uvm_component; -//| -//| my_comp_cfg cfg; -//| -//| `uvm_component_utils_begin(my_comp) -//| `uvm_field_object (cfg, UVM_ALL_ON) -//| `uvm_object_utils_end -//| -//| function new(string name="my_comp_inst", uvm_component parent=null); -//| super.new(name); -//| endfunction -//| -//| endclass -// -// Each `uvm_field_* macro is named according to the particular data type it -// handles: integrals, strings, objects, queues, etc., and each has at least two -// arguments: ~ARG~ and ~FLAG~. -// -// ARG - is the instance name of the variable, whose type must be compatible with -// the macro being invoked. In the example, class variable ~addr~ is an integral type, -// so we use the ~`uvm_field_int~ macro. -// -// FLAG - if set to ~UVM_ALL_ON~, as in the example, the ARG variable will be -// included in all data methods. If FLAG is set to something other than -// ~UVM_ALL_ON~ or ~UVM_DEFAULT~, it specifies which data method implementations will -// ~not~ include the given variable. Thus, if ~FLAG~ is specified as ~NO_COMPARE~, -// the ARG variable will not affect comparison operations, but it will be -// included in everything else. -// -// All possible values for ~FLAG~ are listed and described below. Multiple flag -// values can be bitwise OR'ed together (in most cases they may be added together -// as well, but care must be taken when using the + operator to ensure that the -// same bit is not added more than once). -// -// UVM_ALL_ON - Set all operations on. -// UVM_DEFAULT - This is the recommended set of flags to pass -// to the field macros. Currently, it enables -// all of the operations, making it functionally -// identical to ~UVM_ALL_ON~. In the future -// however, additional flags could be added with -// a recommended default value of ~off~. -// -// UVM_NOCOPY - Do not copy this field. -// UVM_NOCOMPARE - Do not compare this field. -// UVM_NOPRINT - Do not print this field. -// UVM_NOPACK - Do not pack or unpack this field. -// -// UVM_REFERENCE - For object types, operate only on the handle (e.g. no deep copy) -// -// UVM_PHYSICAL - Treat as a physical field. Use physical setting in -// policy class for this field. -// UVM_ABSTRACT - Treat as an abstract field. Use the abstract setting -// in the policy class for this field. -// UVM_READONLY - Do not allow setting of this field from the set_*_local -// methods or during operation. -// -// -// A radix for printing and recording can be specified by OR'ing one of the -// following constants in the ~FLAG~ argument -// -// UVM_BIN - Print / record the field in binary (base-2). -// UVM_DEC - Print / record the field in decimal (base-10). -// UVM_UNSIGNED - Print / record the field in unsigned decimal (base-10). -// UVM_OCT - Print / record the field in octal (base-8). -// UVM_HEX - Print / record the field in hexadecimal (base-16). -// UVM_STRING - Print / record the field in string format. -// UVM_TIME - Print / record the field in time format. -// -// Radix settings for integral types. Hex is the default radix if none is -// specified. -// -// A UVM component should ~not~ be specified using the `uvm_field_object macro -// unless its flag includes UVM_REFERENCE. Otherwise, the field macro will -// implement deep copy, which is an illegal operation for uvm_components. -// You will get a FATAL error if you tried to copy or clone an object containing -// a component handle that was registered with a field macro without the -// UVM_REFERENCE flag. You will also get duplicate entries when printing -// component topology, as this functionality is already provided by UVM. -//------------------------------------------------------------------------------ - -//----------------------------------------------------------------------------- -// Group -- NODOCS -- `uvm_field_* macros -// -// Macros that implement data operations for scalar properties. -// -//----------------------------------------------------------------------------- - -// The m_uvm_* macros are implementation artifacts. They are not intended to be -// directly used by the user. - -`define m_uvm_field_radix(FLAG) uvm_radix_enum'((FLAG)&(UVM_RADIX)) - -`define m_uvm_field_recursion(FLAG) uvm_recursion_policy_enum'((FLAG)&(UVM_RECURSION)) - -`define m_uvm_field_begin(ARG, FLAG) \ - begin \ - case (local_op_type__) - -`define m_uvm_field_end(ARG) \ - endcase \ - end - - -`define m_uvm_field_op_begin(OP, FLAG) \ -UVM_``OP: \ - if (!((FLAG)&UVM_NO``OP)) begin - -`define m_uvm_field_op_end(OP) \ - end - -// MACRO -- NODOCS -- `uvm_field_int -// -// Implements the data operations for any packed integral property. -// -//| `uvm_field_int(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is an integral property of the class, and ~FLAG~ is a bitwise OR of -// one or more flag settings as described in above. - -`define uvm_field_int(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG,FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - `uvm_compare_int(ARG, local_rhs__.ARG, `m_uvm_field_radix(FLAG), __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - `uvm_pack_int(ARG, __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - `uvm_unpack_int(ARG, __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(RECORD,FLAG) \ - `uvm_record_int(`"ARG`", \ - ARG, \ - $bits(ARG), \ - `m_uvm_field_radix(FLAG), \ - __local_recorder__) \ - `m_uvm_field_op_end(RECORD) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_int(ARG, $bits(ARG), `m_uvm_field_radix(FLAG),,__local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_resource_builtin_int_read(local_success__, \ - local_rsrc__, \ - ARG, \ - this) \ - /* TODO if(local_success__ && printing matches) */ \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - -// MACRO -- NODOCS -- `uvm_field_object -// -// Implements the data operations for a -based property. -// -//| `uvm_field_object(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is an object property of the class, and ~FLAG~ is a bitwise OR of -// one or more flag settings as described in above. - -`define uvm_field_object(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG,FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - `uvm_copy_object(ARG, local_rhs__.ARG, `m_uvm_field_recursion(FLAG), __local_copier__) \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - `uvm_compare_object(ARG, local_rhs__.ARG, `m_uvm_field_recursion(FLAG), __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - if (`m_uvm_field_recursion(FLAG) != UVM_REFERENCE) \ - `uvm_pack_object(ARG, __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - if (`m_uvm_field_recursion(FLAG) != UVM_REFERENCE) \ - `uvm_unpack_object(ARG, __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(RECORD,FLAG) \ - __local_recorder__.record_object(`"ARG`", ARG); \ - `m_uvm_field_op_end(RECORD) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_object(ARG, `m_uvm_field_recursion(FLAG),__local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_resource_read(local_success__, \ - local_rsrc__, \ - uvm_object, \ - local_obj__, \ - this) \ - if (local_success__) begin \ - if (local_obj__ == null) begin \ - ARG = null; \ - end else if (!$cast(ARG, local_obj__)) begin \ - `uvm_warning("UVM/FIELDS/OBJ_TYPE", $sformatf("Can't set field '%s' on '%s' with '%s' type", \ - `"ARG`", \ - this.get_full_name(), \ - local_obj__.get_type_name())) \ - end \ - /* TODO if(local_success__ && printing matches) */ \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - - -// MACRO -- NODOCS -- `uvm_field_string -// -// Implements the data operations for a string property. -// -//| `uvm_field_string(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is a string property of the class, and ~FLAG~ is a bitwise OR of -// one or more flag settings as described in above. - -`define uvm_field_string(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG, FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - `uvm_compare_string(ARG, local_rhs__.ARG, __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - `uvm_pack_string(ARG, __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - `uvm_unpack_string(ARG, __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(RECORD,FLAG) \ - `uvm_record_string(`"ARG`", ARG, __local_recorder__) \ - `m_uvm_field_op_end(RECORD) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - __local_printer__.print_string(`"ARG`", ARG); \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_resource_read(local_success__, \ - local_rsrc__, \ - string, \ - ARG, \ - this) \ - /* TODO if(local_success__ && printing matches) */ \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - - -// MACRO -- NODOCS -- `uvm_field_enum -// -// Implements the data operations for an enumerated property. -// -//| `uvm_field_enum(T,ARG,FLAG=UVM_DEFAULT) -// -// ~T~ is an enumerated _type_, ~ARG~ is an instance of that type, and -// ~FLAG~ is a bitwise OR of one or more flag settings as described in -// above. - -`define uvm_field_enum(T,ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG, FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - `uvm_compare_enum(ARG, local_rhs__.ARG, T, __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - `uvm_pack_enum(ARG, __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - `uvm_unpack_enum(ARG, T, __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(RECORD,FLAG) \ - `uvm_record_enum(`"ARG`", ARG, T, __local_recorder__) \ - `m_uvm_field_op_end(RECORD) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - if (`m_uvm_field_radix(FLAG) inside {UVM_NORADIX, UVM_ENUM, UVM_STRING}) \ - `uvm_print_enum(T, ARG,__local_printer__) \ - else \ - `uvm_print_int(ARG, $bits(ARG), `m_uvm_field_radix(FLAG),T,__local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_resource_enum_read(local_success__, \ - local_rsrc__, \ - T, \ - ARG, \ - this) \ - /* TODO if(local_success__ && printing matches) */ \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - - -// MACRO -- NODOCS -- `uvm_field_real -// -// Implements the data operations for any real property. -// -//| `uvm_field_real(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is an real property of the class, and ~FLAG~ is a bitwise OR of -// one or more flag settings as described in above. - -`define uvm_field_real(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG,FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - `uvm_compare_real(ARG, local_rhs__.ARG, __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - `uvm_pack_real(ARG, __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - `uvm_unpack_real(ARG, __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(RECORD,FLAG) \ - `uvm_record_real(`"ARG`", ARG, __local_recorder__) \ - `m_uvm_field_op_end(RECORD) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - __local_printer__.print_real(`"ARG`", ARG); \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_resource_real_read(local_success__, \ - local_rsrc__, \ - ARG, \ - this) \ - /* TODO if(local_success__ && printing matches) */ \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - -// MACRO -- NODOCS -- `uvm_field_event -// -// Implements the data operations for an event property. -// -//| `uvm_field_event(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is an event property of the class, and ~FLAG~ is a bitwise OR of -// one or more flag settings as described in above. - -`define uvm_field_event(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG,FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - `m_uvm_compare_begin(ARG, local_rhs__.ARG, __local_comparer__) \ - __local_comparer__.print_msg({`"ARG`", " event miscompare"}); \ - `m_uvm_compare_end \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(RECORD,FLAG) \ - `m_uvm_field_op_end(RECORD) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - __local_printer__.print_generic(`"ARG`", "event", -1, ""); \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - - -//----------------------------------------------------------------------------- -// Group -- NODOCS -- `uvm_field_sarray_* macros -// -// Macros that implement data operations for one-dimensional static array -// properties. -//----------------------------------------------------------------------------- - -// MACRO -- NODOCS -- `uvm_field_sarray_int -// -// Implements the data operations for a one-dimensional static array of -// integrals. -// -//| `uvm_field_sarray_int(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is a one-dimensional static array of integrals, and ~FLAG~ -// is a bitwise OR of one or more flag settings as described in -// above. - -`define uvm_field_sarray_int(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG,FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - if ((__local_comparer__.physical&&((FLAG)&UVM_PHYSICAL))|| \ - (__local_comparer__.abstract&&((FLAG)&UVM_ABSTRACT))|| \ - (!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT))) \ - `uvm_compare_sarray_int(ARG, local_rhs__.ARG, `m_uvm_field_radix(FLAG), __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - `uvm_pack_sarray(ARG, __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - `uvm_unpack_sarray(ARG, __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(RECORD,FLAG) \ - `uvm_record_qda_int(ARG, `m_uvm_field_radix(FLAG), __local_recorder__) \ - `m_uvm_field_op_end(RECORD) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_sarray_int(ARG, \ - `m_uvm_field_radix(FLAG),, \ - __local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_warning("UVM/FIELDS/SARRAY_SIZE", $sformatf("Static array '%s.%s' cannot be resized via configuration.", get_full_name(), `"ARG`") ) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index_str__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - int local_index__; \ - /* TODO: Non-decimal indexes */ \ - int local_code__ = $sscanf(local_index_str__, "%d", local_index__); \ - if (local_code__ > 0) begin \ - if ((local_index__ >= $size(ARG)) || (local_index__ < 0)) begin \ - `uvm_warning("UVM/FIELDS/SARRAY_IDX", $sformatf("Index '%d' is not valid for static array '%s.%s' of size '%0d'", \ - local_index__, \ - get_full_name(), \ - `"ARG`", \ - $size(ARG))) \ - end \ - else begin \ - `uvm_resource_builtin_int_read(local_success__, \ - local_rsrc__, \ - ARG[local_index__], \ - this) \ - end \ - end \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - - -// MACRO -- NODOCS -- `uvm_field_sarray_object -// -// Implements the data operations for a one-dimensional static array of -// -based objects. -// -//| `uvm_field_sarray_object(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is a one-dimensional static array of -based objects, -// and ~FLAG~ is a bitwise OR of one or more flag settings as described in -// above. - -`define uvm_field_sarray_object(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG, FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - foreach(ARG[i]) begin \ - `uvm_copy_object(ARG[i], local_rhs__.ARG[i], `m_uvm_field_recursion(FLAG), __local_copier__) \ - end \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - if ((__local_comparer__.physical&&((FLAG)&UVM_PHYSICAL))|| \ - (__local_comparer__.abstract&&((FLAG)&UVM_ABSTRACT))|| \ - (!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT))) \ - `uvm_compare_sarray_object(ARG, local_rhs__.ARG, `m_uvm_field_recursion(FLAG), __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - if (`m_uvm_field_recursion(FLAG) != UVM_REFERENCE) \ - foreach(ARG[i]) \ - `uvm_pack_object(ARG[i], __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - if (`m_uvm_field_recursion(FLAG) != UVM_REFERENCE) \ - foreach(ARG[i]) \ - `uvm_unpack_object(ARG[i], __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(RECORD,FLAG) \ - `uvm_record_qda_object(ARG, __local_recorder__) \ - `m_uvm_field_op_end(RECORD) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_sarray_object(ARG, `m_uvm_field_recursion(FLAG), __local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_warning("UVM/FIELDS/SARRAY_SIZE", $sformatf("Static array '%s.%s' cannot be resized via configuration.", get_full_name(), `"ARG`") ) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index_str__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - int local_index__; \ - /* TODO: Non-decimal indexes */ \ - int local_code__ = $sscanf(local_index_str__, "%d", local_index__); \ - if (local_code__ > 0) begin \ - if ((local_index__ >= $size(ARG)) || (local_index__ < 0)) begin \ - `uvm_warning("UVM/FIELDS/SARRAY_IDX", $sformatf("Index '%d' is not valid for static array '%s.%s' of size '%0d'", \ - local_index__, \ - get_full_name(), \ - `"ARG`", \ - $size(ARG))) \ - end \ - else begin \ - `uvm_resource_read(local_success__, \ - local_rsrc__, \ - uvm_object, \ - local_obj__, \ - this) \ - if (local_success__) begin \ - if (local_obj__ == null) begin \ - ARG[local_index__] = null; \ - end else if (!$cast(ARG[local_index__], local_obj__)) begin \ - `uvm_warning("UVM/FIELDS/OBJ_TYPE", $sformatf("Can't set field '%s[%d]' on '%s' with '%s' type", \ - `"ARG`", \ - local_index__, \ - this.get_full_name(), \ - local_obj__.get_type_name())) \ - end \ - end \ - end \ - end \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - - -// MACRO -- NODOCS -- `uvm_field_sarray_string -// -// Implements the data operations for a one-dimensional static array of -// strings. -// -//| `uvm_field_sarray_string(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is a one-dimensional static array of strings, and ~FLAG~ is a bitwise -// OR of one or more flag settings as described in above. - -`define uvm_field_sarray_string(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG,FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - if ((__local_comparer__.physical&&((FLAG)&UVM_PHYSICAL))|| \ - (__local_comparer__.abstract&&((FLAG)&UVM_ABSTRACT))|| \ - (!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT))) \ - `uvm_compare_sarray_string(ARG, local_rhs__.ARG, __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - foreach(ARG[i]) \ - `uvm_pack_string(ARG[i], __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - foreach(ARG[i]) \ - `uvm_unpack_string(ARG[i], __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(RECORD,FLAG) \ - `uvm_record_qda_string(ARG, __local_recorder__) \ - `m_uvm_field_op_end(RECORD) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_sarray_string(ARG,__local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_warning("UVM/FIELDS/SARRAY_SIZE", $sformatf("Static array '%s.%s' cannot be resized via configuration.", get_full_name(), `"ARG`") ) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index_str__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - int local_index__; \ - /* TODO: Non-decimal indexes */ \ - int local_code__ = $sscanf(local_index_str__, "%d", local_index__); \ - if (local_code__ > 0) begin \ - if ((local_index__ >= $size(ARG)) || (local_index__ < 0)) begin \ - `uvm_warning("UVM/FIELDS/SARRAY_IDX", $sformatf("Index '%d' is not valid for static array '%s.%s' of size '%0d'", \ - local_index__, \ - get_full_name(), \ - `"ARG`", \ - $size(ARG))) \ - end \ - else begin \ - `uvm_resource_read(local_success__, \ - local_rsrc__, \ - string, \ - ARG[local_index__], \ - this) \ - end \ - end \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - - -// MACRO -- NODOCS -- `uvm_field_sarray_enum -// -// Implements the data operations for a one-dimensional static array of -// enums. -// -//| `uvm_field_sarray_enum(T,ARG,FLAG=UVM_DEFAULT) -// -// ~T~ is a one-dimensional dynamic array of enums _type_, ~ARG~ is an -// instance of that type, and ~FLAG~ is a bitwise OR of one or more flag -// settings as described in above. - -`define uvm_field_sarray_enum(T,ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG,FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - if ((__local_comparer__.physical&&((FLAG)&UVM_PHYSICAL))|| \ - (__local_comparer__.abstract&&((FLAG)&UVM_ABSTRACT))|| \ - (!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT))) \ - `uvm_compare_sarray_enum(ARG, local_rhs__.ARG, T, __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - foreach (ARG[i]) \ - `uvm_pack_enumN(ARG[i], $bits(T), __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - foreach (ARG[i]) \ - `uvm_unpack_enumN(ARG[i], $bits(T), T, __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(RECORD,FLAG) \ - `uvm_record_qda_enum(ARG, T, __local_recorder__) \ - `m_uvm_field_op_end(RECORD) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_sarray_enum(T, ARG ,__local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_warning("UVM/FIELDS/SARRAY_SIZE", $sformatf("Static array '%s.%s' cannot be resized via configuration.", get_full_name(), `"ARG`") ) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index_str__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - int local_index__; \ - /* TODO: Non-decimal indexes */ \ - int local_code__ = $sscanf(local_index_str__, "%d", local_index__); \ - if (local_code__ > 0) begin \ - if ((local_index__ >= $size(ARG)) || (local_index__ < 0)) begin \ - `uvm_warning("UVM/FIELDS/SARRAY_IDX", $sformatf("Index '%d' is not valid for static array '%s.%s' of size '%0d'", \ - local_index__, \ - get_full_name(), \ - `"ARG`", \ - $size(ARG))) \ - end \ - else begin \ - `uvm_resource_enum_read(local_success__, \ - local_rsrc__, \ - T, \ - ARG[local_index__], \ - this) \ - end \ - end \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - - -//----------------------------------------------------------------------------- -// Group -- NODOCS -- `uvm_field_array_* macros -// -// Macros that implement data operations for one-dimensional dynamic array -// properties. -// -// Implementation note: -// lines flagged with empty multi-line comments, /**/, are not needed or need -// to be different for fixed arrays, which cannot be resized. Fixed arrays -// do not need to pack/unpack their size either, because their size is known; -// wouldn't hurt though if it allowed code consolidation. Unpacking would -// necessarily be different. */ -// -//----------------------------------------------------------------------------- - - -// m_uvm_QUEUE_resize -// ------------------ - -`define m_uvm_queue_resize(ARG, SZ) \ - if (ARG.size() > SZ) \ - ARG = ARG[0:SZ-1]; \ - else \ - while (ARG.size() < SZ) ARG.push_back(ARG[SZ]); - -// m_uvm_da_resize -// ------------------ - -`define m_uvm_da_resize(ARG, SZ) \ - if (ARG.size() != SZ) ARG = new[SZ](ARG); - - -// m_uvm_field_qda_int -// ------------------- - -`define m_uvm_field_qda_int(TYPE,ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG,FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - if ((__local_comparer__.physical&&((FLAG)&UVM_PHYSICAL))|| \ - (__local_comparer__.abstract&&((FLAG)&UVM_ABSTRACT))|| \ - (!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT))) \ - `uvm_compare_qda_int(ARG, local_rhs__.ARG, `m_uvm_field_radix(FLAG), __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - `uvm_pack_``TYPE``(ARG, __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - `uvm_unpack_``TYPE``(ARG, __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(RECORD,FLAG) \ - `uvm_record_qda_int(ARG, `m_uvm_field_radix(FLAG), __local_recorder__) \ - `m_uvm_field_op_end(RECORD) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_qda_int(TYPE, ARG, `m_uvm_field_radix(FLAG),,__local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_resource_builtin_int_read(local_success__, \ - local_rsrc__, \ - local_size__, \ - this) \ - if (local_success__) \ - `m_uvm_``TYPE``_resize(ARG, local_size__) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index_str__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - int local_index__; \ - /* TODO: Non-decimal indexes */ \ - int local_code__ = $sscanf(local_index_str__, "%d", local_index__); \ - if (local_code__ > 0) begin \ - if (local_index__ < 0) begin \ - `uvm_warning("UVM/FIELDS/QDA_IDX", $sformatf("Index '%0d' is not valid for field '%s.%s' of size '%0d'", \ - local_index__, \ - get_full_name(), \ - `"ARG`", \ - ARG.size() ) ) \ - end \ - else begin \ - bit tmp_stream__[]; \ - `uvm_resource_builtin_int_read(local_success__, \ - local_rsrc__, \ - { << bit { tmp_stream__ }}, \ - this) \ - if (local_success__) begin \ - if (local_index__ >= ARG.size()) \ - `m_uvm_``TYPE``_resize(ARG, local_index__ + 1) \ - tmp_stream__ = new[$bits(ARG[local_index__])] (tmp_stream__); \ - ARG[local_index__] = { << bit { tmp_stream__ }}; \ - end \ - end \ - end \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - -// MACRO -- NODOCS -- `uvm_field_array_int -// -// Implements the data operations for a one-dimensional dynamic array of -// integrals. -// -//| `uvm_field_array_int(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is a one-dimensional dynamic array of integrals, -// and ~FLAG~ is a bitwise OR of one or more flag settings as described in -// above. - -`define uvm_field_array_int(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_qda_int(da,ARG,FLAG) - -`define m_uvm_field_qda_object(TYPE,ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG,FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - if ((`m_uvm_field_recursion(FLAG) == UVM_REFERENCE) || !local_rhs__.ARG.size()) \ - ARG = local_rhs__.ARG; \ - else begin \ - `m_uvm_``TYPE``_resize(ARG, local_rhs__.ARG.size()) \ - foreach (ARG[i]) \ - `uvm_copy_object(ARG[i], local_rhs__.ARG[i], `m_uvm_field_recursion(FLAG), __local_copier__) \ - end \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - if ((__local_comparer__.physical&&((FLAG)&UVM_PHYSICAL))|| \ - (__local_comparer__.abstract&&((FLAG)&UVM_ABSTRACT))|| \ - (!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT))) \ - `uvm_compare_qda_object(ARG, local_rhs__.ARG, `m_uvm_field_recursion(FLAG), __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - __local_packer__.pack_field_int(ARG.size(), 32); \ - foreach (ARG[i]) \ - `uvm_pack_object(ARG[i], __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - local_size__ = __local_packer__.unpack_field_int(32); \ - `m_uvm_``TYPE``_resize(ARG, local_size__); \ - foreach (ARG[i]) \ - `uvm_unpack_object(ARG[i], __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(RECORD,FLAG) \ - `uvm_record_qda_object(ARG, __local_recorder__) \ - `m_uvm_field_op_end(RECORD) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_qda_object(TYPE, ARG, `m_uvm_field_recursion(FLAG),__local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_resource_builtin_int_read(local_success__, \ - local_rsrc__, \ - local_size__, \ - this) \ - if (local_success__) \ - `m_uvm_``TYPE``_resize(ARG, local_size__) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index_str__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - int local_index__; \ - /* TODO: Non-decimal indexes */ \ - int local_code__ = $sscanf(local_index_str__, "%d", local_index__); \ - if (local_code__ > 0) begin \ - if (local_index__ < 0) begin \ - `uvm_warning("UVM/FIELDS/QDA_IDX", $sformatf("Index '%0d' is not valid for field '%s.%s' of size '%0d'", \ - local_index__, \ - get_full_name(), \ - `"ARG`", \ - ARG.size() ) ) \ - end \ - else begin \ - `uvm_resource_read(local_success__, \ - local_rsrc__, \ - uvm_object, \ - local_obj__, \ - this) \ - if (local_success__) begin \ - if (local_index__ >= ARG.size()) \ - `m_uvm_``TYPE``_resize(ARG, local_index__ + 1) \ - if (local_obj__ == null) begin \ - ARG[local_index__] = null; \ - end else if (!$cast(ARG[local_index__], local_obj__)) begin \ - `uvm_error("UVM/FIELDS/QDA_OBJ_TYPE", \ - $sformatf("Can't set field '%s[%0d]' on '%s' with '%s' type", \ - `"ARG`", \ - local_index__, \ - this.get_full_name(), \ - local_obj__.get_type_name())) \ - end \ - end \ - end \ - end \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - -// MACRO -- NODOCS -- `uvm_field_array_object -// -// Implements the data operations for a one-dimensional dynamic array -// of -based objects. -// -//| `uvm_field_array_object(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is a one-dimensional dynamic array of -based objects, -// and ~FLAG~ is a bitwise OR of one or more flag settings as described in -// above. - -`define uvm_field_array_object(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_qda_object(da,ARG,FLAG) - - - -// MACRO -- NODOCS -- `uvm_field_array_string -// -// Implements the data operations for a one-dimensional dynamic array -// of strings. -// -//| `uvm_field_array_string(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is a one-dimensional dynamic array of strings, and ~FLAG~ is a bitwise -// OR of one or more flag settings as described in above. - -`define uvm_field_array_string(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_qda_string(da,ARG,FLAG) - -`define m_uvm_field_qda_string(TYPE,ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG,FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - if ((__local_comparer__.physical&&((FLAG)&UVM_PHYSICAL))|| \ - (__local_comparer__.abstract&&((FLAG)&UVM_ABSTRACT))|| \ - (!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT))) \ - `uvm_compare_qda_string(ARG, local_rhs__.ARG, __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - __local_packer__.pack_field_int(ARG.size(), 32); \ - foreach (ARG[i]) \ - `uvm_pack_string(ARG[i], __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - local_size__ = __local_packer__.unpack_field_int(32); \ - `m_uvm_``TYPE``_resize(ARG, local_size__) \ - foreach (ARG[i]) \ - `uvm_unpack_string(ARG[i], __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(RECORD,FLAG) \ - `uvm_record_qda_string(ARG, __local_recorder__) \ - `m_uvm_field_op_end(RECORD) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_qda_string(TYPE, ARG,__local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_resource_builtin_int_read(local_success__, \ - local_rsrc__, \ - local_size__, \ - this) \ - if (local_success__) \ - `m_uvm_``TYPE``_resize(ARG, local_size__) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index_str__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - int local_index__; \ - /* TODO: Non-decimal indexes */ \ - int local_code__ = $sscanf(local_index_str__, "%d", local_index__); \ - if (local_code__ > 0) begin \ - if (local_index__ < 0) begin \ - `uvm_warning("UVM/FIELDS/QDA_IDX", $sformatf("Index '%0d' is not valid for field '%s.%s' of size '%0d'", \ - local_index__, \ - get_full_name(), \ - `"ARG`", \ - ARG.size() ) ) \ - end \ - else begin \ - string tmp_string__; \ - `uvm_resource_read(local_success__, \ - local_rsrc__, \ - string, \ - tmp_string__, \ - this) \ - if (local_success__) begin \ - if (local_index__ >= ARG.size()) \ - `m_uvm_``TYPE``_resize(ARG, local_index__ + 1) \ - ARG[local_index__] = tmp_string__; \ - end \ - end \ - end \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - -// MACRO -- NODOCS -- `uvm_field_array_enum -// -// Implements the data operations for a one-dimensional dynamic array of -// enums. -// -//| `uvm_field_array_enum(T,ARG,FLAG=UVM_DEFAULT) -// -// ~T~ is a one-dimensional dynamic array of enums _type_, -// ~ARG~ is an instance of that type, and ~FLAG~ is a bitwise OR of -// one or more flag settings as described in above. - -`define uvm_field_array_enum(T,ARG,FLAG=UVM_DEFAULT) \ - `m_field_qda_enum(da,T,ARG,FLAG) - -`define m_field_qda_enum(TYPE,T,ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG,FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - if ((__local_comparer__.physical&&((FLAG)&UVM_PHYSICAL))|| \ - (__local_comparer__.abstract&&((FLAG)&UVM_ABSTRACT))|| \ - (!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT))) \ - `uvm_compare_qda_enum(ARG, local_rhs__.ARG, T, __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - __local_packer__.pack_field_int(ARG.size(), 32); \ - foreach (ARG[i]) \ - `uvm_pack_enumN(ARG[i], $bits(T), __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - local_size__ = __local_packer__.unpack_field_int(32); \ - `m_uvm_``TYPE``_resize(ARG, local_size__) \ - foreach (ARG[i]) \ - `uvm_unpack_enumN(ARG[i], $bits(T), T, __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(RECORD,FLAG) \ - `uvm_record_qda_enum(ARG, T, __local_recorder__) \ - `m_uvm_field_op_end(RECORD) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_qda_enum(TYPE, T, ARG,__local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_resource_builtin_int_read(local_success__, \ - local_rsrc__, \ - local_size__, \ - this) \ - if (local_success__) \ - `m_uvm_``TYPE``_resize(ARG, local_size__) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index_str__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - int local_index__; \ - /* TODO: Non-decimal indexes */ \ - int local_code__ = $sscanf(local_index_str__, "%d", local_index__); \ - if (local_code__ > 0) begin \ - if (local_index__ < 0) begin \ - `uvm_warning("UVM/FIELDS/QDA_IDX", $sformatf("Index '%0d' is not valid for field '%s.%s' of size '%0d'", \ - local_index__, \ - get_full_name(), \ - `"ARG`", \ - ARG.size() ) ) \ - end \ - else begin \ - T tmp_enum__; \ - `uvm_resource_enum_read(local_success__, \ - local_rsrc__, \ - T, \ - tmp_enum__, \ - this) \ - if (local_success__) begin \ - if (local_index__ >= ARG.size()) \ - `m_uvm_``TYPE``_resize(ARG, local_index__ + 1) \ - ARG[local_index__] = tmp_enum__; \ - end \ - end \ - end \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - -//----------------------------------------------------------------------------- -// Group -- NODOCS -- `uvm_field_queue_* macros -// -// Macros that implement data operations for dynamic queues. -// -//----------------------------------------------------------------------------- - -// MACRO -- NODOCS -- `uvm_field_queue_int -// -// Implements the data operations for a queue of integrals. -// -//| `uvm_field_queue_int(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is a one-dimensional queue of integrals, -// and ~FLAG~ is a bitwise OR of one or more flag settings as described in -// above. - -`define uvm_field_queue_int(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_qda_int(queue,ARG,FLAG) - -// MACRO -- NODOCS -- `uvm_field_queue_object -// -// Implements the data operations for a queue of -based objects. -// -//| `uvm_field_queue_object(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is a one-dimensional queue of -based objects, -// and ~FLAG~ is a bitwise OR of one or more flag settings as described in -// above. - -`define uvm_field_queue_object(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_qda_object(queue,ARG,FLAG) - - -// MACRO -- NODOCS -- `uvm_field_queue_string -// -// Implements the data operations for a queue of strings. -// -//| `uvm_field_queue_string(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is a one-dimensional queue of strings, and ~FLAG~ is a bitwise -// OR of one or more flag settings as described in above. - -`define uvm_field_queue_string(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_qda_string(queue,ARG,FLAG) - - -// MACRO -- NODOCS -- `uvm_field_queue_enum -// -// Implements the data operations for a one-dimensional queue of enums. -// -//| `uvm_field_queue_enum(T,ARG,FLAG=UVM_DEFAULT) -// -// ~T~ is a queue of enums _type_, ~ARG~ is an instance of that type, -// and ~FLAG~ is a bitwise OR of one or more flag settings as described -// in above. - -`define uvm_field_queue_enum(T,ARG,FLAG=UVM_DEFAULT) \ - `m_field_qda_enum(queue,T,ARG,FLAG) - - -//----------------------------------------------------------------------------- -// Group -- NODOCS -- `uvm_field_aa_*_string macros -// -// Macros that implement data operations for associative arrays indexed -// by ~string~. -// -//----------------------------------------------------------------------------- - -// MACRO -- NODOCS -- `uvm_field_aa_int_string -// -// Implements the data operations for an associative array of integrals indexed -// by ~string~. -// -//| `uvm_field_aa_int_string(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is the name of a property that is an associative array of integrals -// with string key, and ~FLAG~ is a bitwise OR of one or more flag settings as -// described in above. - -`define uvm_field_aa_int_string(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG, FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - `uvm_compare_aa_int_string(ARG, local_rhs__.ARG, `m_uvm_field_radix(FLAG), __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - `uvm_pack_aa_int_string(ARG, __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - `uvm_unpack_aa_int_string(ARG, __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_aa_int_string(ARG, `m_uvm_field_radix(FLAG), int, __local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_warning("UVM/FIELDS/AA_SIZE", $sformatf("Associative array '%s.%s' cannot be resized via configuration.", get_full_name(), `"ARG`") ) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - `uvm_resource_builtin_int_read(local_success__, \ - local_rsrc__, \ - ARG[local_index__], \ - this) \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - - -// MACRO -- NODOCS -- `uvm_field_aa_object_string -// -// Implements the data operations for an associative array of -based -// objects indexed by ~string~. -// -//| `uvm_field_aa_object_string(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is the name of a property that is an associative array of objects -// with string key, and ~FLAG~ is a bitwise OR of one or more flag settings as -// described in above. - -`define uvm_field_aa_object_string(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG, FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - `uvm_copy_aa_object(ARG, local_rhs__.ARG, `m_uvm_field_recursion(FLAG), __local_copier__) \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - `uvm_compare_aa_object_string(ARG, local_rhs__.ARG, `m_uvm_field_recursion(FLAG), __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - if (`m_uvm_field_recursion(FLAG) != UVM_REFERENCE) \ - `uvm_pack_aa_object_string(ARG, __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - if (`m_uvm_field_recursion(FLAG) != UVM_REFERENCE) \ - `uvm_unpack_aa_object_string(ARG, __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_aa_object_string(ARG, `m_uvm_field_recursion(FLAG),__local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_warning("UVM/FIELDS/AA_SIZE", $sformatf("Associative array '%s.%s' cannot be resized via configuration.", get_full_name(), `"ARG`") ) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - `uvm_resource_read(local_success__, \ - local_rsrc__, \ - uvm_object, \ - local_obj__, \ - this) \ - if (local_success__) begin \ - if (local_obj__ == null) begin \ - ARG[local_index__] = null; \ - end else if (!$cast(ARG[local_index__], local_obj__)) begin \ - `uvm_warning("UVM/FIELDS/OBJ_TYPE", $sformatf("Can't set field '%s[%s]' on '%s' with '%s' type", \ - `"ARG`", \ - local_index__, \ - this.get_full_name(), \ - local_obj__.get_type_name())) \ - end \ - end \ - /* TODO if(local_success__ && printing matches) */ \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - - -// MACRO -- NODOCS -- `uvm_field_aa_string_string -// -// Implements the data operations for an associative array of strings indexed -// by ~string~. -// -//| `uvm_field_aa_string_string(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is the name of a property that is an associative array of strings -// with string key, and ~FLAG~ is a bitwise OR of one or more flag settings as -// described in above. - -`define uvm_field_aa_string_string(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG, FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - `uvm_compare_aa_string_string(ARG, local_rhs__.ARG, __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - `uvm_pack_aa_string_string(ARG, __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - `uvm_unpack_aa_string_string(ARG, __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_aa_string_string(ARG,__local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_warning("UVM/FIELDS/AA_SIZE", $sformatf("Associative array '%s.%s' cannot be resized via configuration.", get_full_name(), `"ARG`") ) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - `uvm_resource_read(local_success__, \ - local_rsrc__, \ - string, \ - ARG[local_index__], \ - this) \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - - -//----------------------------------------------------------------------------- -// Group -- NODOCS -- `uvm_field_aa_*_int macros -// -// Macros that implement data operations for associative arrays indexed by an -// integral type. -// -//----------------------------------------------------------------------------- - -// MACRO -- NODOCS -- `uvm_field_aa_object_int -// -// Implements the data operations for an associative array of -based -// objects indexed by the ~int~ data type. -// -//| `uvm_field_aa_object_int(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is the name of a property that is an associative array of objects -// with ~int~ key, and ~FLAG~ is a bitwise OR of one or more flag settings as -// described in above. - -`define uvm_field_aa_object_int(ARG,FLAG=UVM_DEFAULT) \ - `uvm_field_aa_object_key(int, ARG, FLAG) - -// Not LRM, but supports packing + configuration -`define uvm_field_aa_object_key(KEY, ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG, FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - `uvm_copy_aa_object(ARG, local_rhs__.ARG, `m_uvm_field_recursion(FLAG), __local_copier__) \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - `uvm_compare_aa_object_int(ARG, local_rhs__.ARG, `m_uvm_field_recursion(FLAG), __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - if (`m_uvm_field_recursion(FLAG) != UVM_REFERENCE) \ - `uvm_pack_aa_object_intN(ARG, $bits(KEY), __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - if (`m_uvm_field_recursion(FLAG) != UVM_REFERENCE) \ - `uvm_unpack_aa_object_intN(ARG, $bits(KEY), __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_aa_object_int(ARG, `m_uvm_field_recursion(FLAG), KEY,__local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_warning("UVM/FIELDS/SARRAY_SIZE", $sformatf("Static array '%s.%s' cannot be resized via configuration.", get_full_name(), `"ARG`") ) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index_str__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - KEY local_index__; \ - /* TODO: Non-decimal indexes */ \ - int local_code__ = $sscanf(local_index_str__, "%d", local_index__); \ - if (local_code__ > 0) begin \ - `uvm_resource_read(local_success__, \ - local_rsrc__, \ - uvm_object, \ - local_obj__, \ - this) \ - if (local_success__) begin \ - if (local_obj__ == null) begin \ - ARG[local_index__] = null; \ - end else if (!$cast(ARG[local_index__], local_obj__)) begin \ - `uvm_warning("UVM/FIELDS/OBJ_TYPE", $sformatf("Can't set field '%s[%d]' on '%s' with '%s' type", \ - `"ARG`", \ - local_index__, \ - this.get_full_name(), \ - local_obj__.get_type_name())) \ - end \ - end \ - end \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - -// Not LRM, oversight? -`define uvm_field_aa_string_int(ARG,FLAG=UVM_DEFAULT) \ - `uvm_field_aa_string_key(int, ARG, FLAG) - -// Not LRM, but supports packing + configuration -`define uvm_field_aa_string_key(KEY, ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG, FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - `uvm_compare_aa_string_int(ARG, local_rhs__.ARG, __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - `uvm_pack_aa_string_intN(ARG, $bits(KEY), __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - `uvm_unpack_aa_string_intN(ARG, $bits(KEY), __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - /* TODO */ \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_warning("UVM/FIELDS/SARRAY_SIZE", $sformatf("Static array '%s.%s' cannot be resized via configuration.", get_full_name(), `"ARG`") ) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index_str__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - KEY local_index__; \ - /* TODO: Non-decimal indexes */ \ - int local_code__ = $sscanf(local_index_str__, "%d", local_index__); \ - if (local_code__ > 0) begin \ - `uvm_resource_read(local_success__, \ - local_rsrc__, \ - string, \ - ARG[local_index__], \ - this) \ - end \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - -// MACRO -- NODOCS -- `uvm_field_aa_int_int -// -// Implements the data operations for an associative array of integral -// types indexed by the ~int~ data type. -// -//| `uvm_field_aa_int_int(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is the name of a property that is an associative array of integrals -// with ~int~ key, and ~FLAG~ is a bitwise OR of one or more flag settings as -// described in above. - -`define uvm_field_aa_int_int(ARG,FLAG=UVM_DEFAULT) \ - `uvm_field_aa_int_key(int, ARG, FLAG) \ - - -// MACRO -- NODOCS -- `uvm_field_aa_int_int_unsigned -// -// Implements the data operations for an associative array of integral -// types indexed by the ~int unsigned~ data type. -// -//| `uvm_field_aa_int_int_unsigned(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is the name of a property that is an associative array of integrals -// with ~int unsigned~ key, and ~FLAG~ is a bitwise OR of one or more flag -// settings as described in above. - -`define uvm_field_aa_int_int_unsigned(ARG,FLAG=UVM_DEFAULT) \ - `uvm_field_aa_int_key(int unsigned, ARG, FLAG) - - -// MACRO -- NODOCS -- `uvm_field_aa_int_integer -// -// Implements the data operations for an associative array of integral -// types indexed by the ~integer~ data type. -// -//| `uvm_field_aa_int_integer(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is the name of a property that is an associative array of integrals -// with ~integer~ key, and ~FLAG~ is a bitwise OR of one or more flag settings -// as described in above. - -`define uvm_field_aa_int_integer(ARG,FLAG=UVM_DEFAULT) \ - `uvm_field_aa_int_key(integer, ARG, FLAG) - - -// MACRO -- NODOCS -- `uvm_field_aa_int_integer_unsigned -// -// Implements the data operations for an associative array of integral -// types indexed by the ~integer unsigned~ data type. -// -//| `uvm_field_aa_int_integer_unsigned(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is the name of a property that is an associative array of integrals -// with ~integer unsigned~ key, and ~FLAG~ is a bitwise OR of one or more -// flag settings as described in above. - -`define uvm_field_aa_int_integer_unsigned(ARG,FLAG=UVM_DEFAULT) \ - `uvm_field_aa_int_key(integer unsigned, ARG, FLAG) - - -// MACRO -- NODOCS -- `uvm_field_aa_int_byte -// -// Implements the data operations for an associative array of integral -// types indexed by the ~byte~ data type. -// -//| `uvm_field_aa_int_byte(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is the name of a property that is an associative array of integrals -// with ~byte~ key, and ~FLAG~ is a bitwise OR of one or more flag settings as -// described in above. - -`define uvm_field_aa_int_byte(ARG,FLAG=UVM_DEFAULT) \ - `uvm_field_aa_int_key(byte, ARG, FLAG) - - -// MACRO -- NODOCS -- `uvm_field_aa_int_byte_unsigned -// -// Implements the data operations for an associative array of integral -// types indexed by the ~byte unsigned~ data type. -// -//| `uvm_field_aa_int_byte_unsigned(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is the name of a property that is an associative array of integrals -// with ~byte unsigned~ key, and ~FLAG~ is a bitwise OR of one or more flag -// settings as described in above. - -`define uvm_field_aa_int_byte_unsigned(ARG,FLAG=UVM_DEFAULT) \ - `uvm_field_aa_int_key(byte unsigned, ARG, FLAG) - - -// MACRO -- NODOCS -- `uvm_field_aa_int_shortint -// -// Implements the data operations for an associative array of integral -// types indexed by the ~shortint~ data type. -// -//| `uvm_field_aa_int_shortint(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is the name of a property that is an associative array of integrals -// with ~shortint~ key, and ~FLAG~ is a bitwise OR of one or more flag -// settings as described in above. - -`define uvm_field_aa_int_shortint(ARG,FLAG=UVM_DEFAULT) \ - `uvm_field_aa_int_key(shortint, ARG, FLAG) - - -// MACRO -- NODOCS -- `uvm_field_aa_int_shortint_unsigned -// -// Implements the data operations for an associative array of integral -// types indexed by the ~shortint unsigned~ data type. -// -//| `uvm_field_aa_int_shortint_unsigned(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is the name of a property that is an associative array of integrals -// with ~shortint unsigned~ key, and ~FLAG~ is a bitwise OR of one or more -// flag settings as described in above. - -`define uvm_field_aa_int_shortint_unsigned(ARG,FLAG=UVM_DEFAULT) \ - `uvm_field_aa_int_key(shortint unsigned, ARG, FLAG) - - -// MACRO -- NODOCS -- `uvm_field_aa_int_longint -// -// Implements the data operations for an associative array of integral -// types indexed by the ~longint~ data type. -// -//| `uvm_field_aa_int_longint(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is the name of a property that is an associative array of integrals -// with ~longint~ key, and ~FLAG~ is a bitwise OR of one or more flag settings -// as described in above. - -`define uvm_field_aa_int_longint(ARG,FLAG=UVM_DEFAULT) \ - `uvm_field_aa_int_key(longint, ARG, FLAG) - - -// MACRO -- NODOCS -- `uvm_field_aa_int_longint_unsigned -// -// Implements the data operations for an associative array of integral -// types indexed by the ~longint unsigned~ data type. -// -//| `uvm_field_aa_int_longint_unsigned(ARG,FLAG=UVM_DEFAULT) -// -// ~ARG~ is the name of a property that is an associative array of integrals -// with ~longint unsigned~ key, and ~FLAG~ is a bitwise OR of one or more -// flag settings as described in above. - -`define uvm_field_aa_int_longint_unsigned(ARG,FLAG=UVM_DEFAULT) \ - `uvm_field_aa_int_key(longint unsigned, ARG, FLAG) - - -// MACRO -- NODOCS -- `uvm_field_aa_int_key -// -// Implements the data operations for an associative array of integral -// types indexed by any integral key data type. -// -//| `uvm_field_aa_int_key(KEY,ARG,FLAG=UVM_DEFAULT) -// -// ~KEY~ is the data type of the integral key, ~ARG~ is the name of a property -// that is an associative array of integrals, and ~FLAG~ is a bitwise OR of one -// or more flag settings as described in above. - -`define uvm_field_aa_int_key(KEY, ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG, FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - `uvm_compare_aa_int_int(ARG, local_rhs__.ARG, `m_uvm_field_radix(FLAG), __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - `uvm_pack_aa_int_intN(ARG, $bits(KEY), __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - `uvm_unpack_aa_int_intN(ARG, $bits(KEY), __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_aa_int_int(ARG, `m_uvm_field_radix(FLAG), , KEY,__local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_warning("UVM/FIELDS/AA_SIZE", $sformatf("Associative array '%s.%s' cannot be resized via configuration.", get_full_name(), `"ARG`") ) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index_str__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - KEY local_index__; \ - /* TODO: Non-decimal indexes */ \ - int local_code__ = $sscanf(local_index_str__, "%d", local_index__); \ - if (local_code__ > 0) begin \ - `uvm_resource_int_read(local_success__, \ - local_rsrc__, \ - KEY, \ - ARG[local_index__], \ - this) \ - end \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - - -// MACRO -- NODOCS -- `uvm_field_aa_int_enumkey -// -// Implements the data operations for an associative array of integral -// types indexed by any enumeration key data type. -// -//| `uvm_field_aa_int_enumkey(KEY, ARG,FLAG=UVM_DEFAULT) -// -// ~KEY~ is the enumeration type of the key, ~ARG~ is the name of a property -// that is an associative array of integrals, and ~FLAG~ is a bitwise OR of one -// or more flag settings as described in above. - -`define uvm_field_aa_int_enumkey(KEY, ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG, FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - `uvm_compare_aa_int_int(ARG, local_rhs__.ARG, `m_uvm_field_radix(FLAG), __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - `uvm_pack_aa_int_enum(ARG, KEY, __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - `uvm_unpack_aa_int_enum(ARG, KEY, __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_aa_int_enum(KEY, ARG, `m_uvm_field_radix(FLAG),,__local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_warning("UVM/FIELDS/AA_SIZE", $sformatf("Associative array '%s.%s' cannot be resized via configuration.", get_full_name(), `"ARG`") ) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index_str__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - KEY local_index__; \ - bit[$bits(KEY)-1:0] local_bit_index__; \ - /* TODO: Non-decimal indexes */ \ - int local_code__ = $sscanf(local_index_str__, "%d", local_bit_index__); \ - if (local_code__ > 0) begin \ - local_index__ = KEY'(local_bit_index__); \ - `uvm_resource_int_read(local_success__, \ - local_rsrc__, \ - KEY, \ - ARG[local_index__], \ - this) \ - end \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - -//-- Field Macros for arrays of real (Non-LRM enhancement) -`define uvm_field_sarray_real(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG,FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - if ((__local_comparer__.physical&&((FLAG)&UVM_PHYSICAL))|| \ - (__local_comparer__.abstract&&((FLAG)&UVM_ABSTRACT))|| \ - (!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT))) \ - `uvm_compare_sarray_real(ARG, local_rhs__.ARG, __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - `uvm_pack_sarray_real(ARG, __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - `uvm_unpack_sarray_real(ARG, __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(RECORD,FLAG) \ - `uvm_record_qda_real(ARG, __local_recorder__) \ - `m_uvm_field_op_end(RECORD) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_sarray_real(ARG,__local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_warning("UVM/FIELDS/SARRAY_SIZE", $sformatf("Static array '%s.%s' cannot be resized via configuration.", get_full_name(), `"ARG`") ) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index_str__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - int local_index__; \ - /* TODO: Non-decimal indexes */ \ - int local_code__ = $sscanf(local_index_str__, "%d", local_index__); \ - if (local_code__ > 0) begin \ - if ((local_index__ >= $size(ARG)) || (local_index__ < 0)) begin \ - `uvm_warning("UVM/FIELDS/SARRAY_IDX", $sformatf("Index '%d' is not valid for static array '%s.%s' of size '%0d'", \ - local_index__, \ - get_full_name(), \ - `"ARG`", \ - $size(ARG))) \ - end \ - else begin \ - `uvm_resource_real_read(local_success__, \ - local_rsrc__, \ - ARG[local_index__], \ - this) \ - end \ - end \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - -// m_uvm_field_qda_real -// ------------------- - -`define m_uvm_field_qda_real(TYPE,ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_begin(ARG,FLAG) \ - `m_uvm_field_op_begin(COPY,FLAG) \ - ARG = local_rhs__.ARG; \ - `m_uvm_field_op_end(COPY) \ - `m_uvm_field_op_begin(COMPARE,FLAG) \ - if ((__local_comparer__.physical&&((FLAG)&UVM_PHYSICAL))|| \ - (__local_comparer__.abstract&&((FLAG)&UVM_ABSTRACT))|| \ - (!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT))) \ - `uvm_compare_qda_real(ARG, local_rhs__.ARG, __local_comparer__) \ - `m_uvm_field_op_end(COMPARE) \ - `m_uvm_field_op_begin(PACK,FLAG) \ - `uvm_pack_``TYPE``_real(ARG, __local_packer__) \ - `m_uvm_field_op_end(PACK) \ - `m_uvm_field_op_begin(UNPACK,FLAG) \ - `uvm_unpack_``TYPE``_real(ARG, __local_packer__) \ - `m_uvm_field_op_end(UNPACK) \ - `m_uvm_field_op_begin(RECORD,FLAG) \ - `uvm_record_qda_real(ARG, __local_recorder__) \ - `m_uvm_field_op_end(RECORD) \ - `m_uvm_field_op_begin(PRINT,FLAG) \ - `uvm_print_qda_real(TYPE, ARG,__local_printer__) \ - `m_uvm_field_op_end(PRINT) \ - `m_uvm_field_op_begin(SET,FLAG) \ - if(local_rsrc_name__ == `"ARG`") begin \ - `uvm_resource_real_read(local_success__, \ - local_rsrc__, \ - local_size__, \ - this) \ - if (local_success__) \ - `m_uvm_``TYPE``_resize(ARG, local_size__) \ - end \ - else begin \ - string local_name__ = {`"ARG`", "["}; \ - if (local_rsrc_name__.len() && \ - local_rsrc_name__[local_rsrc_name__.len()-1] == "]" && \ - local_rsrc_name__.substr(0, local_name__.len()-1) == local_name__) begin \ - string local_index_str__ = local_rsrc_name__.substr(local_name__.len(), \ - local_rsrc_name__.len()-2); \ - int local_index__; \ - /* TODO: Non-decimal indexes */ \ - int local_code__ = $sscanf(local_index_str__, "%d", local_index__); \ - if (local_code__ > 0) begin \ - if (local_index__ < 0) begin \ - `uvm_warning("UVM/FIELDS/QDA_IDX", $sformatf("Index '%0d' is not valid for field '%s.%s' of size '%0d'", \ - local_index__, \ - get_full_name(), \ - `"ARG`", \ - ARG.size() ) ) \ - end \ - else begin \ - real tmp_real__; \ - `uvm_resource_real_read(local_success__, \ - local_rsrc__, \ - tmp_real__, \ - this) \ - if (local_success__) begin \ - if (local_index__ >= ARG.size()) \ - `m_uvm_``TYPE``_resize(ARG, local_index__ + 1) \ - ARG[local_index__] = tmp_real__; \ - end \ - end \ - end \ - end \ - end \ - `m_uvm_field_op_end(SET) \ - `m_uvm_field_end(ARG) - -`define uvm_field_array_real(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_qda_real(da,ARG,FLAG) - -`define uvm_field_queue_real(ARG,FLAG=UVM_DEFAULT) \ - `m_uvm_field_qda_real(queue,ARG,FLAG) - -`endif // !`ifdef UVM_EMPTY_MACROS - -`endif // UVM_OBJECT_DEFINES_SVH diff --git a/src/macros/uvm_message_defines.svh b/src/macros/uvm_message_defines.svh index 9cfa506..4feb35d 100644 --- a/src/macros/uvm_message_defines.svh +++ b/src/macros/uvm_message_defines.svh @@ -34,8 +34,6 @@ //---------------------------------------------------------------------- -// Title: Message Macros - `ifndef UVM_MESSAGE_DEFINES_SVH `define UVM_MESSAGE_DEFINES_SVH diff --git a/src/reg/uvm_reg_item.svh b/src/reg/uvm_reg_item.svh index f8be0cf..9da5e55 100644 --- a/src/reg/uvm_reg_item.svh +++ b/src/reg/uvm_reg_item.svh @@ -44,10 +44,8 @@ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// CLASS: uvm_reg_item -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ +// CLASS -- NODOCS -- uvm_reg_item +// // Defines an abstract register transaction item. No bus-specific information // is present, although a handle to a is provided in case a user // wishes to implement a custom address translation algorithm. diff --git a/src/reg/uvm_reg_sequence.svh b/src/reg/uvm_reg_sequence.svh index 127a137..2dbafbd 100644 --- a/src/reg/uvm_reg_sequence.svh +++ b/src/reg/uvm_reg_sequence.svh @@ -36,7 +36,6 @@ // TITLE -- NODOCS -- Register Sequence Classes //------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ // // This section defines the base classes used for register stimulus generation. //------------------------------------------------------------------------------ @@ -44,11 +43,8 @@ //------------------------------------------------------------------------------ // -// CLASS: uvm_reg_sequence +// CLASS -- NODOCS -- uvm_reg_sequence // -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ // This class provides base functionality for both user-defined RegModel test // sequences and "register translation sequences". //