//
//------------------------------------------------------------------------------
// Copyright 2007-2011 Mentor Graphics Corporation
// Copyright 2007-2011 Cadence Design Systems, Inc.
// Copyright 2010-2011 Synopsys, Inc.
// Copyright 2013 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.
//------------------------------------------------------------------------------
// Class: uvm_simple_lock_dap
// Provides a 'Simple Lock' Data Access Policy.
//
// The 'Simple Lock' Data Access Policy allows for any number of 'sets',
// so long as the value is not 'locked'. The value can be retrieved using
// 'get' at any time.
//
// The UVM uses this policy to protect the ~file name~ value in the
// <uvm_text_tr_database>.
//
class [docs]uvm_simple_lock_dap#(type T=int) extends uvm_set_get_dap_base#(T);
// Used for self-references
typedef uvm_simple_lock_dap#(T) this_type;
// Parameterized Utils
`uvm_object_param_utils(uvm_simple_lock_dap#(T))
// Stored data
local T m_value;
// Lock state
local bit m_locked;
// Function: new
// Constructor
function [docs]new(string name="unnamed-uvm_simple_lock_dap#(T)");
super.new(name);
m_locked = 0;
endfunction : new
// Group: Set/Get Interface
// Function: set
// Updates the value stored within the DAP.
//
// ~set~ will result in an error if the DAP has
// been locked.
virtual function void [docs]set(T value);
if (m_locked)
`uvm_error("UVM/SIMPLE_LOCK_DAP/SAG",
$sformatf("Attempt to set new value on '%s', but the data access policy forbids setting while locked!",
get_full_name()))
else begin
m_value = value;
end
endfunction : set
// Function: try_set
// Attempts to update the value stored within the DAP.
//
// ~try_set~ will return a 1 if the value was successfully
// updated, or a 0 if the value can not be updated due
// to the DAP being locked. No errors will be reported
// if ~try_set~ fails.
virtual function bit [docs]try_set(T value);
if (m_locked)
return 0;
else begin
m_value = value;
return 1;
end
endfunction : try_set
// Function: get
// Returns the current value stored within the DAP
//
virtual function T [docs]get();
return m_value;
endfunction : get
// Function: try_get
// Retrieves the current value stored within the DAP
//
// ~try_get~ will always return 1.
virtual function bit [docs]try_get(output T value);
value = get();
return 1;
endfunction : try_get
// Group: Locking
// Function: lock
// Locks the data value
//
// The data value cannot be updated via <set> or <try_set> while locked.
function void [docs]lock();
m_locked = 1;
endfunction : lock
// Function: unlock
// Unlocks the data value
//
function void [docs]unlock();
m_locked = 0;
endfunction : unlock
// Function: is_locked
// Returns the state of the lock.
//
// Returns:
// 1 - The value is locked
// 0 - The value is unlocked
function bit [docs]is_locked();
return m_locked;
endfunction : is_locked
// Group: Introspection
//
// The ~uvm_simple_lock_dap~ cannot support the standard UVM
// instrumentation methods (~copy~, ~clone~, ~pack~ and
// ~unpack~), due to the fact that they would potentially
// violate the access policy.
//
// A call to any of these methods will result in an error.
virtual function void [docs]do_copy(uvm_object rhs);
`uvm_error("UVM/SIMPLE_LOCK_DAP/CPY",
"'copy()' is not supported for 'uvm_simple_lock_dap#(T)'")
endfunction : do_copy
virtual function void [docs]do_pack(uvm_packer packer);
`uvm_error("UVM/SIMPLE_LOCK_DAP/PCK",
"'pack()' is not supported for 'uvm_simple_lock_dap#(T)'")
endfunction : do_pack
virtual function void [docs]do_unpack(uvm_packer packer);
`uvm_error("UVM/SIMPLE_LOCK_DAP/UPK",
"'unpack()' is not supported for 'uvm_simple_lock_dap#(T)'")
endfunction : do_unpack
// Group- Reporting
// Function- convert2string
virtual function string [docs]convert2string();
if (m_locked)
return $sformatf("(%s) %0p [LOCKED]", `uvm_typename(m_value), m_value);
else
return $sformatf("(%s) %0p [UNLOCKED]", `uvm_typename(m_value), m_value);
endfunction : convert2string
// Function- do_print
virtual function void [docs]do_print(uvm_printer printer);
super.do_print(printer);
printer.print_int("lock_state", m_locked, $bits(m_locked));
printer.print_generic("value",
`uvm_typename(m_value),
0,
$sformatf("%0p", m_value));
endfunction : do_print
endclass // uvm_simple_lock_dap