blob: af804760431dbe8b9d3318b7057c705442f495da [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright 2012 Aldec
// Copyright 2007-2012 Mentor Graphics Corporation
// Copyright 2018 Qualcomm, Inc.
// 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.
//------------------------------------------------------------------------------
`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
// <uvm_object> directly or indirectly, including <uvm_sequence_item> and
// <uvm_component>.
//
// 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
// @uvm-ieee 1800.2-2017 auto B.6.1
`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
// <do_execute_op>, 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
// <do_execute_op> method.
// @uvm-ieee 1800.2-2017 auto B.2.1.1
`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 \
local 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 \
// @uvm-ieee 1800.2-2017 auto B.2.1.1
`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
//
// <uvm_object>-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.
//
// @uvm-ieee 1800.2-2017 auto 14.4.2
// @uvm-ieee 1800.2-2017 auto B.2.1
// @uvm-ieee 1800.2-2017 auto B.2.1.2
`define uvm_object_utils(T) \
`m_uvm_object_registry_internal(T,T) \
`m_uvm_object_create_func(T) \
`uvm_type_name_decl(`"T`")
// @uvm-ieee 1800.2-2017 auto B.2.1.2
`define uvm_object_param_utils(T) \
`m_uvm_object_registry_param(T) \
`m_uvm_object_create_func(T)
// @uvm-ieee 1800.2-2017 auto B.2.1.2
`define uvm_object_utils_begin(T) \
`uvm_object_utils(T) \
`uvm_field_utils_begin(T)
// @uvm-ieee 1800.2-2017 auto B.2.1.2
`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)
// @uvm-ieee 1800.2-2017 auto B.2.1.2
`define uvm_object_abstract_param_utils_begin(T) \
`uvm_object_abstract_param_utils(T) \
`uvm_field_utils_begin(T)
// @uvm-ieee 1800.2-2017 auto B.2.1.2
`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.
//
// @uvm-ieee 1800.2-2017 auto B.2.1
// @uvm-ieee 1800.2-2017 auto B.2.1.3
`define uvm_component_utils(T) \
`m_uvm_component_registry_internal(T,T) \
`uvm_type_name_decl(`"T`") \
// @uvm-ieee 1800.2-2017 auto B.2.1.3
`define uvm_component_param_utils(T) \
`m_uvm_component_registry_param(T) \
// @uvm-ieee 1800.2-2017 auto B.2.1.3
`define uvm_component_utils_begin(T) \
`uvm_component_utils(T) \
`uvm_field_utils_begin(T)
// @uvm-ieee 1800.2-2017 auto B.2.1.3
`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)
// @uvm-ieee 1800.2-2017 auto B.2.1.3
`define uvm_component_abstract_param_utils_begin(T) \
`uvm_component_abstract_param_utils(T) \
`uvm_field_utils_begin(T)
// @uvm-ieee 1800.2-2017 auto B.2.1.3
`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.
// @uvm-ieee 1800.2-2017 auto B.2.1.4
`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.
// @uvm-ieee 1800.2-2017 auto B.2.1.5
`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
// <uvm_object::get_type_name> 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 <uvm_object>. 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 <uvm_component::apply_config_settings> 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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.1.1
`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 <uvm_object>-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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.1.2
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.1.3
`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
// <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.1.4
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.1.5
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.1.6
`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
// <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.2.1
`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) \
`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
// <uvm_object>-based objects.
//
//| `uvm_field_sarray_object(ARG,FLAG=UVM_DEFAULT)
//
// ~ARG~ is a one-dimensional static array of <uvm_object>-based objects,
// and ~FLAG~ is a bitwise OR of one or more flag settings as described in
// <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.2.2
`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) \
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.2.3
`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) \
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.2.4
`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) \
`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) \
`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
// <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.3.1
`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) \
`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 <uvm_object>-based objects.
//
//| `uvm_field_array_object(ARG,FLAG=UVM_DEFAULT)
//
// ~ARG~ is a one-dimensional dynamic array of <uvm_object>-based objects,
// and ~FLAG~ is a bitwise OR of one or more flag settings as described in
// <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.3.2
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.3.3
`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) \
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.3.4
`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) \
`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
// <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.4.1
`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 <uvm_object>-based objects.
//
//| `uvm_field_queue_object(ARG,FLAG=UVM_DEFAULT)
//
// ~ARG~ is a one-dimensional queue of <uvm_object>-based objects,
// and ~FLAG~ is a bitwise OR of one or more flag settings as described in
// <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.4.2
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.4.3
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.4.4
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.5.1
`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 <uvm_object>-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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.5.2
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.5.3
`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 <uvm_object>-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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.6.1
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.6.2
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.6.3
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.6.4
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.6.5
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.6.6
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.6.7
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.6.8
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.6.9
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.6.10
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.6.11
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.6.12
`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 <Field Macros> above.
// @uvm-ieee 1800.2-2017 auto B.2.2.6.13
`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) \
`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) \
`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