blob: c8c54592057f7a969d34aa0a13e6184df0ea6970 [file] [log] [blame] [edit]
//----------------------------------------------------------------------
// Copyright 2018 Synopsys, Inc.
// 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.
//----------------------------------------------------------------------
typedef class uvm_root;
//------------------------------------------------------------------------------
// Class -- NODOCS -- uvm_policy
//
// The abstract uvm_policy class provides a common base from which all UVM policy classes derive
// Implementation as per Section 16.1 UVM Policy
//------------------------------------------------------------------------------
// @uvm-ieee 1800.2-2017 auto 16.1.1
virtual class uvm_policy extends uvm_object;
typedef enum {
NEVER,
STARTED,
FINISHED
} recursion_state_e;
local uvm_object m_extensions[uvm_object_wrapper];
local uvm_object m_policy_stack[$];
// Function -- NODOCS -- new
//
// Creates a policy with the specified instance name. If name is not provided, then the policy instance is
// unnamed.
// @uvm-ieee 1800.2-2017 auto 16.1.2.1
function new (string name="");
super.new(name);
endfunction
// Function -- NODOCS -- flush
//
// The flush method resets the internal state of the policy, such that it can be reused.
// Policy extensions are Not cleared in below method as per 16.1.2.3
// @uvm-ieee 1800.2-2017 auto 16.1.2.2
virtual function void flush();
m_policy_stack.delete();
endfunction
// Function -- NODOCS -- extension_exists
// Function extension_exists
// Returns 1 if an extension exists within the policy with type matching ext_type; otherwise, returns 0.
// @uvm-ieee 1800.2-2017 auto 16.1.2.3.1
virtual function bit extension_exists( uvm_object_wrapper ext_type );
if (m_extensions.exists(ext_type))
extension_exists = 1;
else
extension_exists = 0;
endfunction
// Function -- NODOCS -- set_extension
//
// Sets the given extension inside of the policy, indexed using return value from extension's get_object_type?
// method (see 5.3.4.6). Only a single instance of an extension is stored per type. If there is an existing
// extension instance matching extension's type, extension replaces the instance and the replaced instance
// handle is returned; otherwise, null is returned.
// @uvm-ieee 1800.2-2017 auto 16.1.2.3.2
virtual function uvm_object set_extension( uvm_object extension );
uvm_object m_set_extension;
if ( extension == null)
uvm_report_fatal("NULLEXT", "Attempting to set null extension ", UVM_NONE);
// Case where extension exists.
if(m_extensions.exists(extension.get_object_type())) begin
m_set_extension = m_extensions[extension.get_object_type()] ;
m_extensions[extension.get_object_type()] = extension;
return m_set_extension;
end
else begin
// Other case where extension doesnt exist. Nothing to return
m_extensions[extension.get_object_type()] = extension;
return null;
end
endfunction
// Function -- NODOCS -- get_extension
//Returns the extension value stored within the policy with type matching ext_type. Returns null if no
// extension exists matching that type.
// @uvm-ieee 1800.2-2017 auto 16.1.2.3.3
virtual function uvm_object get_extension(uvm_object_wrapper ext_type );
if (m_extensions.exists(ext_type)) begin
return m_extensions[ext_type];
end
else
return null;
endfunction
// Function -- NODOCS -- clear_extension
// Removes the extension value stored within the policy matching type ext_type. If no extension exists
// matching type ext_type, the request is silently ignored.
// @uvm-ieee 1800.2-2017 auto 16.1.2.3.4
virtual function void clear_extension( uvm_object_wrapper ext_type );
m_extensions.delete(ext_type);
endfunction
// Function -- NODOCS -- clear_extensions
// Removes all extensions currently stored within the policy.
// @uvm-ieee 1800.2-2017 auto 16.1.2.3.5
virtual function void clear_extensions();
m_extensions.delete();
endfunction
// Function -- NODOCS -- push_active_object
// Pushes obj on to the internal object stack for this policy, making it the current active object, as retrieved by
// get_active_object (see 16.1.3.3). An implementation shall generate an error message if obj is null and the
// request will be ignored. Additionally, the policy shall push itself onto the active policy stack for obj using push_active_policy (see
// 5.3.14.1) when push_active_object is called.
// @uvm-ieee 1800.2-2017 auto 16.1.3.1
virtual function void push_active_object( uvm_object obj );
if(obj != null)
m_policy_stack.push_front(obj);
// Placeholder. Will be removed once uvm_object is updated. That's a seperate mantisi 6438
// obj.push_active_policy(this);
//
else
`uvm_error("UVM_POLICY_PUSHNULL", "Attempting to push an null object push_active_object onto the policy stack")
endfunction
// Function -- NODOCS -- pop_active_object
// Pops the current active object off of the internal object stack for this policy and returns the popped off value.
// For additional behaviour descriptions (see
// 5.3.14.2) when pop_active_object is called.
// @uvm-ieee 1800.2-2017 auto 16.1.3.2
virtual function uvm_object pop_active_object();
uvm_object m_tmp;
if(m_policy_stack.size() != 0) begin
m_tmp = m_policy_stack.pop_front();
return m_tmp;
end
else
`uvm_info("UVM_POLICY_EMPTY_POPACTIVE_OBJECT", "Attempting to pop an empty policy stack",UVM_DEBUG)
endfunction
// Function -- NODOCS -- get_active_object
// Returns the head of the internal object stack for this policy.
// empty, null is returned.
// @uvm-ieee 1800.2-2017 auto 16.1.3.3
virtual function uvm_object get_active_object();
if(m_policy_stack.size() != 0)
return m_policy_stack[0];
endfunction
// Function -- NODOCS -- get_active_object_depth
// Returns the current depth of the internal object stack for this policy.
virtual function int unsigned get_active_object_depth();
return m_policy_stack.size();
endfunction
endclass