| //---------------------------------------------------------------------- |
| // 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 |
| |