blob: 04d71a8195223e7f38bf1682bcb16bc6e1cd9c11 [file]
//----------------------------------------------------------------------
// Copyright 2018 Cadence Design Systems, Inc.
// Copyright 2018 NVIDIA Corporation
// 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.
//----------------------------------------------------------------------
//------------------------------------------------------------------------------
//
// MACROS for resource usage
//
// Provides a set of macros which are useful for interacting with the
// resource database.
//
//------------------------------------------------------------------------------
`ifndef UVM_RESOURCE_DEFINES_SVH
`define UVM_RESOURCE_DEFINES_SVH
// m_uvm_resource_read
// -------------------
// Casts ~RSRC~ to uvm_resource#(TYPE) and if successful
// reads the resource into ~VAL~ with accessor ~OBJ~.
//
// ~SUCCESS~ shall be set to true if the resource was succesfully
// read, false otherwise.
`define uvm_resource_read(SUCCESS, RSRC, TYPE, VAL, OBJ=null) \
begin \
uvm_resource#(TYPE) __tmp_rsrc__; \
SUCCESS = $cast(__tmp_rsrc__, RSRC); \
if (SUCCESS) begin \
VAL = __tmp_rsrc__.read(OBJ); \
end \
end
// uvm_resource_builtin_int_read
// -----------------------------
// Attempts to read an integral typed resource ~RSRC~
// into VAL.
//
// ~SUCCESS~ shall be set to true if the resource was succesfully
// read, false otherwise.
//
// Supported Types:
// - uvm_integral_t
// - uvm_bitstream_t
// - int
// - int unsigned
//
`define uvm_resource_builtin_int_read(SUCCESS, RSRC, VAL, OBJ=null) \
begin \
`uvm_resource_read(SUCCESS, RSRC, uvm_integral_t, VAL, OBJ) \
if (!SUCCESS) \
`uvm_resource_read(SUCCESS, RSRC, uvm_bitstream_t, VAL, OBJ) \
if (!SUCCESS) \
`uvm_resource_read(SUCCESS, RSRC, int, VAL, OBJ) \
if (!SUCCESS) \
`uvm_resource_read(SUCCESS, RSRC, int unsigned, VAL, OBJ) \
end
// uvm_resource_int_read
// ---------------------
// Attempts to read an integral typed resource ~RSRC~,
// starting with ~TYPE~ before checking the builtin types.
//
// ~SUCCESS~ shall be set to true if the resource was succesfully
// read, false otherwise.
//
`define uvm_resource_int_read(SUCCESS, RSRC, TYPE, VAL, OBJ=null) \
begin \
`uvm_resource_read(SUCCESS, RSRC, TYPE, VAL, OBJ) \
if (!SUCCESS) \
`uvm_resource_builtin_int_read(SUCCESS, RSRC, VAL, OBJ) \
end
// uvm_resource_enum_read
// ---------------------
// Attempts to read an integral typed resource ~RSRC~,
// starting with ~TYPE~ and string before checking the
// builtin intergral types.
//
// ~SUCCESS~ shall be set to true if the resource was succesfully
// read, false otherwise.
//
`define uvm_resource_enum_read(SUCCESS, RSRC, TYPE, VAL, OBJ=null) \
begin \
`uvm_resource_read(SUCCESS, RSRC, TYPE, VAL, OBJ) \
if (!SUCCESS) begin \
TYPE __tmp_val__; \
string __tmp_string_val__; \
bit __tmp_success_val__; \
`uvm_resource_read(__tmp_success_val__, \
RSRC, \
string, \
__tmp_string_val__, \
OBJ) \
if (__tmp_success_val__ && \
uvm_enum_wrapper#(TYPE)::from_name(__tmp_string_val__, \
__tmp_val__)) begin \
VAL = __tmp_val__; \
SUCCESS = __tmp_success_val__; \
end \
end \
if (!SUCCESS) begin \
typedef bit [$bits(TYPE)-1:0] __tmp_int_t__; \
__tmp_int_t__ __tmp_int_val__; \
bit __tmp_success_val__; \
`uvm_resource_int_read(__tmp_success_val__, \
RSRC, \
__tmp_int_t__, \
__tmp_int_val__, \
OBJ) \
if (__tmp_success_val__) begin \
VAL = TYPE'(__tmp_int_val__); \
SUCCESS = __tmp_success_val__; \
end \
end \
end
// uvm_resource_real_read
// ---------------------
// Attempts to read a real typed resource ~RSRC~,
// starting with 'real' before checking the
// builtin intergral types.
//
// ~SUCCESS~ shall be set to true if the resource was succesfully
// read, false otherwise.
//
`define uvm_resource_real_read(SUCCESS, RSRC, VAL, OBJ=null) \
begin \
`uvm_resource_read(SUCCESS, RSRC, real, VAL, OBJ) \
if (!SUCCESS) begin \
typedef bit [63:0] __tmp_int_t__; \
__tmp_int_t__ __tmp_int_val__; \
bit __tmp_success_val__; \
`uvm_resource_int_read(__tmp_success_val__, \
RSRC, \
__tmp_int_t__, \
__tmp_int_val__, \
OBJ) \
if (__tmp_success_val__) begin \
VAL = $bitstoreal(__tmp_int_val__); \
SUCCESS = __tmp_success_val__; \
end \
end \
end
`endif // `ifndef UVM_RESOURCE_DEFINES_SVH