URL
https://opencores.org/ocsvn/uart2bus_testbench/uart2bus_testbench/trunk
Subversion Repositories uart2bus_testbench
[/] [uart2bus_testbench/] [trunk/] [tb/] [uvm_src/] [macros/] [uvm_object_defines.svh] - Rev 16
Compare with Previous | Blame | View Log
//------------------------------------------------------------------------------
// Copyright 2007-2011 Mentor Graphics Corporation
// Copyright 2007-2011 Cadence Design Systems, Inc.
// Copyright 2010-2011 Synopsys, Inc.
// Copyright 2013-2014 NVIDIA Corporation
// Copyright 2013 Cisco Systems, Inc.
// 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_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_utils_end
`define uvm_field_int(ARG,FLAG)
`define uvm_field_real(ARG,FLAG)
`define uvm_field_enum(T,ARG,FLAG)
`define uvm_field_object(ARG,FLAG)
`define uvm_field_event(ARG,FLAG)
`define uvm_field_string(ARG,FLAG)
`define uvm_field_array_enum(ARG,FLAG)
`define uvm_field_array_int(ARG,FLAG)
`define uvm_field_sarray_int(ARG,FLAG)
`define uvm_field_sarray_enum(ARG,FLAG)
`define uvm_field_array_object(ARG,FLAG)
`define uvm_field_sarray_object(ARG,FLAG)
`define uvm_field_array_string(ARG,FLAG)
`define uvm_field_sarray_string(ARG,FLAG)
`define uvm_field_queue_enum(ARG,FLAG)
`define uvm_field_queue_int(ARG,FLAG)
`define uvm_field_queue_object(ARG,FLAG)
`define uvm_field_queue_string(ARG,FLAG)
`define uvm_field_aa_int_string(ARG, FLAG)
`define uvm_field_aa_string_string(ARG, FLAG)
`define uvm_field_aa_object_string(ARG, FLAG)
`define uvm_field_aa_int_int(ARG, FLAG)
`define uvm_field_aa_int_int(ARG, FLAG)
`define uvm_field_aa_int_int_unsigned(ARG, FLAG)
`define uvm_field_aa_int_integer(ARG, FLAG)
`define uvm_field_aa_int_integer_unsigned(ARG, FLAG)
`define uvm_field_aa_int_byte(ARG, FLAG)
`define uvm_field_aa_int_byte_unsigned(ARG, FLAG)
`define uvm_field_aa_int_shortint(ARG, FLAG)
`define uvm_field_aa_int_shortint_unsigned(ARG, FLAG)
`define uvm_field_aa_int_longint(ARG, FLAG)
`define uvm_field_aa_int_longint_unsigned(ARG, FLAG)
`define uvm_field_aa_int_key(KEY, ARG, FLAG)
`define uvm_field_aa_string_int(ARG, FLAG)
`define uvm_field_aa_object_int(ARG, FLAG)
`else
//------------------------------------------------------------------------------
//
// Title: Utility and Field Macros for Components and Objects
//
// Group: 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_NO_REGISTERED_CONVERTER
//
// if this symbol is defined all auto registration of the proxies to print resources
// are disabled and you only get the typename printed (printing the objects contents
// either requires fill %p support or an appropriate proxy registered)
//
`ifdef UVM_NO_DEPRECATED
`define UVM_NO_REGISTERED_CONVERTER
`endif
// Definitions for the user to use inside their derived data class declarations.
// MACRO: `uvm_field_utils_begin
// MACRO: `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).
`define uvm_field_utils_begin(T) \
function void __m_uvm_field_automation (uvm_object tmp_data__, \
int what__, \
string str__); \
begin \
T local_data__; /* Used for copy and compare */ \
typedef T ___local_type____; \
string string_aa_key; /* Used for associative array lookups */ \
uvm_object __current_scopes[$]; \
if(what__ inside {UVM_SETINT,UVM_SETSTR,UVM_SETOBJ}) begin \
if(__m_uvm_status_container.m_do_cycle_check(this)) begin \
return; \
end \
else \
__current_scopes=__m_uvm_status_container.m_uvm_cycle_scopes; \
end \
super.__m_uvm_field_automation(tmp_data__, what__, str__); \
/* Type is verified by uvm_object::compare() */ \
if(tmp_data__ != null) \
/* Allow objects in same hierarchy to be copied/compared */ \
if(!$cast(local_data__, tmp_data__)) return;
`define uvm_field_utils_end \
if(what__ inside {UVM_SETINT,UVM_SETSTR,UVM_SETOBJ}) begin \
// remove all scopes recorded (through super and other objects visited before) \
void'(__current_scopes.pop_back()); \
__m_uvm_status_container.m_uvm_cycle_scopes = __current_scopes; \
end \
end \
endfunction \
// MACRO: `uvm_object_utils
// MACRO: `uvm_object_param_utils
// MACRO: `uvm_object_utils_begin
// MACRO: `uvm_object_param_utils_begin
// MACRO: `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.
//
`define uvm_object_utils(T) \
`uvm_object_utils_begin(T) \
`uvm_object_utils_end
`define uvm_object_param_utils(T) \
`uvm_object_param_utils_begin(T) \
`uvm_object_utils_end
`define uvm_object_utils_begin(T) \
`m_uvm_object_registry_internal(T,T) \
`m_uvm_object_create_func(T) \
`m_uvm_get_type_name_func(T) \
`uvm_field_utils_begin(T)
`define uvm_object_param_utils_begin(T) \
`m_uvm_object_registry_param(T) \
`m_uvm_object_create_func(T) \
`uvm_field_utils_begin(T)
`define uvm_object_utils_end \
end \
endfunction \
// MACRO: `uvm_component_utils
// MACRO: `uvm_component_param_utils
// MACRO: `uvm_component_utils_begin
// MACRO: `uvm_component_param_utils_begin
// MACRO: `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) \
`m_uvm_get_type_name_func(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_utils_end \
end \
endfunction
// MACRO: `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: `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
// 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; \
`ifdef UVM_OBJECT_DO_NOT_NEED_CONSTRUCTOR \
tmp = new(); \
if (name!="") \
tmp.set_name(name); \
`else \
if (name=="") tmp = new(); \
else tmp = new(name); \
`endif \
return tmp; \
endfunction
// m_uvm_get_type_name_func
// ----------------------
`define m_uvm_get_type_name_func(T) \
const static string type_name = `"T`"; \
virtual function string get_type_name (); \
return type_name; \
endfunction
// 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_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
//------------------------------------------------------------------------------
//
// Group: 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: `uvm_field_* macros
//
// Macros that implement data operations for scalar properties.
//
//-----------------------------------------------------------------------------
// MACRO: `uvm_field_int
//
// Implements the data operations for any packed integral property.
//
//| `uvm_field_int(ARG,FLAG)
//
// ~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.
`define uvm_field_int(ARG,FLAG) \
begin \
case (what__) \
UVM_CHECK_FIELDS: \
begin \
__m_uvm_status_container.do_field_check(`"ARG`", this); \
end \
UVM_COPY: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOPY)) ARG = local_data__.ARG; \
end \
UVM_COMPARE: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOMPARE)) begin \
if(ARG !== local_data__.ARG) begin \
void'(__m_uvm_status_container.comparer.compare_field(`"ARG`", ARG, local_data__.ARG, $bits(ARG))); \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
end \
end \
UVM_PACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
if($bits(ARG) <= 64) __m_uvm_status_container.packer.pack_field_int(ARG, $bits(ARG)); \
else __m_uvm_status_container.packer.pack_field(ARG, $bits(ARG)); \
end \
UVM_UNPACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
if($bits(ARG) <= 64) ARG = __m_uvm_status_container.packer.unpack_field_int($bits(ARG)); \
else ARG = __m_uvm_status_container.packer.unpack_field($bits(ARG)); \
end \
UVM_RECORD: \
`m_uvm_record_int(ARG, FLAG) \
UVM_PRINT: \
`m_uvm_print_int(ARG, FLAG) \
UVM_SETINT: \
begin \
bit matched; \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
matched = uvm_is_match(str__, __m_uvm_status_container.scope.get()); \
if(matched) begin \
if((FLAG)&UVM_READONLY) begin \
uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
else begin \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
ARG = uvm_object::__m_uvm_status_container.bitstream; \
uvm_object::__m_uvm_status_container.status = 1; \
end \
end \
__m_uvm_status_container.scope.unset_arg(`"ARG`"); \
end \
endcase \
end
// MACRO: `uvm_field_object
//
// Implements the data operations for a <uvm_object>-based property.
//
//| `uvm_field_object(ARG,FLAG)
//
// ~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.
`define uvm_field_object(ARG,FLAG) \
begin \
case (what__) \
UVM_CHECK_FIELDS: \
__m_uvm_status_container.do_field_check(`"ARG`", this); \
UVM_COPY: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOPY)) begin \
if((FLAG)&UVM_REFERENCE || local_data__.ARG == null) ARG = local_data__.ARG; \
else begin \
uvm_object l_obj; \
if(local_data__.ARG.get_name() == "") local_data__.ARG.set_name(`"ARG`"); \
l_obj = local_data__.ARG.clone(); \
if(l_obj == null) begin \
`uvm_fatal("FAILCLN", $sformatf("Failure to clone %s.ARG, thus the variable will remain null.", local_data__.get_name())); \
end \
else begin \
$cast(ARG, l_obj); \
ARG.set_name(local_data__.ARG.get_name()); \
end \
end \
end \
end \
UVM_COMPARE: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOMPARE)) begin \
void'(__m_uvm_status_container.comparer.compare_object(`"ARG`", ARG, local_data__.ARG)); \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
end \
UVM_PACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
if(((FLAG)&UVM_NOPACK) == 0 && ((FLAG)&UVM_REFERENCE) == 0) \
__m_uvm_status_container.packer.pack_object(ARG); \
end \
UVM_UNPACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
if(((FLAG)&UVM_NOPACK) == 0 && ((FLAG)&UVM_REFERENCE) == 0) \
__m_uvm_status_container.packer.unpack_object(ARG); \
end \
UVM_RECORD: \
`m_uvm_record_object(ARG,FLAG) \
UVM_PRINT: \
begin \
if(!((FLAG)&UVM_NOPRINT)) begin \
if(((FLAG)&UVM_REFERENCE) != 0) \
__m_uvm_status_container.printer.print_object_header(`"ARG`", ARG); \
else \
__m_uvm_status_container.printer.print_object(`"ARG`", ARG); \
end \
end \
UVM_SETINT: \
begin \
if((ARG != null) && (((FLAG)&UVM_READONLY)==0) && (((FLAG)&UVM_REFERENCE)==0)) begin \
__m_uvm_status_container.scope.down(`"ARG`"); \
ARG.__m_uvm_field_automation(null, UVM_SETINT, str__); \
__m_uvm_status_container.scope.up(); \
end \
end \
UVM_SETSTR: \
begin \
if((ARG != null) && (((FLAG)&UVM_READONLY)==0) && (((FLAG)&UVM_REFERENCE)==0)) begin \
__m_uvm_status_container.scope.down(`"ARG`"); \
ARG.__m_uvm_field_automation(null, UVM_SETSTR, str__); \
__m_uvm_status_container.scope.up(); \
end \
end \
UVM_SETOBJ: \
begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if((FLAG)&UVM_READONLY) begin \
uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
else begin \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_object()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
if($cast(ARG,uvm_object::__m_uvm_status_container.object)) \
uvm_object::__m_uvm_status_container.status = 1; \
end \
end \
else if(ARG!=null && ((FLAG)&UVM_READONLY) == 0) begin \
int cnt; \
//Only traverse if there is a possible match. \
for(cnt=0; cnt<str__.len(); ++cnt) begin \
if(str__[cnt] == "." || str__[cnt] == "*") break; \
end \
if(cnt!=str__.len()) begin \
__m_uvm_status_container.scope.down(`"ARG`"); \
ARG.__m_uvm_field_automation(null, UVM_SETOBJ, str__); \
__m_uvm_status_container.scope.up(); \
end \
end \
end \
endcase \
end
// MACRO: `uvm_field_string
//
// Implements the data operations for a string property.
//
//| `uvm_field_string(ARG,FLAG)
//
// ~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.
`define uvm_field_string(ARG,FLAG) \
begin \
case (what__) \
UVM_CHECK_FIELDS: \
__m_uvm_status_container.do_field_check(`"ARG`", this); \
UVM_COPY: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOPY)) ARG = local_data__.ARG; \
end \
UVM_COMPARE: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOMPARE)) begin \
if(ARG != local_data__.ARG) begin \
void'(__m_uvm_status_container.comparer.compare_string(`"ARG`", ARG, local_data__.ARG)); \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
end \
end \
UVM_PACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
__m_uvm_status_container.packer.pack_string(ARG); \
end \
UVM_UNPACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
ARG = __m_uvm_status_container.packer.unpack_string(); \
end \
UVM_RECORD: \
`m_uvm_record_string(ARG, ARG, FLAG) \
UVM_PRINT: \
if(!((FLAG)&UVM_NOPRINT)) begin \
__m_uvm_status_container.printer.print_string(`"ARG`", ARG); \
end \
UVM_SETSTR: \
begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if((FLAG)&UVM_READONLY) begin \
uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
else begin \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_str()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
ARG = uvm_object::__m_uvm_status_container.stringv; \
__m_uvm_status_container.status = 1; \
end \
end \
end \
endcase \
end
// MACRO: `uvm_field_enum
//
// Implements the data operations for an enumerated property.
//
//| `uvm_field_enum(T,ARG,FLAG)
//
// ~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.
`define uvm_field_enum(T,ARG,FLAG) \
begin \
case (what__) \
UVM_CHECK_FIELDS: \
__m_uvm_status_container.do_field_check(`"ARG`", this); \
UVM_COPY: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOPY)) ARG = local_data__.ARG; \
end \
UVM_COMPARE: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOMPARE)) begin \
if(ARG !== local_data__.ARG) begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
$swrite(__m_uvm_status_container.stringv, "lhs = %0s : rhs = %0s", \
ARG.name(), local_data__.ARG.name()); \
__m_uvm_status_container.comparer.print_msg(__m_uvm_status_container.stringv); \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
end \
end \
UVM_PACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
__m_uvm_status_container.packer.pack_field(ARG, $bits(ARG)); \
end \
UVM_UNPACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
ARG = T'(__m_uvm_status_container.packer.unpack_field_int($bits(ARG))); \
end \
UVM_RECORD: \
`m_uvm_record_string(ARG, ARG.name(), FLAG) \
UVM_PRINT: \
if(!((FLAG)&UVM_NOPRINT)) begin \
__m_uvm_status_container.printer.print_generic(`"ARG`", `"T`", $bits(ARG), ARG.name()); \
end \
UVM_SETINT: \
begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if((FLAG)&UVM_READONLY) begin \
uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
else begin \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
ARG = T'(uvm_object::__m_uvm_status_container.bitstream); \
__m_uvm_status_container.status = 1; \
end \
end \
end \
UVM_SETSTR: \
begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if((FLAG)&UVM_READONLY) begin \
uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
else begin \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_str()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
void'(uvm_enum_wrapper#(T)::from_name(uvm_object::__m_uvm_status_container.stringv, ARG)); \
__m_uvm_status_container.status = 1; \
end \
end \
end \
endcase \
end
// MACRO: `uvm_field_real
//
// Implements the data operations for any real property.
//
//| `uvm_field_real(ARG,FLAG)
//
// ~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.
`define uvm_field_real(ARG,FLAG) \
begin \
case (what__) \
UVM_CHECK_FIELDS: \
__m_uvm_status_container.do_field_check(`"ARG`", this); \
UVM_COPY: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOPY)) ARG = local_data__.ARG; \
end \
UVM_COMPARE: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOMPARE)) begin \
if(ARG != local_data__.ARG) begin \
void'(__m_uvm_status_container.comparer.compare_field_real(`"ARG`", ARG, local_data__.ARG)); \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
end \
end \
UVM_PACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
__m_uvm_status_container.packer.pack_field_int($realtobits(ARG), 64); \
end \
UVM_UNPACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
ARG = $bitstoreal(__m_uvm_status_container.packer.unpack_field_int(64)); \
end \
UVM_RECORD: \
if(!((FLAG)&UVM_NORECORD)) begin \
__m_uvm_status_container.recorder.record_field_real(`"ARG`", ARG); \
end \
UVM_PRINT: \
if(!((FLAG)&UVM_NOPRINT)) begin \
__m_uvm_status_container.printer.print_real(`"ARG`", ARG); \
end \
UVM_SETINT: \
begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if((FLAG)&UVM_READONLY) begin \
uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
else begin \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
ARG = $bitstoreal(uvm_object::__m_uvm_status_container.bitstream); \
__m_uvm_status_container.status = 1; \
end \
end \
end \
endcase \
end
// MACRO: `uvm_field_event
//
// Implements the data operations for an event property.
//
//| `uvm_field_event(ARG,FLAG)
//
// ~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.
`define uvm_field_event(ARG,FLAG) \
begin \
case (what__) \
UVM_COPY: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOPY)) ARG = local_data__.ARG; \
end \
UVM_COMPARE: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOMPARE)) begin \
if(ARG != local_data__.ARG) begin \
__m_uvm_status_container.scope.down(`"ARG`"); \
__m_uvm_status_container.comparer.print_msg(""); \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
end \
end \
UVM_PACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
// Events aren't packed or unpacked \
end \
UVM_UNPACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
end \
UVM_RECORD: \
begin \
// Events are not recorded \
end \
UVM_PRINT: \
if(!((FLAG)&UVM_NOPRINT)) begin \
__m_uvm_status_container.printer.print_generic(`"ARG`", "event", -1, ""); \
end \
UVM_SETINT: \
begin \
// Events are not configurable via set_config \
end \
endcase \
end
//-----------------------------------------------------------------------------
// Group: `uvm_field_sarray_* macros
//
// Macros that implement data operations for one-dimensional static array
// properties.
//-----------------------------------------------------------------------------
// MACRO: `uvm_field_sarray_int
//
// Implements the data operations for a one-dimensional static array of
// integrals.
//
//| `uvm_field_sarray_int(ARG,FLAG)
//
// ~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.
`define uvm_field_sarray_int(ARG,FLAG) \
begin \
case (what__) \
UVM_CHECK_FIELDS: \
__m_uvm_status_container.do_field_check(`"ARG`", this); \
UVM_COPY: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOPY)) ARG = local_data__.ARG; \
end \
UVM_COMPARE: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOMPARE)) begin \
if(ARG !== local_data__.ARG) begin \
if(__m_uvm_status_container.comparer.show_max == 1) begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
__m_uvm_status_container.comparer.print_msg(""); \
end \
else if(__m_uvm_status_container.comparer.show_max) begin \
foreach(ARG[i]) begin \
if(ARG[i] !== local_data__.ARG[i]) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`",i); \
void'(__m_uvm_status_container.comparer.compare_field("", ARG[i], local_data__.ARG[i], $bits(ARG[i]))); \
end \
end \
end \
else if ((__m_uvm_status_container.comparer.physical&&((FLAG)&UVM_PHYSICAL)) || \
(__m_uvm_status_container.comparer.abstract&&((FLAG)&UVM_ABSTRACT)) || \
(!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT)) ) \
__m_uvm_status_container.comparer.result++; \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
end \
end \
UVM_PACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
foreach(ARG[i]) \
if($bits(ARG[i]) <= 64) __m_uvm_status_container.packer.pack_field_int(ARG[i], $bits(ARG[i])); \
else __m_uvm_status_container.packer.pack_field(ARG[i], $bits(ARG[i])); \
end \
UVM_UNPACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
foreach(ARG[i]) \
if($bits(ARG[i]) <= 64) ARG[i] = __m_uvm_status_container.packer.unpack_field_int($bits(ARG[i])); \
else ARG[i] = __m_uvm_status_container.packer.unpack_field($bits(ARG[i])); \
end \
UVM_RECORD: \
`m_uvm_record_qda_int(ARG, FLAG, $size(ARG)) \
UVM_PRINT: \
if(!((FLAG)&UVM_NOPRINT)) begin \
if(((FLAG)&UVM_NOPRINT) == 0) begin \
`uvm_print_sarray_int3(ARG, uvm_radix_enum'((FLAG)&(UVM_RADIX)), \
__m_uvm_status_container.printer) \
end \
end \
UVM_SETINT: \
begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if((FLAG)&UVM_READONLY) begin \
uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
else begin \
uvm_report_warning("RDONLY", $sformatf("%s: static arrays cannot be resized via configuraton.", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
end \
else if(!((FLAG)&UVM_READONLY)) begin \
foreach(ARG[i]) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`",i); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
ARG[i] = uvm_object::__m_uvm_status_container.bitstream; \
__m_uvm_status_container.status = 1; \
end \
end \
end \
end \
endcase \
end
// MACRO: `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)
//
// ~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.
`define uvm_field_sarray_object(ARG,FLAG) \
begin \
case (what__) \
UVM_CHECK_FIELDS: \
__m_uvm_status_container.do_field_check(`"ARG`", this); \
UVM_COPY: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOPY)) begin \
if(((FLAG)&UVM_REFERENCE)) \
ARG = local_data__.ARG; \
else \
foreach(ARG[i]) begin \
if(ARG[i] != null && local_data__.ARG[i] != null) \
ARG[i].copy(local_data__.ARG[i]); \
else if(ARG[i] == null && local_data__.ARG[i] != null) \
$cast(ARG[i], local_data__.ARG[i].clone()); \
else \
ARG[i] = null; \
end \
end \
end \
UVM_COMPARE: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOMPARE)) begin \
if(((FLAG)&UVM_REFERENCE) && (__m_uvm_status_container.comparer.show_max <= 1) && (ARG !== local_data__.ARG) ) begin \
if(__m_uvm_status_container.comparer.show_max == 1) begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
__m_uvm_status_container.comparer.print_msg(""); \
end \
else if ((__m_uvm_status_container.comparer.physical&&((FLAG)&UVM_PHYSICAL)) || \
(__m_uvm_status_container.comparer.abstract&&((FLAG)&UVM_ABSTRACT)) || \
(!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT)) ) \
__m_uvm_status_container.comparer.result++; \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
else begin \
string s; \
foreach(ARG[i]) begin \
if(ARG[i] != null && local_data__.ARG[i] != null) begin \
$swrite(s,`"ARG[%0d]`",i); \
void'(__m_uvm_status_container.comparer.compare_object(s, ARG[i], local_data__.ARG[i])); \
end \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
end \
end \
end \
UVM_PACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
foreach(ARG[i]) \
__m_uvm_status_container.packer.pack_object(ARG[i]); \
end \
UVM_UNPACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
foreach(ARG[i]) \
__m_uvm_status_container.packer.unpack_object(ARG[i]); \
end \
UVM_RECORD: \
`m_uvm_record_qda_object(ARG,FLAG,$size(ARG)) \
UVM_PRINT: \
begin \
if(((FLAG)&UVM_NOPRINT) == 0) begin \
`uvm_print_sarray_object3(ARG, __m_uvm_status_container.printer, FLAG) \
end \
end \
UVM_SETINT: \
begin \
string s; \
if(!((FLAG)&UVM_READONLY)) begin \
foreach(ARG[i]) begin \
$swrite(s,`"ARG[%0d]`",i); \
__m_uvm_status_container.scope.set_arg(s); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_object()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
if($cast(ARG[i],uvm_object::__m_uvm_status_container.object)) \
uvm_object::__m_uvm_status_container.status = 1; \
end \
else if(ARG[i]!=null && !((FLAG)&UVM_REFERENCE)) begin \
int cnt; \
//Only traverse if there is a possible match. \
for(cnt=0; cnt<str__.len(); ++cnt) begin \
if(str__[cnt] == "." || str__[cnt] == "*") break; \
end \
if(cnt!=str__.len()) begin \
__m_uvm_status_container.scope.down(s); \
ARG[i].__m_uvm_field_automation(null, UVM_SETINT, str__); \
__m_uvm_status_container.scope.up(); \
end \
end \
end \
end \
end \
UVM_SETSTR: \
begin \
string s; \
if(!((FLAG)&UVM_READONLY)) begin \
foreach(ARG[i]) begin \
$swrite(s,`"ARG[%0d]`",i); \
__m_uvm_status_container.scope.set_arg(s); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_object()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
if($cast(ARG[i],uvm_object::__m_uvm_status_container.object)) \
uvm_object::__m_uvm_status_container.status = 1; \
end \
else if(ARG[i]!=null && !((FLAG)&UVM_REFERENCE)) begin \
int cnt; \
//Only traverse if there is a possible match. \
for(cnt=0; cnt<str__.len(); ++cnt) begin \
if(str__[cnt] == "." || str__[cnt] == "*") break; \
end \
if(cnt!=str__.len()) begin \
__m_uvm_status_container.scope.down(s); \
ARG[i].__m_uvm_field_automation(null, UVM_SETSTR, str__); \
__m_uvm_status_container.scope.up(); \
end \
end \
end \
end \
end \
UVM_SETOBJ: \
begin \
string s; \
if(!((FLAG)&UVM_READONLY)) begin \
foreach(ARG[i]) begin \
$swrite(s,`"ARG[%0d]`",i); \
__m_uvm_status_container.scope.set_arg(s); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_object()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
if($cast(ARG[i],uvm_object::__m_uvm_status_container.object)) \
uvm_object::__m_uvm_status_container.status = 1; \
end \
else if(ARG[i]!=null && !((FLAG)&UVM_REFERENCE)) begin \
int cnt; \
//Only traverse if there is a possible match. \
for(cnt=0; cnt<str__.len(); ++cnt) begin \
if(str__[cnt] == "." || str__[cnt] == "*") break; \
end \
if(cnt!=str__.len()) begin \
__m_uvm_status_container.scope.down(s); \
ARG[i].__m_uvm_field_automation(null, UVM_SETOBJ, str__); \
__m_uvm_status_container.scope.up(); \
end \
end \
end \
end \
end \
endcase \
end
// MACRO: `uvm_field_sarray_string
//
// Implements the data operations for a one-dimensional static array of
// strings.
//
//| `uvm_field_sarray_string(ARG,FLAG)
//
// ~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.
`define uvm_field_sarray_string(ARG,FLAG) \
begin \
case (what__) \
UVM_CHECK_FIELDS: \
__m_uvm_status_container.do_field_check(`"ARG`", this); \
UVM_COPY: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOPY)) ARG = local_data__.ARG; \
end \
UVM_COMPARE: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOMPARE)) begin \
if(ARG != local_data__.ARG) begin \
if(__m_uvm_status_container.comparer.show_max == 1) begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
__m_uvm_status_container.comparer.print_msg(""); \
end \
else if(__m_uvm_status_container.comparer.show_max) begin \
foreach(ARG[i]) begin \
if(ARG[i] != local_data__.ARG[i]) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`",i); \
void'(__m_uvm_status_container.comparer.compare_string("", ARG[i], local_data__.ARG[i])); \
end \
end \
end \
else if ((__m_uvm_status_container.comparer.physical&&((FLAG)&UVM_PHYSICAL)) || \
(__m_uvm_status_container.comparer.abstract&&((FLAG)&UVM_ABSTRACT)) || \
(!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT)) ) \
__m_uvm_status_container.comparer.result++; \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
end \
end \
UVM_PACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
foreach(ARG[i]) \
__m_uvm_status_container.packer.pack_string(ARG[i]); \
end \
UVM_UNPACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
foreach(ARG[i]) \
ARG[i] = __m_uvm_status_container.packer.unpack_string(); \
end \
UVM_RECORD: \
begin \
/* Issue with $size for sarray with strings */ \
int sz; foreach(ARG[i]) sz=i; \
`m_uvm_record_qda_string(ARG, FLAG, sz) \
end \
UVM_PRINT: \
begin \
if(((FLAG)&UVM_NOPRINT) == 0) begin \
`uvm_print_sarray_string2(ARG, __m_uvm_status_container.printer) \
end \
end \
UVM_SETSTR: \
begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if((FLAG)&UVM_READONLY) begin \
uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
else begin \
uvm_report_warning("RDONLY", {__m_uvm_status_container.get_full_scope_arg(), \
": static arrays cannot be resized via configuraton."}, UVM_NONE); \
end \
end \
else if(!((FLAG)&UVM_READONLY)) begin \
foreach(ARG[i]) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`",i); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
ARG[i] = uvm_object::__m_uvm_status_container.stringv; \
__m_uvm_status_container.status = 1; \
end \
end \
end \
end \
endcase \
end
// MACRO: `uvm_field_sarray_enum
//
// Implements the data operations for a one-dimensional static array of
// enums.
//
//| `uvm_field_sarray_enum(T,ARG,FLAG)
//
// ~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.
`define uvm_field_sarray_enum(T,ARG,FLAG) \
begin \
case (what__) \
UVM_CHECK_FIELDS: \
__m_uvm_status_container.do_field_check(`"ARG`", this); \
UVM_COPY: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOPY)) ARG = local_data__.ARG; \
end \
UVM_COMPARE: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOMPARE)) begin \
if(ARG !== local_data__.ARG) begin \
if(__m_uvm_status_container.comparer.show_max == 1) begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
__m_uvm_status_container.comparer.print_msg(""); \
end \
else if(__m_uvm_status_container.comparer.show_max) begin \
foreach(ARG[i]) begin \
if(ARG[i] !== local_data__.ARG[i]) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`",i); \
$swrite(__m_uvm_status_container.stringv, "lhs = %0s : rhs = %0s", \
ARG[i].name(), local_data__.ARG[i].name()); \
__m_uvm_status_container.comparer.print_msg(__m_uvm_status_container.stringv); \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
end \
end \
else if ((__m_uvm_status_container.comparer.physical&&((FLAG)&UVM_PHYSICAL)) || \
(__m_uvm_status_container.comparer.abstract&&((FLAG)&UVM_ABSTRACT)) || \
(!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT)) ) \
__m_uvm_status_container.comparer.result++; \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
end \
end \
UVM_PACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
foreach(ARG[i]) \
__m_uvm_status_container.packer.pack_field_int(int'(ARG[i]), $bits(ARG[i])); \
end \
UVM_UNPACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
foreach(ARG[i]) \
ARG[i] = T'(__m_uvm_status_container.packer.unpack_field_int($bits(ARG[i]))); \
end \
UVM_RECORD: \
`m_uvm_record_qda_enum(ARG, FLAG, $size(ARG)) \
UVM_PRINT: \
begin \
if(((FLAG)&UVM_NOPRINT) == 0) begin \
`uvm_print_qda_enum(ARG, __m_uvm_status_container.printer, array, T) \
end \
end \
UVM_SETINT: \
begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if((FLAG)&UVM_READONLY) begin \
uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
else begin \
uvm_report_warning("RDONLY", $sformatf("%s: static arrays cannot be resized via configuraton.", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
end \
else if(!((FLAG)&UVM_READONLY)) begin \
foreach(ARG[i]) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`",i); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
ARG[i] = T'(uvm_object::__m_uvm_status_container.bitstream); \
__m_uvm_status_container.status = 1; \
end \
end \
end \
end \
UVM_SETSTR: \
begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if((FLAG)&UVM_READONLY) begin \
uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
else begin \
uvm_report_warning("RDONLY", {__m_uvm_status_container.get_full_scope_arg(), \
": static arrays cannot be resized via configuraton."}, UVM_NONE); \
end \
end \
else if(!((FLAG)&UVM_READONLY)) begin \
foreach(ARG[i]) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`",i); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
T t__; \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
void'(uvm_enum_wrapper#(T)::from_name(uvm_object::__m_uvm_status_container.stringv, t__)); ARG[i]=t__;\
__m_uvm_status_container.status = 1; \
end \
end \
end \
end \
endcase \
end
//-----------------------------------------------------------------------------
// Group: `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,VAL) \
while(ARG.size()<sz) ARG.push_back(VAL); \
while(ARG.size()>sz) void'(ARG.pop_front()); \
// M_UVM_ARRAY_RESIZE
// ------------------
`define M_UVM_ARRAY_RESIZE(ARG,VAL) \
ARG = new[sz](ARG); \
// M_UVM_SARRAY_RESIZE
// -------------------
`define M_UVM_SARRAY_RESIZE(ARG,VAL) \
/* fixed arrays cannot be resized; do nothing */
// M_UVM_FIELD_QDA_INT
// -------------------
`define M_UVM_FIELD_QDA_INT(TYPE,ARG,FLAG) \
begin \
case (what__) \
UVM_CHECK_FIELDS: \
__m_uvm_status_container.do_field_check(`"ARG`", this); \
UVM_COPY: \
begin \
if (local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOPY)) ARG = local_data__.ARG; \
end \
UVM_COMPARE: \
begin \
if (local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOMPARE)) begin \
if(ARG !== local_data__.ARG) begin \
if(__m_uvm_status_container.comparer.show_max == 1) begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
__m_uvm_status_container.comparer.print_msg(""); \
end \
else if(__m_uvm_status_container.comparer.show_max) begin \
/**/ if(ARG.size() != local_data__.ARG.size()) begin \
/**/ void'(__m_uvm_status_container.comparer.compare_field(`"ARG``.size`", ARG.size(), local_data__.ARG.size(), 32)); \
/**/ end \
else begin \
foreach(ARG[i]) begin \
if(ARG[i] !== local_data__.ARG[i]) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`",i); \
void'(__m_uvm_status_container.comparer.compare_field("", ARG[i], local_data__.ARG[i], $bits(ARG[i]))); \
end \
end \
end \
end \
else if ((__m_uvm_status_container.comparer.physical&&((FLAG)&UVM_PHYSICAL)) || \
(__m_uvm_status_container.comparer.abstract&&((FLAG)&UVM_ABSTRACT)) || \
(!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT)) ) \
__m_uvm_status_container.comparer.result++; \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
end \
end \
UVM_PACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
/**/ if(__m_uvm_status_container.packer.use_metadata) __m_uvm_status_container.packer.pack_field_int(ARG.size(), 32); \
foreach(ARG[i]) \
if($bits(ARG[i]) <= 64) __m_uvm_status_container.packer.pack_field_int(ARG[i], $bits(ARG[i])); \
else __m_uvm_status_container.packer.pack_field(ARG[i], $bits(ARG[i])); \
end \
UVM_UNPACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
/**/ int sz = ARG.size(); \
/**/ if(__m_uvm_status_container.packer.use_metadata) sz = __m_uvm_status_container.packer.unpack_field_int(32); \
if(sz != ARG.size()) begin \
`M_UVM_``TYPE``_RESIZE (ARG,0) \
end \
foreach(ARG[i]) \
if($bits(ARG[i]) <= 64) ARG[i] = __m_uvm_status_container.packer.unpack_field_int($bits(ARG[i])); \
else ARG[i] = __m_uvm_status_container.packer.unpack_field($bits(ARG[i])); \
end \
UVM_RECORD: \
`m_uvm_record_qda_int(ARG, FLAG, ARG.size()) \
UVM_PRINT: \
begin \
if(((FLAG)&UVM_NOPRINT) == 0) begin \
`uvm_print_array_int3(ARG, uvm_radix_enum'((FLAG)&(UVM_RADIX)), \
__m_uvm_status_container.printer) \
end \
end \
UVM_SETINT: \
begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if((FLAG)&UVM_READONLY) begin \
uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
/**/ else begin \
/**/ int sz = uvm_object::__m_uvm_status_container.bitstream; \
/**/ if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
/**/ if(ARG.size() != sz) begin \
/**/ `M_UVM_``TYPE``_RESIZE(ARG,0) \
/**/ end \
/**/ __m_uvm_status_container.status = 1; \
/**/ end \
end \
else if(!((FLAG)&UVM_READONLY)) begin \
bit wildcard_index__; \
int index__; \
index__ = uvm_get_array_index_int(str__, wildcard_index__); \
if(uvm_is_array(str__) && (index__ != -1)) begin\
if(wildcard_index__) begin \
for(index__=0; index__<ARG.size(); ++index__) begin \
if(uvm_is_match(str__, {__m_uvm_status_container.scope.get_arg(),$sformatf("[%0d]", index__)})) begin \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg(), $sformatf("[%0d]",index__)}, UVM_LOW); \
ARG[index__] = uvm_object::__m_uvm_status_container.bitstream; \
__m_uvm_status_container.status = 1; \
end \
end \
end \
else if(uvm_is_match(str__, {__m_uvm_status_container.scope.get_arg(),$sformatf("[%0d]", index__)})) begin \
if(index__+1 > ARG.size()) begin \
int sz = index__; \
int tmp__; \
`M_UVM_``TYPE``_RESIZE(ARG,tmp__) \
end \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
ARG[index__] = uvm_object::__m_uvm_status_container.bitstream; \
__m_uvm_status_container.status = 1; \
end \
end \
end \
end \
endcase \
end
// MACRO: `uvm_field_array_int
//
// Implements the data operations for a one-dimensional dynamic array of
// integrals.
//
//| `uvm_field_array_int(ARG,FLAG)
//
// ~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.
`define uvm_field_array_int(ARG,FLAG) \
`M_UVM_FIELD_QDA_INT(ARRAY,ARG,FLAG)
// MACRO: `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)
//
// ~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.
`define uvm_field_array_object(ARG,FLAG) \
`M_UVM_FIELD_QDA_OBJECT(ARRAY,ARG,FLAG)
`define M_UVM_FIELD_QDA_OBJECT(TYPE,ARG,FLAG) \
begin \
case (what__) \
UVM_CHECK_FIELDS: \
__m_uvm_status_container.do_field_check(`"ARG`", this); \
UVM_COPY: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOPY)) begin \
if(((FLAG)&UVM_REFERENCE)) \
ARG = local_data__.ARG; \
else begin \
int sz = local_data__.ARG.size(); \
`M_UVM_``TYPE``_RESIZE(ARG,null) \
foreach(ARG[i]) begin \
if(ARG[i] != null && local_data__.ARG[i] != null) \
ARG[i].copy(local_data__.ARG[i]); \
else if(ARG[i] == null && local_data__.ARG[i] != null) \
$cast(ARG[i], local_data__.ARG[i].clone()); \
else \
ARG[i] = null; \
end \
end \
end \
end \
UVM_COMPARE: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOMPARE)) begin \
if(((FLAG)&UVM_REFERENCE) && (__m_uvm_status_container.comparer.show_max <= 1) && (ARG !== local_data__.ARG) ) begin \
if(__m_uvm_status_container.comparer.show_max == 1) begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
__m_uvm_status_container.comparer.print_msg(""); \
end \
else if ((__m_uvm_status_container.comparer.physical&&((FLAG)&UVM_PHYSICAL)) || \
(__m_uvm_status_container.comparer.abstract&&((FLAG)&UVM_ABSTRACT)) || \
(!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT)) ) \
__m_uvm_status_container.comparer.result++; \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
else begin \
string s; \
if(ARG.size() != local_data__.ARG.size()) begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
__m_uvm_status_container.comparer.print_msg($sformatf("size mismatch: lhs: %0d rhs: %0d", ARG.size(), local_data__.ARG.size())); \
if(__m_uvm_status_container.comparer.show_max == 1) return; \
end \
for(int i=0; i<ARG.size() && i<local_data__.ARG.size(); ++i) begin \
if(ARG[i] != null && local_data__.ARG[i] != null) begin \
$swrite(s,`"ARG[%0d]`",i); \
void'(__m_uvm_status_container.comparer.compare_object(s, ARG[i], local_data__.ARG[i])); \
end \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
end \
end \
end \
UVM_PACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
if(__m_uvm_status_container.packer.use_metadata) __m_uvm_status_container.packer.pack_field_int(ARG.size(), 32); \
foreach(ARG[i]) \
__m_uvm_status_container.packer.pack_object(ARG[i]); \
end \
UVM_UNPACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
int sz = ARG.size(); \
if(__m_uvm_status_container.packer.use_metadata) sz = __m_uvm_status_container.packer.unpack_field_int(32); \
if(sz != ARG.size()) begin \
`M_UVM_``TYPE``_RESIZE(ARG,null) \
end \
foreach(ARG[i]) \
__m_uvm_status_container.packer.unpack_object(ARG[i]); \
end \
UVM_RECORD: \
`m_uvm_record_qda_object(ARG,FLAG,ARG.size()) \
UVM_PRINT: \
begin \
if(((FLAG)&UVM_NOPRINT) == 0) begin \
`uvm_print_array_object3(ARG, __m_uvm_status_container.printer,FLAG) \
end \
end \
UVM_SETINT: \
begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if((FLAG)&UVM_READONLY) begin \
uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
else begin \
int sz = uvm_object::__m_uvm_status_container.bitstream; \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
if(ARG.size() != sz) begin \
`M_UVM_``TYPE``_RESIZE(ARG,null) \
end \
__m_uvm_status_container.status = 1; \
end \
end \
else if(!((FLAG)&UVM_READONLY)) begin \
foreach(ARG[i]) begin \
string s; \
$swrite(s,`"ARG[%0d]`",i); \
__m_uvm_status_container.scope.set_arg(s); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
uvm_report_warning("STRMTC", {"set_int()", ": Match ignored for string ", str__, ". Cannot set object to int value."}); \
end \
else if(ARG[i]!=null && !((FLAG)&UVM_REFERENCE)) begin \
int cnt; \
//Only traverse if there is a possible match. \
for(cnt=0; cnt<str__.len(); ++cnt) begin \
if(str__[cnt] == "." || str__[cnt] == "*") break; \
end \
if(cnt!=str__.len()) begin \
__m_uvm_status_container.scope.down(s); \
ARG[i].__m_uvm_field_automation(null, UVM_SETINT, str__); \
__m_uvm_status_container.scope.up(); \
end \
end \
end \
end \
end \
UVM_SETSTR: \
begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if((FLAG)&UVM_READONLY) begin \
uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
else begin \
uvm_report_warning("STRMTC", {"set_str()", ": Match ignored for string ", str__, ". Cannot set array of objects to string value."}); \
end \
end \
else if(!((FLAG)&UVM_READONLY)) begin \
foreach(ARG[i]) begin \
string s; \
$swrite(s,`"ARG[%0d]`",i); \
__m_uvm_status_container.scope.set_arg(s); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
uvm_report_warning("STRMTC", {"set_str()", ": Match ignored for string ", str__, ". Cannot set object to string value."}); \
end \
else if(ARG[i]!=null && !((FLAG)&UVM_REFERENCE)) begin \
int cnt; \
//Only traverse if there is a possible match. \
for(cnt=0; cnt<str__.len(); ++cnt) begin \
if(str__[cnt] == "." || str__[cnt] == "*") break; \
end \
if(cnt!=str__.len()) begin \
__m_uvm_status_container.scope.down(s); \
ARG[i].__m_uvm_field_automation(null, UVM_SETSTR, str__); \
__m_uvm_status_container.scope.up(); \
end \
end \
end \
end \
end \
UVM_SETOBJ: \
begin \
string s; \
if(!((FLAG)&UVM_READONLY)) begin \
bit wildcard_index__; \
int index__; \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
index__ = uvm_get_array_index_int(str__, wildcard_index__); \
if(uvm_is_array(str__) && (index__ != -1)) begin\
if(wildcard_index__) begin \
for(index__=0; index__<ARG.size(); ++index__) begin \
if(uvm_is_match(str__, {__m_uvm_status_container.scope.get_arg(),$sformatf("[%0d]", index__)})) begin \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg(), $sformatf("[%0d]",index__)}, UVM_LOW); \
$cast(ARG[index__], uvm_object::__m_uvm_status_container.object); \
__m_uvm_status_container.status = 1; \
end \
end \
end \
else if(uvm_is_match(str__, {__m_uvm_status_container.get_full_scope_arg(),$sformatf("[%0d]", index__)})) begin \
if(index__+1 > ARG.size()) begin \
int sz = index__+1; \
`M_UVM_``TYPE``_RESIZE(ARG,null) \
end \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
$cast(ARG[index__], uvm_object::__m_uvm_status_container.object); \
__m_uvm_status_container.status = 1; \
end \
end \
else if(!((FLAG)&UVM_REFERENCE)) begin \
int cnt; \
foreach(ARG[i]) begin \
if (ARG[i]!=null) begin \
string s; \
$swrite(s,`"ARG[%0d]`",i); \
//Only traverse if there is a possible match. \
for(cnt=0; cnt<str__.len(); ++cnt) begin \
if(str__[cnt] == "." || str__[cnt] == "*") break; \
end \
if(cnt!=str__.len()) begin \
__m_uvm_status_container.scope.down(s); \
ARG[i].__m_uvm_field_automation(null, UVM_SETOBJ, str__); \
__m_uvm_status_container.scope.up(); \
end \
end \
end \
end \
end \
end \
endcase \
end
// MACRO: `uvm_field_array_string
//
// Implements the data operations for a one-dimensional dynamic array
// of strings.
//
//| `uvm_field_array_string(ARG,FLAG)
//
// ~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.
`define uvm_field_array_string(ARG,FLAG) \
`M_UVM_FIELD_QDA_STRING(ARRAY,ARG,FLAG)
`define M_UVM_FIELD_QDA_STRING(TYPE,ARG,FLAG) \
begin \
case (what__) \
UVM_CHECK_FIELDS: \
__m_uvm_status_container.do_field_check(`"ARG`", this); \
UVM_COPY: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOPY)) ARG = local_data__.ARG; \
end \
UVM_COMPARE: \
begin \
if(local_data__ == null) return; \
if(!((FLAG)&UVM_NOCOMPARE)) begin \
if(ARG != local_data__.ARG) begin \
if(__m_uvm_status_container.comparer.show_max == 1) begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
__m_uvm_status_container.comparer.print_msg(""); \
end \
else if(__m_uvm_status_container.comparer.show_max) begin \
if(ARG.size() != local_data__.ARG.size()) begin \
void'(__m_uvm_status_container.comparer.compare_field(`"ARG``.size`", ARG.size(), local_data__.ARG.size(), 32)); \
end \
else begin \
foreach(ARG[i]) begin \
if(ARG[i] != local_data__.ARG[i]) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`",i); \
void'(__m_uvm_status_container.comparer.compare_string("", ARG[i], local_data__.ARG[i])); \
end \
end \
end \
end \
else if ((__m_uvm_status_container.comparer.physical&&((FLAG)&UVM_PHYSICAL)) || \
(__m_uvm_status_container.comparer.abstract&&((FLAG)&UVM_ABSTRACT)) || \
(!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT)) ) \
__m_uvm_status_container.comparer.result++; \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
end \
end \
UVM_PACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
if(__m_uvm_status_container.packer.use_metadata) __m_uvm_status_container.packer.pack_field_int(ARG.size(), 32); \
foreach(ARG[i]) \
__m_uvm_status_container.packer.pack_string(ARG[i]); \
end \
UVM_UNPACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
int sz = ARG.size(); \
if(__m_uvm_status_container.packer.use_metadata) sz = __m_uvm_status_container.packer.unpack_field_int(32); \
if(sz != ARG.size()) begin \
`M_UVM_``TYPE``_RESIZE(ARG,"") \
end \
foreach(ARG[i]) \
ARG[i] = __m_uvm_status_container.packer.unpack_string(); \
end \
UVM_RECORD: \
`m_uvm_record_qda_string(ARG,FLAG,ARG.size()) \
UVM_PRINT: \
begin \
if(((FLAG)&UVM_NOPRINT) == 0) begin \
`uvm_print_array_string2(ARG, __m_uvm_status_container.printer) \
end \
end \
UVM_SETINT: \
begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if((FLAG)&UVM_READONLY) begin \
uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
else begin \
int sz = uvm_object::__m_uvm_status_container.bitstream; \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
if(ARG.size() != sz) begin \
`M_UVM_``TYPE``_RESIZE(ARG,"") \
end \
__m_uvm_status_container.status = 1; \
end \
end \
end \
UVM_SETSTR: \
begin \
if(!((FLAG)&UVM_READONLY)) begin \
bit wildcard_index__; \
int index__; \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
index__ = uvm_get_array_index_int(str__, wildcard_index__); \
if(uvm_is_array(str__) && (index__ != -1)) begin\
if(wildcard_index__) begin \
for(index__=0; index__<ARG.size(); ++index__) begin \
if(uvm_is_match(str__, {__m_uvm_status_container.scope.get_arg(),$sformatf("[%0d]", index__)})) begin \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg(), $sformatf("[%0d]",index__)}, UVM_LOW); \
ARG[index__] = uvm_object::__m_uvm_status_container.stringv; \
__m_uvm_status_container.status = 1; \
end \
end \
end \
else if(uvm_is_match(str__, {__m_uvm_status_container.scope.get_arg(),$sformatf("[%0d]", index__)})) begin \
if(index__+1 > ARG.size()) begin \
int sz = index__; \
string tmp__; \
`M_UVM_``TYPE``_RESIZE(ARG,tmp__) \
end \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
ARG[index__] = uvm_object::__m_uvm_status_container.stringv; \
__m_uvm_status_container.status = 1; \
end \
end \
end \
end \
endcase \
end
// MACRO: `uvm_field_array_enum
//
// Implements the data operations for a one-dimensional dynamic array of
// enums.
//
//| `uvm_field_array_enum(T,ARG,FLAG)
//
// ~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.
`define uvm_field_array_enum(T,ARG,FLAG) \
`M_FIELD_QDA_ENUM(ARRAY,T,ARG,FLAG)
`define M_FIELD_QDA_ENUM(TYPE,T,ARG,FLAG) \
begin \
case (what__) \
UVM_CHECK_FIELDS: \
__m_uvm_status_container.do_field_check(`"ARG`", this); \
UVM_COPY: \
begin \
if(!((FLAG)&UVM_NOCOPY)) ARG = local_data__.ARG; \
end \
UVM_COMPARE: \
begin \
if(!((FLAG)&UVM_NOCOMPARE)) begin \
if(ARG !== local_data__.ARG) begin \
if(__m_uvm_status_container.comparer.show_max == 1) begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
__m_uvm_status_container.comparer.print_msg(""); \
end \
else if(__m_uvm_status_container.comparer.show_max) begin \
/**/if(ARG.size() != local_data__.ARG.size()) begin \
/**/ void'(__m_uvm_status_container.comparer.compare_field(`"ARG``.size`", ARG.size(), local_data__.ARG.size(), 32)); \
/**/end \
/**/else begin \
foreach(ARG[i]) begin \
if(ARG[i] !== local_data__.ARG[i]) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`",i); \
$swrite(__m_uvm_status_container.stringv, "lhs = %0s : rhs = %0s", \
ARG[i].name(), local_data__.ARG[i].name()); \
__m_uvm_status_container.comparer.print_msg(__m_uvm_status_container.stringv); \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
end \
/**/end \
end \
else if ((__m_uvm_status_container.comparer.physical&&((FLAG)&UVM_PHYSICAL)) || \
(__m_uvm_status_container.comparer.abstract&&((FLAG)&UVM_ABSTRACT)) || \
(!((FLAG)&UVM_PHYSICAL) && !((FLAG)&UVM_ABSTRACT)) ) \
__m_uvm_status_container.comparer.result++; \
if(__m_uvm_status_container.comparer.result && (__m_uvm_status_container.comparer.show_max <= __m_uvm_status_container.comparer.result)) return; \
end \
end \
end \
UVM_PACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
/**/if(__m_uvm_status_container.packer.use_metadata) __m_uvm_status_container.packer.pack_field_int(ARG.size(), 32); \
foreach(ARG[i]) \
__m_uvm_status_container.packer.pack_field_int(int'(ARG[i]), $bits(ARG[i])); \
end \
UVM_UNPACK: \
if(!((FLAG)&UVM_NOPACK)) begin \
/**/int sz = ARG.size(); \
/**/if(__m_uvm_status_container.packer.use_metadata) sz = __m_uvm_status_container.packer.unpack_field_int(32); \
/**/if(sz != ARG.size()) begin \
/**/ T tmp__; \
/**/ `M_UVM_``TYPE``_RESIZE(ARG,tmp__) \
/**/end \
foreach(ARG[i]) \
ARG[i] = T'(__m_uvm_status_container.packer.unpack_field_int($bits(ARG[i]))); \
end \
UVM_RECORD: \
/**/`m_uvm_record_qda_enum(ARG,FLAG,ARG.size()) \
UVM_PRINT: \
begin \
if(((FLAG)&UVM_NOPRINT) == 0) begin \
`uvm_print_qda_enum(ARG, __m_uvm_status_container.printer, array, T) \
end \
end \
UVM_SETINT: \
begin \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
if(uvm_is_match(str__, __m_uvm_status_container.scope.get())) begin \
if((FLAG)&UVM_READONLY) begin \
uvm_report_warning("RDONLY", $sformatf("Readonly argument match %s is ignored", \
__m_uvm_status_container.get_full_scope_arg()), UVM_NONE); \
end \
/**/else begin \
/**/ int sz = uvm_object::__m_uvm_status_container.bitstream; \
/**/ if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
/**/ if(ARG.size() != sz) begin \
/**/ T tmp__; \
/**/ `M_UVM_``TYPE``_RESIZE(ARG,tmp__) \
/**/ end \
/**/ __m_uvm_status_container.status = 1; \
/**/end \
end \
else if(!((FLAG)&UVM_READONLY)) begin \
bit wildcard_index__; \
int index__; \
index__ = uvm_get_array_index_int(str__, wildcard_index__); \
if(uvm_is_array(str__) && (index__ != -1)) begin\
if(wildcard_index__) begin \
for(index__=0; index__<ARG.size(); ++index__) begin \
if(uvm_is_match(str__, {__m_uvm_status_container.scope.get_arg(),$sformatf("[%0d]", index__)})) begin \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg(), $sformatf("[%0d]",index__)}, UVM_LOW); \
ARG[index__] = T'(uvm_object::__m_uvm_status_container.bitstream); \
__m_uvm_status_container.status = 1; \
end \
end \
end \
else if(uvm_is_match(str__, {__m_uvm_status_container.scope.get_arg(),$sformatf("[%0d]", index__)})) begin \
if(index__+1 > ARG.size()) begin \
int sz = index__; \
T tmp__; \
`M_UVM_``TYPE``_RESIZE(ARG,tmp__) \
end \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
ARG[index__] = T'(uvm_object::__m_uvm_status_container.bitstream); \
__m_uvm_status_container.status = 1; \
end \
end \
end \
end \
UVM_SETSTR: \
begin \
if(!((FLAG)&UVM_READONLY)) begin \
bit wildcard_index__; \
int index__; \
__m_uvm_status_container.scope.set_arg(`"ARG`"); \
index__ = uvm_get_array_index_int(str__, wildcard_index__); \
if(uvm_is_array(str__) && (index__ != -1)) begin\
if(wildcard_index__) begin \
for(index__=0; index__<ARG.size(); ++index__) begin \
if(uvm_is_match(str__, {__m_uvm_status_container.scope.get_arg(),$sformatf("[%0d]", index__)})) begin \
T t__; \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg(), $sformatf("[%0d]",index__)}, UVM_LOW); \
void'(uvm_enum_wrapper#(T)::from_name(uvm_object::__m_uvm_status_container.stringv, t__)); ARG[index__]=t__; \
__m_uvm_status_container.status = 1; \
end \
end \
end \
else if(uvm_is_match(str__, {__m_uvm_status_container.scope.get_arg(),$sformatf("[%0d]", index__)})) begin \
T t__; \
if(index__+1 > ARG.size()) begin \
int sz = index__; \
T tmp__; \
`M_UVM_``TYPE``_RESIZE(ARG,tmp__) \
end \
if (__m_uvm_status_container.print_matches) \
uvm_report_info("STRMTC", {"set_int()", ": Matched string ", str__, " to field ", __m_uvm_status_container.get_full_scope_arg()}, UVM_LOW); \
void'(uvm_enum_wrapper#(T)::from_name(uvm_object::__m_uvm_status_container.stringv, t__)); ARG[index__]=t__; \
__m_uvm_status_container.status = 1; \
end \
end \
end \
end \
endcase \
end
//-----------------------------------------------------------------------------
// Group: `uvm_field_queue_* macros
//
// Macros that implement data operations for dynamic queues.
//
//-----------------------------------------------------------------------------
// MACRO: `uvm_field_queue_int
//
// Implements the data operations for a queue of integrals.
//
//| `uvm_field_queue_int(ARG,FLAG)
//
// ~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.
`define uvm_field_queue_int(ARG,FLAG) \
`M_UVM_FIELD_QDA_INT(QUEUE,ARG,FLAG)
// MACRO: `uvm_field_queue_object
//
// Implements the data operations for a queue of <uvm_object>-based objects.
//
//| `uvm_field_queue_object(ARG,FLAG)
//
// ~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.
`define uvm_field_queue_object(ARG,FLAG) \
`M_UVM_FIELD_QDA_OBJECT(QUEUE,ARG,FLAG)
// MACRO: `uvm_field_queue_string
//
// Implements the data operations for a queue of strings.
//
//| `uvm_field_queue_string(ARG,FLAG)
//
// ~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.
`define uvm_field_queue_string(ARG,FLAG) \
`M_UVM_FIELD_QDA_STRING(QUEUE,ARG,FLAG)
// MACRO: `uvm_field_queue_enum
//
// Implements the data operations for a one-dimensional queue of enums.
//
//| `uvm_field_queue_enum(T,ARG,FLAG)
//
// ~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.
`define uvm_field_queue_enum(T,ARG,FLAG) \
`M_FIELD_QDA_ENUM(QUEUE,T,ARG,FLAG)
//-----------------------------------------------------------------------------
// Group: `uvm_field_aa_*_string macros
//
// Macros that implement data operations for associative arrays indexed
// by ~string~.
//
//-----------------------------------------------------------------------------
// MACRO: `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)
//
// ~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.
`define uvm_field_aa_int_string(ARG, FLAG) \
begin \
if(what__==UVM_CHECK_FIELDS) __m_uvm_status_container.do_field_check(`"ARG`", this); \
`M_UVM_FIELD_DATA_AA_int_string(ARG,FLAG) \
`M_UVM_FIELD_SET_AA_TYPE(string, INT, ARG, __m_uvm_status_container.bitstream, FLAG) \
end
// MACRO: `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)
//
// ~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.
`define uvm_field_aa_object_string(ARG, FLAG) \
begin \
if(what__==UVM_CHECK_FIELDS) __m_uvm_status_container.do_field_check(`"ARG`", this); \
`M_UVM_FIELD_DATA_AA_object_string(ARG,FLAG) \
`M_UVM_FIELD_SET_AA_OBJECT_TYPE(string, ARG, FLAG) \
end
// MACRO: `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)
//
// ~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.
`define uvm_field_aa_string_string(ARG, FLAG) \
begin \
if(what__==UVM_CHECK_FIELDS) __m_uvm_status_container.do_field_check(`"ARG`", this); \
`M_UVM_FIELD_DATA_AA_string_string(ARG,FLAG) \
`M_UVM_FIELD_SET_AA_TYPE(string, STR, ARG, __m_uvm_status_container.stringv, FLAG) \
end
//-----------------------------------------------------------------------------
// Group: `uvm_field_aa_*_int macros
//
// Macros that implement data operations for associative arrays indexed by an
// integral type.
//
//-----------------------------------------------------------------------------
// MACRO: `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)
//
// ~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.
`define uvm_field_aa_object_int(ARG, FLAG) \
begin \
if(what__==UVM_CHECK_FIELDS) __m_uvm_status_container.do_field_check(`"ARG`", this); \
`M_UVM_FIELD_DATA_AA_object_int(ARG,FLAG) \
`M_UVM_FIELD_SET_AA_OBJECT_TYPE(int, ARG, FLAG) \
end
// MACRO: `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)
//
// ~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.
`define uvm_field_aa_int_int(ARG, FLAG) \
`uvm_field_aa_int_key(int, ARG, FLAG) \
// MACRO: `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)
//
// ~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.
`define uvm_field_aa_int_int_unsigned(ARG, FLAG) \
`uvm_field_aa_int_key(int unsigned, ARG, FLAG)
// MACRO: `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)
//
// ~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.
`define uvm_field_aa_int_integer(ARG, FLAG) \
`uvm_field_aa_int_key(integer, ARG, FLAG)
// MACRO: `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)
//
// ~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.
`define uvm_field_aa_int_integer_unsigned(ARG, FLAG) \
`uvm_field_aa_int_key(integer unsigned, ARG, FLAG)
// MACRO: `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)
//
// ~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.
`define uvm_field_aa_int_byte(ARG, FLAG) \
`uvm_field_aa_int_key(byte, ARG, FLAG)
// MACRO: `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)
//
// ~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.
`define uvm_field_aa_int_byte_unsigned(ARG, FLAG) \
`uvm_field_aa_int_key(byte unsigned, ARG, FLAG)
// MACRO: `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)
//
// ~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.
`define uvm_field_aa_int_shortint(ARG, FLAG) \
`uvm_field_aa_int_key(shortint, ARG, FLAG)
// MACRO: `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)
//
// ~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.
`define uvm_field_aa_int_shortint_unsigned(ARG, FLAG) \
`uvm_field_aa_int_key(shortint unsigned, ARG, FLAG)
// MACRO: `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)
//
// ~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.
`define uvm_field_aa_int_longint(ARG, FLAG) \
`uvm_field_aa_int_key(longint, ARG, FLAG)
// MACRO: `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)
//
// ~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.
`define uvm_field_aa_int_longint_unsigned(ARG, FLAG) \
`uvm_field_aa_int_key(longint unsigned, ARG, FLAG)
// MACRO: `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)
//
// ~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.
`define uvm_field_aa_int_key(KEY, ARG, FLAG) \
begin \
if(what__==UVM_CHECK_FIELDS) __m_uvm_status_container.do_field_check(`"ARG`", this); \
`M_UVM_FIELD_DATA_AA_int_key(KEY,ARG,FLAG) \
`M_UVM_FIELD_SET_AA_INT_TYPE(KEY, INT, ARG, __m_uvm_status_container.bitstream, FLAG) \
end
// MACRO: `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)
//
// ~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.
`define uvm_field_aa_int_enumkey(KEY, ARG, FLAG) \
begin \
if(what__==UVM_CHECK_FIELDS) __m_uvm_status_container.do_field_check(`"ARG`", this); \
`M_UVM_FIELD_DATA_AA_enum_key(KEY,ARG,FLAG) \
`M_UVM_FIELD_SET_AA_INT_ENUMTYPE(KEY, INT, ARG, __m_uvm_status_container.bitstream, FLAG) \
end
// m_uvm_print_int
// Purpose: provide print functionality for a specific integral field. This
// macro is available for user access. If used externally, a record_options
// object must be avaialble and must have the name opt.
//
// Postcondition: ~ARG~ is printed using the format set by the FLAGS.
`define m_uvm_print_int(ARG,FLAG) \
if(!((FLAG)&UVM_NOPRINT)) begin \
if ($bits(ARG) > 64) \
__m_uvm_status_container.printer.print_field(`"ARG`", ARG, $bits(ARG), uvm_radix_enum'((FLAG)&(UVM_RADIX))); \
else \
__m_uvm_status_container.printer.print_field_int(`"ARG`", ARG, $bits(ARG), uvm_radix_enum'((FLAG)&(UVM_RADIX))); \
end
//-----------------------------------------------------------------------------
//
// MACROS- recording
//
//-----------------------------------------------------------------------------
// m_uvm_record_int
// ----------------
// Purpose: provide record functionality for a specific integral field. This
// macro is available for user access. If used externally, a record_options
// object must be avaialble and must have the name opt.
//
// Postcondition: ~ARG~ is printed using the format set by the FLAGS.
`define m_uvm_record_int(ARG,FLAG) \
if(!((FLAG)&UVM_NORECORD)) begin \
if ($bits(ARG) > 64) \
__m_uvm_status_container.recorder.record_field(`"ARG`", ARG, $bits(ARG), uvm_radix_enum'((FLAG)&(UVM_RADIX))); \
else \
__m_uvm_status_container.recorder.record_field_int(`"ARG`", ARG, $bits(ARG), uvm_radix_enum'((FLAG)&(UVM_RADIX))); \
end
// m_uvm_record_string
// -------------------
// Purpose: provide record functionality for a specific string field. This
// macro is available for user access. If used externally, a record_options
// object must be avaialble and must have the name recorder.
//
// Postcondition: ~ARG~ is recorded in string format.
`define m_uvm_record_string(ARG,STR,FLAG) \
if(!((FLAG)&UVM_NORECORD)) begin \
__m_uvm_status_container.recorder.record_string(`"ARG`", STR); \
end
// m_uvm_record_object
// -------------------
// Purpose: provide record functionality for a specific <uvm_object> field. This
// macro is available for user access. If used externally, a record_options
// object must be avaialble and must have the name recorder.
//
// Postcondition: ~ARG~ is recorded. The record is done recursively where the
// depth to record is set in the recorder object.
`define m_uvm_record_object(ARG,FLAG) \
if(!((FLAG)&UVM_NORECORD)) begin \
__m_uvm_status_container.recorder.record_object(`"ARG`", ARG); \
end
// m_uvm_record_qda_int
// --------------------
`define m_uvm_record_qda_int(ARG, FLAG, SZ) \
begin \
if(!((FLAG)&UVM_NORECORD)) begin \
int sz__ = SZ; \
if(sz__ == 0) begin \
__m_uvm_status_container.recorder.record_field_int(`"ARG`", 0, 32, UVM_DEC); \
end \
else if(sz__ < 10) begin \
foreach(ARG[i]) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`",i); \
if ($bits(ARG[i]) > 64) \
__m_uvm_status_container.recorder.record_field(__m_uvm_status_container.scope.get(), ARG[i], $bits(ARG[i]), uvm_radix_enum'((FLAG)&UVM_RADIX)); \
else \
__m_uvm_status_container.recorder.record_field_int(__m_uvm_status_container.scope.get(), ARG[i], $bits(ARG[i]), uvm_radix_enum'((FLAG)&UVM_RADIX)); \
end \
end \
else begin \
for(int i=0; i<5; ++i) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`", i); \
if ($bits(ARG[i]) > 64) \
__m_uvm_status_container.recorder.record_field(__m_uvm_status_container.scope.get(), ARG[i], $bits(ARG[i]), uvm_radix_enum'((FLAG)&UVM_RADIX)); \
else \
__m_uvm_status_container.recorder.record_field_int(__m_uvm_status_container.scope.get(), ARG[i], $bits(ARG[i]), uvm_radix_enum'((FLAG)&UVM_RADIX)); \
end \
for(int i=sz__-5; i<sz__; ++i) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`", i); \
if ($bits(ARG[i]) > 64) \
__m_uvm_status_container.recorder.record_field(__m_uvm_status_container.scope.get(), ARG[i], $bits(ARG[i]), uvm_radix_enum'((FLAG)&UVM_RADIX)); \
else \
__m_uvm_status_container.recorder.record_field_int(__m_uvm_status_container.scope.get(), ARG[i], $bits(ARG[i]), uvm_radix_enum'((FLAG)&UVM_RADIX)); \
end \
end \
end \
end
// m_uvm_record_qda_enum
// ---------------------
`define m_uvm_record_qda_enum(ARG, FLAG, SZ) \
begin \
if(!((FLAG)&UVM_NORECORD) && (__m_uvm_status_container.recorder != null)) begin \
int sz__ = SZ; \
if(sz__ == 0) begin \
__m_uvm_status_container.recorder.record_field_int(`"ARG``.size`", 0, 32, UVM_DEC); \
end \
else if(sz__ < 10) begin \
foreach(ARG[i]) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`",i); \
__m_uvm_status_container.recorder.record_string(__m_uvm_status_container.scope.get(), ARG[i].name()); \
end \
end \
else begin \
for(int i=0; i<5; ++i) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`", i); \
__m_uvm_status_container.recorder.record_string(__m_uvm_status_container.scope.get(), ARG[i].name()); \
end \
for(int i=sz__-5; i<sz__; ++i) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`", i); \
__m_uvm_status_container.recorder.record_string(__m_uvm_status_container.scope.get(), ARG[i].name()); \
end \
end \
end \
end
// m_uvm_record_qda_object
// -----------------------
`define m_uvm_record_qda_object(ARG, FLAG, SZ) \
begin \
if(!((FLAG)&UVM_NORECORD)) begin \
int sz__ = SZ; \
string s; \
if(sz__ == 0 ) begin \
__m_uvm_status_container.recorder.record_field_int(`"ARG``.size`", 0, 32, UVM_DEC); \
end \
if(sz__ < 10) begin \
foreach(ARG[i]) begin \
$swrite(s,`"ARG[%0d]`", i); \
__m_uvm_status_container.recorder.record_object(s, ARG[i]); \
end \
end \
else begin \
for(int i=0; i<5; ++i) begin \
$swrite(s,`"ARG[%0d]`", i); \
__m_uvm_status_container.recorder.record_object(s, ARG[i]); \
end \
for(int i=sz__-5; i<sz__; ++i) begin \
$swrite(s,`"ARG[%0d]`", i); \
__m_uvm_status_container.recorder.record_object(s, ARG[i]); \
end \
end \
end \
end
// m_uvm_record_qda_string
// -----------------------
`define m_uvm_record_qda_string(ARG, FLAG, SZ) \
begin \
int sz__ = SZ; \
if(!((FLAG)&UVM_NORECORD)) begin \
if(sz__ == 0) begin \
__m_uvm_status_container.recorder.record_field_int(`"ARG``.size`", 0, 32, UVM_DEC); \
end \
else if(sz__ < 10) begin \
foreach(ARG[i]) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`",i); \
__m_uvm_status_container.recorder.record_string(__m_uvm_status_container.scope.get(), ARG[i]); \
end \
end \
else begin \
for(int i=0; i<5; ++i) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`", i); \
__m_uvm_status_container.recorder.record_string(__m_uvm_status_container.scope.get(), ARG[i]); \
end \
for(int i=sz__-5; i<sz__; ++i) begin \
__m_uvm_status_container.scope.set_arg_element(`"ARG`", i); \
__m_uvm_status_container.recorder.record_string(__m_uvm_status_container.scope.get(), ARG[i]); \
end \
end \
end \
end
// M_UVM_FIELD_DATA_AA_generic
// -------------------------
`define M_UVM_FIELD_DATA_AA_generic(TYPE, KEY, ARG, FLAG) \
begin \
begin \
case (what__) \
UVM_COMPARE: \
begin \
if(!((FLAG)&UVM_NOCOMPARE) && (tmp_data__ != null) ) \
begin \
$cast(local_data__, tmp_data__); \
if(ARG.num() != local_data__.ARG.num()) begin \
int s1__, s2__; \
__m_uvm_status_container.stringv = ""; \
s1__ = ARG.num(); s2__ = local_data__.ARG.num(); \
$swrite(__m_uvm_status_container.stringv, "lhs size = %0d : rhs size = %0d", \
s1__, s2__);\
__m_uvm_status_container.comparer.print_msg(__m_uvm_status_container.stringv); \
end \
string_aa_key = ""; \
while(ARG.next(string_aa_key)) begin \
string s; \
__m_uvm_status_container.scope.set_arg({"[",string_aa_key,"]"}); \
s = {`"ARG[`",string_aa_key,"]"}; \
if($bits(ARG[string_aa_key]) <= 64) \
void'(__m_uvm_status_container.comparer.compare_field_int(s, ARG[string_aa_key], local_data__.ARG[string_aa_key], $bits(ARG[string_aa_key]), uvm_radix_enum'((FLAG)&UVM_RADIX))); \
else \
void'(__m_uvm_status_container.comparer.compare_field(s, ARG[string_aa_key], local_data__.ARG[string_aa_key], $bits(ARG[string_aa_key]), uvm_radix_enum'((FLAG)&UVM_RADIX))); \
__m_uvm_status_container.scope.unset_arg(string_aa_key); \
end \
end \
end \
UVM_COPY: \
begin \
if(!((FLAG)&UVM_NOCOPY) && (tmp_data__ != null) ) \
begin \
$cast(local_data__, tmp_data__); \
ARG.delete(); \
string_aa_key = ""; \
while(local_data__.ARG.next(string_aa_key)) \
ARG[string_aa_key] = local_data__.ARG[string_aa_key]; \
end \
end \
UVM_PRINT: \
if(!((FLAG)&UVM_NOPRINT)) begin \
`uvm_print_aa_``KEY``_``TYPE``3(ARG, uvm_radix_enum'((FLAG)&(UVM_RADIX)), \
__m_uvm_status_container.printer) \
end \
endcase \
end \
end
// M_UVM_FIELD_DATA_AA_int_string
// ----------------------------
`define M_UVM_FIELD_DATA_AA_int_string(ARG, FLAG) \
`M_UVM_FIELD_DATA_AA_generic(int, string, ARG, FLAG)
// M_UVM_FIELD_DATA_AA_int_int
// ----------------------------
`define M_UVM_FIELD_DATA_AA_int_key(KEY, ARG, FLAG) \
begin \
begin \
KEY aa_key; \
case (what__) \
UVM_COMPARE: \
begin \
if(!((FLAG)&UVM_NOCOMPARE) && (tmp_data__ != null) ) \
begin \
$cast(local_data__, tmp_data__); \
if(ARG.num() != local_data__.ARG.num()) begin \
int s1__, s2__; \
__m_uvm_status_container.stringv = ""; \
s1__ = ARG.num(); s2__ = local_data__.ARG.num(); \
$swrite(__m_uvm_status_container.stringv, "lhs size = %0d : rhs size = %0d", \
s1__, s2__);\
__m_uvm_status_container.comparer.print_msg(__m_uvm_status_container.stringv); \
end \
foreach(ARG[_aa_key]) begin \
string s; \
$swrite(string_aa_key, "%0d", _aa_key); \
__m_uvm_status_container.scope.set_arg({"[",string_aa_key,"]"}); \
s = {`"ARG[`",string_aa_key,"]"}; \
if($bits(ARG[_aa_key]) <= 64) \
void'(__m_uvm_status_container.comparer.compare_field_int(s, ARG[_aa_key], local_data__.ARG[_aa_key], $bits(ARG[_aa_key]), uvm_radix_enum'((FLAG)&UVM_RADIX))); \
else \
void'(__m_uvm_status_container.comparer.compare_field(s, ARG[_aa_key], local_data__.ARG[_aa_key], $bits(ARG[_aa_key]), uvm_radix_enum'((FLAG)&UVM_RADIX))); \
__m_uvm_status_container.scope.unset_arg(string_aa_key); \
end \
end \
end \
UVM_COPY: \
begin \
if(!((FLAG)&UVM_NOCOPY) && (tmp_data__ != null) ) \
begin \
$cast(local_data__, tmp_data__); \
ARG.delete(); \
if(local_data__.ARG.first(aa_key)) \
do begin \
ARG[aa_key] = local_data__.ARG[aa_key]; \
end while(local_data__.ARG.next(aa_key)); \
end \
end \
UVM_PRINT: \
if(!((FLAG)&UVM_NOPRINT)) begin \
`uvm_print_aa_int_key4(KEY,ARG, uvm_radix_enum'((FLAG)&(UVM_RADIX)), \
__m_uvm_status_container.printer) \
end \
endcase \
end \
end
// M_UVM_FIELD_DATA_AA_enum_key
// ----------------------------
`define M_UVM_FIELD_DATA_AA_enum_key(KEY, ARG, FLAG) \
begin \
begin \
KEY aa_key; \
case (what__) \
UVM_COMPARE: \
begin \
if(!((FLAG)&UVM_NOCOMPARE) && (tmp_data__ != null) ) \
begin \
$cast(local_data__, tmp_data__); \
if(ARG.num() != local_data__.ARG.num()) begin \
int s1__, s2__; \
__m_uvm_status_container.stringv = ""; \
s1__ = ARG.num(); s2__ = local_data__.ARG.num(); \
$swrite(__m_uvm_status_container.stringv, "lhs size = %0d : rhs size = %0d", \
s1__, s2__);\
__m_uvm_status_container.comparer.print_msg(__m_uvm_status_container.stringv); \
end \
foreach(ARG[_aa_key]) begin \
void'(__m_uvm_status_container.comparer.compare_field_int({`"ARG[`",_aa_key.name(),"]"}, \
ARG[_aa_key], local_data__.ARG[_aa_key], $bits(ARG[_aa_key]), \
uvm_radix_enum'((FLAG)&UVM_RADIX) )); \
end \
end \
end \
UVM_COPY: \
begin \
if(!((FLAG)&UVM_NOCOPY) && (tmp_data__ != null) ) \
begin \
$cast(local_data__, tmp_data__); \
ARG=local_data__.ARG; \
end \
end \
UVM_PRINT: \
if(!((FLAG)&UVM_NOPRINT)) begin \
uvm_printer p__ = __m_uvm_status_container.printer; \
p__.print_array_header (`"ARG`", ARG.num(),`"aa_``KEY`"); \
if((p__.knobs.depth == -1) || (__m_uvm_status_container.printer.m_scope.depth() < p__.knobs.depth+1)) \
begin \
foreach(ARG[_aa_key]) \
begin \
if ($bits(ARG[_aa_key]) > 64) \
__m_uvm_status_container.printer.print_field( \
{"[",_aa_key.name(),"]"}, ARG[_aa_key], $bits(ARG[_aa_key]), \
uvm_radix_enum'((FLAG)&UVM_RADIX), "[" ); \
else \
__m_uvm_status_container.printer.print_field_int( \
{"[",_aa_key.name(),"]"}, ARG[_aa_key], $bits(ARG[_aa_key]), \
uvm_radix_enum'((FLAG)&UVM_RADIX), "[" ); \
end \
end \
p__.print_array_footer(ARG.num()); \
//p__.print_footer(); \
end \
endcase \
end \
end
// M_UVM_FIELD_DATA_AA_object_string
// -------------------------------
`define M_UVM_FIELD_DATA_AA_object_string(ARG, FLAG) \
begin \
begin \
case (what__) \
UVM_COMPARE: \
begin \
if(!((FLAG)&UVM_NOCOMPARE) && (tmp_data__ != null) ) \
begin \
$cast(local_data__, tmp_data__); \
if(ARG.num() != local_data__.ARG.num()) begin \
int s1__, s2__; \
__m_uvm_status_container.stringv = ""; \
s1__ = ARG.num(); s2__ = local_data__.ARG.num(); \
$swrite(__m_uvm_status_container.stringv, "lhs size = %0d : rhs size = %0d", \
s1__, s2__);\
__m_uvm_status_container.comparer.print_msg(__m_uvm_status_container.stringv); \
end \
string_aa_key = ""; \
while(ARG.next(string_aa_key)) begin \
uvm_object lhs; \
uvm_object rhs; \
lhs = ARG[string_aa_key]; \
rhs = local_data__.ARG[string_aa_key]; \
__m_uvm_status_container.scope.down({"[",string_aa_key,"]"}); \
//if the object are the same then don't need to do a deep compare \
if(rhs != lhs) begin \
bit refcmp; \
refcmp = ((FLAG)& UVM_SHALLOW) && !(__m_uvm_status_container.comparer.policy == UVM_DEEP); \
//do a deep compare here \
if(!refcmp && !(__m_uvm_status_container.comparer.policy == UVM_REFERENCE)) begin \
if(((rhs == null) && (lhs != null)) || ((lhs==null) && (rhs!=null))) begin \
__m_uvm_status_container.comparer.print_msg_object(lhs, rhs); \
end \
else begin \
if (lhs != null) \
void'(lhs.compare(rhs, __m_uvm_status_container.comparer)); \
end \
end \
else begin //reference compare \
__m_uvm_status_container.comparer.print_msg_object(lhs, rhs); \
end \
end \
__m_uvm_status_container.scope.up_element(); \
end \
end \
end \
UVM_COPY: \
begin \
if(!((FLAG)&UVM_NOCOPY) && (tmp_data__ != null) ) \
begin \
$cast(local_data__, tmp_data__); \
ARG.delete(); \
foreach(local_data__.ARG[_string_aa_key]) begin\
if((FLAG)&UVM_REFERENCE) \
ARG[_string_aa_key] = local_data__.ARG[_string_aa_key]; \
/*else if((FLAG)&UVM_SHALLOW)*/ \
/* ARG[string_aa_key] = new local_data__.ARG[string_aa_key];*/ \
else begin\
$cast(ARG[_string_aa_key],local_data__.ARG[_string_aa_key].clone());\
ARG[_string_aa_key].set_name({`"ARG`","[",_string_aa_key, "]"});\
end \
end \
end \
end \
UVM_PRINT: \
if(!((FLAG)&UVM_NOPRINT)) begin \
`uvm_print_aa_string_object3(ARG, __m_uvm_status_container.printer,FLAG) \
end \
endcase \
end \
end
// M_UVM_FIELD_DATA_AA_object_int
// -------------------------------
`define M_UVM_FIELD_DATA_AA_object_int(ARG, FLAG) \
begin \
int key__; \
begin \
case (what__) \
UVM_COMPARE: \
begin \
if(!((FLAG)&UVM_NOCOMPARE) && (tmp_data__ != null) ) \
begin \
$cast(local_data__, tmp_data__); \
if(ARG.num() != local_data__.ARG.num()) begin \
int s1__, s2__; \
__m_uvm_status_container.stringv = ""; \
s1__ = ARG.num(); s2__ = local_data__.ARG.num(); \
$swrite(__m_uvm_status_container.stringv, "lhs size = %0d : rhs size = %0d", \
s1__, s2__);\
__m_uvm_status_container.comparer.print_msg(__m_uvm_status_container.stringv); \
end \
foreach(ARG[_key__]) begin \
uvm_object lhs; \
uvm_object rhs; \
lhs = ARG[key__]; \
rhs = local_data__.ARG[_key__]; \
__m_uvm_status_container.scope.down_element(_key__); \
if(rhs != lhs) begin \
bit refcmp; \
refcmp = ((FLAG)& UVM_SHALLOW) && !(__m_uvm_status_container.comparer.policy == UVM_DEEP); \
//do a deep compare here \
if(!refcmp && !(__m_uvm_status_container.comparer.policy == UVM_REFERENCE)) begin \
if(((rhs == null) && (lhs != null)) || ((lhs==null) && (rhs!=null))) begin \
__m_uvm_status_container.comparer.print_msg_object(lhs, rhs); \
end \
else begin \
if (lhs != null) \
void'(lhs.compare(rhs, __m_uvm_status_container.comparer)); \
end \
end \
else begin //reference compare \
__m_uvm_status_container.comparer.print_msg_object(lhs, rhs); \
end \
end \
__m_uvm_status_container.scope.up_element(); \
end \
end \
end \
UVM_COPY: \
begin \
if(!((FLAG)&UVM_NOCOPY) && (tmp_data__ != null) ) \
begin \
$cast(local_data__, tmp_data__); \
ARG.delete(); \
foreach(local_data__.ARG[_key__]) begin \
if((FLAG)&UVM_REFERENCE) \
ARG[_key__] = local_data__.ARG[_key__]; \
/*else if((FLAG)&UVM_SHALLOW)*/ \
/* ARG[key__] = new local_data__.ARG[key__];*/ \
else begin\
uvm_object tmp_obj; \
tmp_obj = local_data__.ARG[_key__].clone(); \
if(tmp_obj != null) \
$cast(ARG[_key__], tmp_obj); \
else \
ARG[_key__]=null; \
end \
end \
end \
end \
UVM_PRINT: \
if(!((FLAG)&UVM_NOPRINT)) begin \
`uvm_print_aa_int_object3(ARG, __m_uvm_status_container.printer,FLAG) \
end \
endcase \
end \
end
// M_UVM_FIELD_DATA_AA_string_string
// -------------------------------
`define M_UVM_FIELD_DATA_AA_string_string(ARG, FLAG) \
begin \
begin \
case (what__) \
UVM_COPY: \
begin \
if(!((FLAG)&UVM_NOCOPY) && (local_data__ !=null)) \
ARG = local_data__.ARG ; \
end \
UVM_PRINT: \
if(!((FLAG)&UVM_NOPRINT)) begin \
`uvm_print_aa_string_string2(ARG, __m_uvm_status_container.printer) \
end \
UVM_COMPARE: \
begin \
if(!((FLAG)&UVM_NOCOMPARE) && (tmp_data__ != null) ) \
begin \
$cast(local_data__, tmp_data__); \
if(ARG.num() != local_data__.ARG.num()) begin \
int s1__, s2__; \
__m_uvm_status_container.stringv = ""; \
s1__ = ARG.num(); s2__ = local_data__.ARG.num(); \
$swrite(__m_uvm_status_container.stringv, "lhs size = %0d : rhs size = %0d", \
s1__, s2__);\
__m_uvm_status_container.comparer.print_msg(__m_uvm_status_container.stringv); \
end \
string_aa_key = ""; \
while(ARG.next(string_aa_key)) begin \
string s__ = ARG[string_aa_key]; \
__m_uvm_status_container.scope.set_arg({"[",string_aa_key,"]"}); \
if(ARG[string_aa_key] != local_data__.ARG[string_aa_key]) begin \
__m_uvm_status_container.stringv = { "lhs = \"", s__, "\" : rhs = \"", local_data__.ARG[string_aa_key], "\""}; \
__m_uvm_status_container.comparer.print_msg(__m_uvm_status_container.stringv); \
end \
__m_uvm_status_container.scope.unset_arg(string_aa_key); \
end \
end \
end \
endcase \
end \
end
// M_UVM_FIELD_SET_AA_TYPE
// -----------------------
`define M_UVM_FIELD_SET_AA_TYPE(INDEX_TYPE, ARRAY_TYPE, ARRAY, RHS, FLAG) \
if((what__ >= UVM_START_FUNCS && what__ <= UVM_END_FUNCS) && (((FLAG)&UVM_READONLY) == 0)) begin \
bit wildcard_index__; \
INDEX_TYPE index__; \
index__ = uvm_get_array_index_``INDEX_TYPE(str__, wildcard_index__); \
if(what__==UVM_SET``ARRAY_TYPE) \
begin \
__m_uvm_status_container.scope.down(`"ARRAY`"); \
if(uvm_is_array(str__) ) begin\
if(wildcard_index__) begin \
if(ARRAY.first(index__)) \
do begin \
if(uvm_is_match(str__, {__m_uvm_status_container.scope.get(),$sformatf("[%0d]", index__)}) || \
uvm_is_match(str__, {__m_uvm_status_container.scope.get(),$sformatf("[%0s]", index__)})) begin \
ARRAY[index__] = RHS; \
__m_uvm_status_container.status = 1; \
end \
end while(ARRAY.next(index__));\
end \
else if(uvm_is_match(str__, {__m_uvm_status_container.scope.get(),$sformatf("[%0d]", index__)})) begin \
ARRAY[index__] = RHS; \
__m_uvm_status_container.status = 1; \
end \
else if(uvm_is_match(str__, {__m_uvm_status_container.scope.get(),$sformatf("[%0s]", index__)})) begin \
ARRAY[index__] = RHS; \
__m_uvm_status_container.status = 1; \
end \
end \
__m_uvm_status_container.scope.up(); \
end \
end
// M_UVM_FIELD_SET_AA_OBJECT_TYPE
// ------------------------------
`define M_UVM_FIELD_SET_AA_OBJECT_TYPE(INDEX_TYPE, ARRAY, FLAG) \
if((what__ >= UVM_START_FUNCS && what__ <= UVM_END_FUNCS) && (((FLAG)&UVM_READONLY) == 0)) begin \
bit wildcard_index__; \
INDEX_TYPE index__; \
index__ = uvm_get_array_index_``INDEX_TYPE(str__, wildcard_index__); \
if(what__==UVM_SETOBJ) \
begin \
__m_uvm_status_container.scope.down(`"ARRAY`"); \
if(uvm_is_array(str__) ) begin\
if(wildcard_index__) begin \
foreach(ARRAY[_index__]) begin \
if(uvm_is_match(str__, {__m_uvm_status_container.scope.get(),$sformatf("[%0d]", _index__)}) || \
uvm_is_match(str__, {__m_uvm_status_container.scope.get(),$sformatf("[%0s]", _index__)})) begin \
if (__m_uvm_status_container.object != null) \
$cast(ARRAY[_index__], __m_uvm_status_container.object); \
__m_uvm_status_container.status = 1; \
end \
end \
end \
else if(uvm_is_match(str__, {__m_uvm_status_container.scope.get(),$sformatf("[%0d]", index__)})) begin \
if (__m_uvm_status_container.object != null) \
$cast(ARRAY[index__], __m_uvm_status_container.object); \
__m_uvm_status_container.status = 1; \
end \
else if(uvm_is_match(str__, {__m_uvm_status_container.scope.get(),$sformatf("[%0s]", index__)})) begin \
if (__m_uvm_status_container.object != null) \
$cast(ARRAY[index__], __m_uvm_status_container.object); \
__m_uvm_status_container.status = 1; \
end \
end \
__m_uvm_status_container.scope.up(); \
end \
end
// M_UVM_FIELD_SET_AA_INT_TYPE
// ---------------------------
`define M_UVM_FIELD_SET_AA_INT_TYPE(INDEX_TYPE, ARRAY_TYPE, ARRAY, RHS, FLAG) \
if((what__ >= UVM_START_FUNCS && what__ <= UVM_END_FUNCS) && (((FLAG)&UVM_READONLY) == 0)) begin \
bit wildcard_index__; \
INDEX_TYPE index__; \
string idx__; \
index__ = uvm_get_array_index_int(str__, wildcard_index__); \
if(what__==UVM_SET``ARRAY_TYPE) \
begin \
__m_uvm_status_container.scope.down(`"ARRAY`"); \
if(uvm_is_array(str__) ) begin\
if(wildcard_index__) begin \
foreach(ARRAY[_index__]) begin \
$swrite(idx__, __m_uvm_status_container.scope.get(), "[", _index__, "]"); \
if(uvm_is_match(str__, idx__)) begin \
ARRAY[_index__] = RHS; \
__m_uvm_status_container.status = 1; \
end \
end \
end \
else if(uvm_is_match(str__, {__m_uvm_status_container.scope.get(),$sformatf("[%0d]", index__)})) begin \
ARRAY[index__] = RHS; \
__m_uvm_status_container.status = 1; \
end \
end \
__m_uvm_status_container.scope.up(); \
end \
end
// M_UVM_FIELD_SET_AA_INT_ENUMTYPE
// -------------------------------
`define M_UVM_FIELD_SET_AA_INT_ENUMTYPE(INDEX_TYPE, ARRAY_TYPE, ARRAY, RHS, FLAG) \
if((what__ >= UVM_START_FUNCS && what__ <= UVM_END_FUNCS) && (((FLAG)&UVM_READONLY) == 0)) begin \
bit wildcard_index__; \
INDEX_TYPE index__; \
string idx__; \
index__ = INDEX_TYPE'(uvm_get_array_index_int(str__, wildcard_index__)); \
if(what__==UVM_SET``ARRAY_TYPE) \
begin \
__m_uvm_status_container.scope.down(`"ARRAY`"); \
if(uvm_is_array(str__) ) begin\
if(wildcard_index__) begin \
foreach(ARRAY[_index__]) begin \
$swrite(idx__, __m_uvm_status_container.scope.get(), "[", _index__, "]"); \
if(uvm_is_match(str__, idx__)) begin \
ARRAY[_index__] = RHS; \
__m_uvm_status_container.status = 1; \
end \
end \
end \
else if(uvm_is_match(str__, {__m_uvm_status_container.scope.get(),$sformatf("[%0d]", index__)})) begin \
ARRAY[index__] = RHS; \
__m_uvm_status_container.status = 1; \
end \
end \
__m_uvm_status_container.scope.up(); \
end \
end
`endif //!UVM_EMPTY_MACROS
//------------------------------------------------------------------------------
// Group: Recording Macros
//
// The recording macros assist users who implement the <uvm_object::do_record>
// method. They help ensure that the fields are recorded using a vendor-
// independent API. Unlike the <uvm_recorder> policy, fields recorded using
// the macros do not lose type information--they are passed
// directly to the vendor-specific API. This results in more efficient recording
// and no artificial limit on bit-widths. See your simulator vendor's
// documentation for more information on its transaction recording capabilities.
//------------------------------------------------------------------------------
// Macro: `uvm_record_attribute
//
// Vendor-independent macro to hide tool-specific interface for
// recording attributes (fields) to a transaction database.
//
//| `uvm_record_attribute(TR_HANDLE, NAME, VALUE)
//
// The default implementation of the macro passes ~NAME~ and
// ~VALUE~ through to the <uvm_recorder::record_generic> method.
//
// This macro should not be called directly by the user, the
// other recording macros will call it automatically if
// <uvm_recorder::use_record_attribute> returns true.
//
`ifndef uvm_record_attribute
`ifdef QUESTA
`define uvm_record_attribute(TR_HANDLE,NAME,VALUE) \
$add_attribute(TR_HANDLE,VALUE,NAME);
`else
`define uvm_record_attribute(TR_HANDLE,NAME,VALUE) \
recorder.record_generic(NAME, $sformatf("%p", VALUE));
`endif
`endif
// Macro: `uvm_record_int
//
//| `uvm_record_int(NAME,VALUE,SIZE[,RADIX])
//
// The ~`uvm_record_int~ macro takes the same arguments as
// the <uvm_recorder::record_field> method (including the optional ~RADIX~).
//
// The default implementation will pass the name/value pair to
// <`uvm_record_attribute> if enabled, otherwise the information
// will be passed to <uvm_recorder::record_field>.
//
`ifndef uvm_record_int
`define uvm_record_int(NAME,VALUE,SIZE,RADIX = UVM_NORADIX) \
if (recorder != null && recorder.is_open()) begin \
if (recorder.use_record_attribute()) \
`uvm_record_attribute(recorder.get_record_attribute_handle(),NAME,VALUE) \
else \
if (SIZE > 64) \
recorder.record_field(NAME, VALUE, SIZE, RADIX); \
else \
recorder.record_field_int(NAME, VALUE, SIZE, RADIX); \
end
`endif
// Macro: `uvm_record_string
//
//| `uvm_record_string(NAME,VALUE)
//
// The ~`uvm_record_string~ macro takes the same arguments as
// the <uvm_recorder::record_string> method.
//
// The default implementation will pass the name/value pair to
// <`uvm_record_attribute> if enabled, otherwise the information
// will be passed to <uvm_recorder::record_string>.
//
`ifndef uvm_record_string
`define uvm_record_string(NAME,VALUE) \
if (recorder != null && recorder.is_open()) begin \
if (recorder.use_record_attribute()) \
`uvm_record_attribute(recorder.get_record_attribute_handle(),NAME,VALUE) \
else \
recorder.record_string(NAME,VALUE); \
end
`endif
// Macro: `uvm_record_time
//
//| `uvm_record_time(NAME,VALUE)
//
// The ~`uvm_record_time~ macro takes the same arguments as
// the <uvm_recorder::record_time> method.
//
// The default implementation will pass the name/value pair to
// <`uvm_record_attribute> if enabled, otherwise the information
// will be passed to <uvm_recorder::record_time>.
//
`ifndef uvm_record_time
`define uvm_record_time(NAME,VALUE) \
if (recorder != null && recorder.is_open()) begin \
if (recorder.use_record_attribute()) \
`uvm_record_attribute(recorder.get_record_attribute_handle(),NAME,VALUE) \
else \
recorder.record_time(NAME,VALUE); \
end
`endif
// Macro: `uvm_record_real
//
//| `uvm_record_real(NAME,VALUE)
//
// The ~`uvm_record_real~ macro takes the same arguments as
// the <uvm_recorder::record_field_real> method.
//
// The default implementation will pass the name/value pair to
// <`uvm_record_attribute> if enabled, otherwise the information
// will be passed to <uvm_recorder::record_field_real>.
//
`ifndef uvm_record_real
`define uvm_record_real(NAME,VALUE) \
if (recorder != null && recorder.is_open()) begin \
if (recorder.use_record_attribute()) \
`uvm_record_attribute(recorder.get_record_attribute_handle(),NAME,VALUE) \
else \
recorder.record_field_real(NAME,VALUE); \
end
`endif
// Macro: `uvm_record_field
//
// Macro for recording arbitrary name-value pairs into a transaction recording database.
// Requires a valid transaction handle, as provided by the
// <uvm_transaction::begin_tr> and <uvm_component::begin_tr> methods.
//
//| `uvm_record_field(NAME, VALUE)
//
// The default implementation will pass the name/value pair to
// <`uvm_record_attribute> if enabled, otherwise the information
// will be passed to <uvm_recorder::record_generic>, with the
// ~VALUE~ being converted to a string using "%p" notation.
//
// | recorder.record_generic(NAME,$sformatf("%p",VALUE));
//
`define uvm_record_field(NAME,VALUE) \
if (recorder != null && recorder.is_open()) begin \
if (recorder.use_record_attribute()) begin \
`uvm_record_attribute(recorder.get_record_attribute_handle(),NAME,VALUE) \
end \
else \
recorder.record_generic(NAME, $sformatf("%p", VALUE)); \
end
//------------------------------------------------------------------------------
// Group: Packing Macros
//
// The packing macros assist users who implement the <uvm_object::do_pack>
// method. They help ensure that the pack operation is the exact inverse of the
// unpack operation. See also <Unpacking Macros>.
//
//| virtual function void do_pack(uvm_packer packer);
//| `uvm_pack_int(cmd)
//| `uvm_pack_int(addr)
//| `uvm_pack_array(data)
//| endfunction
//
// The 'N' versions of these macros take a explicit size argument, which must
// be compile-time constant value greater than 0.
//------------------------------------------------------------------------------
//--------------------------------
// Group: Packing - With Size Info
//--------------------------------
// Macro: `uvm_pack_intN
//
// Pack an integral variable.
//
//| `uvm_pack_intN(VAR,SIZE)
//
`define uvm_pack_intN(VAR,SIZE) \
begin \
int __array[]; \
begin \
bit [SIZE-1:0] __vector = VAR; \
{ << int { __array }} = {{($bits(int) - (SIZE % $bits(int))) {1'b0}}, __vector}; \
end \
packer.pack_ints(__array, SIZE); \
end
// Macro: `uvm_pack_enumN
//
// Pack an integral variable.
//
//| `uvm_pack_enumN(VAR,SIZE)
//
`define uvm_pack_enumN(VAR,SIZE) \
`uvm_pack_intN(VAR,SIZE)
// Macro: `uvm_pack_sarrayN
//
// Pack a static array of integrals.
//
//| `uvm_pack_sarray(VAR,SIZE)
//
`define uvm_pack_sarrayN(VAR,SIZE) \
begin \
foreach (VAR `` [index]) \
`uvm_pack_intN(VAR[index],SIZE) \
end
// Macro: `uvm_pack_arrayN
//
// Pack a dynamic array of integrals.
//
//| `uvm_pack_arrayN(VAR,SIZE)
//
`define uvm_pack_arrayN(VAR,SIZE) \
begin \
if (packer.use_metadata) \
`uvm_pack_intN(VAR.size(),32) \
`uvm_pack_sarrayN(VAR,SIZE) \
end
// Macro: `uvm_pack_queueN
//
// Pack a queue of integrals.
//
//| `uvm_pack_queueN(VAR,SIZE)
//
`define uvm_pack_queueN(VAR,SIZE) \
`uvm_pack_arrayN(VAR,SIZE)
//------------------------------
// Group: Packing - No Size Info
//------------------------------
// Macro: `uvm_pack_int
//
// Pack an integral variable without having to also specify the bit size.
//
//| `uvm_pack_int(VAR)
//
`define uvm_pack_int(VAR) \
`uvm_pack_intN(VAR,$bits(VAR))
// Macro: `uvm_pack_enum
//
// Pack an enumeration value. Packing does not require its type be specified.
//
//| `uvm_pack_enum(VAR)
//
`define uvm_pack_enum(VAR) \
`uvm_pack_enumN(VAR,$bits(VAR))
// Macro: `uvm_pack_string
//
// Pack a string variable.
//
//| `uvm_pack_string(VAR)
//
`define uvm_pack_string(VAR) \
begin \
`uvm_pack_sarrayN(VAR,8) \
if (packer.use_metadata) \
`uvm_pack_intN(8'b0,8) \
end
// Macro: `uvm_pack_real
//
// Pack a variable of type real.
//
//| `uvm_pack_real(VAR)
//
`define uvm_pack_real(VAR) \
`uvm_pack_intN($realtobits(VAR),64)
// Macro: `uvm_pack_sarray
//
// Pack a static array without having to also specify the bit size
// of its elements.
//
//| `uvm_pack_sarray(VAR)
//
`define uvm_pack_sarray(VAR) \
`uvm_pack_sarrayN(VAR,$bits(VAR[0]))
// Macro: `uvm_pack_array
//
// Pack a dynamic array without having to also specify the bit size
// of its elements. Array size must be non-zero.
//
//| `uvm_pack_array(VAR)
//
`define uvm_pack_array(VAR) \
`uvm_pack_arrayN(VAR,$bits(VAR[0]))
// Macro: `uvm_pack_queue
//
// Pack a queue without having to also specify the bit size
// of its elements. Queue must not be empty.
//
//| `uvm_pack_queue(VAR)
//
`define uvm_pack_queue(VAR) \
`uvm_pack_queueN(VAR,$bits(VAR[0]))
//------------------------------------------------------------------------------
// Group: Unpacking Macros
//
// The unpacking macros assist users who implement the <uvm_object::do_unpack>
// method. They help ensure that the unpack operation is the exact inverse of
// the pack operation. See also <Packing Macros>.
//
//| virtual function void do_unpack(uvm_packer packer);
//| `uvm_unpack_enum(cmd,cmd_t)
//| `uvm_unpack_int(addr)
//| `uvm_unpack_array(data)
//| endfunction
//
// The 'N' versions of these macros take a explicit size argument, which must
// be a compile-time constant value greater than 0.
//------------------------------------------------------------------------------
//----------------------------------
// Group: Unpacking - With Size Info
//----------------------------------
// Macro: `uvm_unpack_intN
//
// Unpack into an integral variable.
//
//| `uvm_unpack_intN(VAR,SIZE)
//
`define uvm_unpack_intN(VAR,SIZE) \
begin \
int __array[] = new[(SIZE+31)/32]; \
bit [(((SIZE + 31) / 32) * 32) - 1:0] __var; \
packer.unpack_ints(__array, SIZE); \
__var = { << int { __array }}; \
VAR = __var; \
end
// Macro: `uvm_unpack_enumN
//
// Unpack enum of type ~TYPE~ into ~VAR~.
//
// `uvm_unpack_enumN(VAR,SIZE,TYPE)
//
`define uvm_unpack_enumN(VAR,SIZE,TYPE) \
begin \
if (packer.big_endian) \
{ << { VAR }} = packer.m_bits[packer.count +: SIZE]; \
else \
VAR = TYPE'(packer.m_bits[packer.count +: SIZE]); \
\
packer.count += SIZE; \
end
// Macro: `uvm_unpack_sarrayN
//
// Unpack a static (fixed) array of integrals.
//
//| `uvm_unpack_sarrayN(VAR,SIZE)
//
`define uvm_unpack_sarrayN(VAR,SIZE) \
begin \
foreach (VAR `` [i]) \
`uvm_unpack_intN(VAR``[i], SIZE) \
end
// Macro: `uvm_unpack_arrayN
//
// Unpack into a dynamic array of integrals.
//
//| `uvm_unpack_arrayN(VAR,SIZE)
//
`define uvm_unpack_arrayN(VAR,SIZE) \
begin \
int sz__; \
if (packer.use_metadata) begin \
`uvm_unpack_intN(sz__,32) \
VAR = new[sz__]; \
end \
`uvm_unpack_sarrayN(VAR,SIZE) \
end
// Macro: `uvm_unpack_queueN
//
// Unpack into a queue of integrals.
//
//| `uvm_unpack_queue(VAR,SIZE)
//
`define uvm_unpack_queueN(VAR,SIZE) \
begin \
int sz__; \
if (packer.use_metadata) \
`uvm_unpack_intN(sz__,32) \
while (VAR.size() > sz__) \
void'(VAR.pop_back()); \
for (int i=0; i<sz__; i++) \
`uvm_unpack_intN(VAR[i],SIZE) \
end
//--------------------------------
// Group: Unpacking - No Size Info
//--------------------------------
// Macro: `uvm_unpack_int
//
// Unpack an integral variable without having to also specify the bit size.
//
//| `uvm_unpack_int(VAR)
//
`define uvm_unpack_int(VAR) \
`uvm_unpack_intN(VAR,$bits(VAR))
// Macro: `uvm_unpack_enum
//
// Unpack an enumeration value, which requires its type be specified.
//
//| `uvm_unpack_enum(VAR,TYPE)
//
`define uvm_unpack_enum(VAR,TYPE) \
`uvm_unpack_enumN(VAR,$bits(VAR),TYPE)
// Macro: `uvm_unpack_string
//
// Unpack a string variable.
//
//| `uvm_unpack_string(VAR)
//
`define uvm_unpack_string(VAR) \
VAR = packer.unpack_string();
// Macro: `uvm_unpack_real
//
// Unpack a variable of type real.
//
//| `uvm_unpack_real(VAR)
//
`define uvm_unpack_real(VAR) \
begin \
longint unsigned real_bits64__; \
`uvm_unpack_intN(real_bits64__,64) \
VAR = $bitstoreal(real_bits64__); \
end
// Macro: `uvm_unpack_sarray
//
// Unpack a static array without having to also specify the bit size
// of its elements.
//
// | `uvm_unpack_sarray(VAR)
//
`define uvm_unpack_sarray(VAR) \
`uvm_unpack_sarrayN(VAR,$bits(VAR[0]))
// Macro: `uvm_unpack_array
//
// Unpack a dynamic array without having to also specify the bit size
// of its elements. Array size must be non-zero.
//
//| `uvm_unpack_array(VAR)
//
`define uvm_unpack_array(VAR) \
`uvm_unpack_arrayN(VAR,$bits(VAR[0]))
// Macro: `uvm_unpack_queue
//
// Unpack a queue without having to also specify the bit size
// of its elements. Queue must not be empty.
//
//| `uvm_unpack_queue(VAR)
//
`define uvm_unpack_queue(VAR) \
`uvm_unpack_queueN(VAR,$bits(VAR[0]))
`endif // UVM_OBJECT_DEFINES_SVH