// //------------------------------------------------------------------------------ // Copyright 2007-2018 Cadence Design Systems, Inc. // Copyright 2007-2011 Mentor Graphics Corporation // Copyright 2015-2018 NVIDIA Corporation // Copyright 2010-2018 Synopsys, 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. //-------------.---------------------------------------------------------------- //------------------------------------------------------------------------------ // Title -- NODOCS -- uvm_*_imp ports // // The following defines the UVM TLM implementation (imp) classes. //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // // CLASS -- NODOCS -- uvm_*_imp #(T,IMP) // // Unidirectional implementation (imp) port classes--An imp port provides access // to an implementation of the associated interface to all connected ~ports~ and // ~exports~. Each imp port instance ~must~ be connected to the component instance // that implements the associated interface, typically the imp port's parent. // All other connections-- e.g. to other ports and exports-- are prohibited. // // The asterisk in ~uvm_*_imp~ may be any of the following // //| blocking_put //| nonblocking_put //| put //| //| blocking_get //| nonblocking_get //| get //| //| blocking_peek //| nonblocking_peek //| peek //| //| blocking_get_peek //| nonblocking_get_peek //| get_peek // // Type parameters // // T - The type of transaction to be communicated by the imp // // IMP - The type of the component implementing the interface. That is, the class // to which this imp will delegate. // // The interface methods are implemented in a component of type ~IMP~, a handle // to which is passed in a constructor argument. The imp port delegates all // interface calls to this component. // //------------------------------------------------------------------------------ // Function -- NODOCS -- new // // Creates a new unidirectional imp port with the given ~name~ and ~parent~. // The ~parent~ must implement the interface associated with this port. // Its type must be the type specified in the imp's type-parameter, ~IMP~. // //| function new (string name, IMP parent); class uvm_blocking_put_imp #(type T=int, type IMP=int) extends uvm_port_base #(uvm_tlm_if_base #(T,T)); `UVM_IMP_COMMON(`UVM_TLM_BLOCKING_PUT_MASK,"uvm_blocking_put_imp",IMP) `UVM_BLOCKING_PUT_IMP (m_imp, T, t) endclass class uvm_nonblocking_put_imp #(type T=int, type IMP=int) extends uvm_port_base #(uvm_tlm_if_base #(T,T)); `UVM_IMP_COMMON(`UVM_TLM_NONBLOCKING_PUT_MASK,"uvm_nonblocking_put_imp",IMP) `UVM_NONBLOCKING_PUT_IMP (m_imp, T, t) endclass class uvm_put_imp #(type T=int, type IMP=int) extends uvm_port_base #(uvm_tlm_if_base #(T,T)); `UVM_IMP_COMMON(`UVM_TLM_PUT_MASK,"uvm_put_imp",IMP) `UVM_PUT_IMP (m_imp, T, t) endclass class uvm_blocking_get_imp #(type T=int, type IMP=int) extends uvm_port_base #(uvm_tlm_if_base #(T,T)); `UVM_IMP_COMMON(`UVM_TLM_BLOCKING_GET_MASK,"uvm_blocking_get_imp",IMP) `UVM_BLOCKING_GET_IMP (m_imp, T, t) endclass class uvm_nonblocking_get_imp #(type T=int, type IMP=int) extends uvm_port_base #(uvm_tlm_if_base #(T,T)); `UVM_IMP_COMMON(`UVM_TLM_NONBLOCKING_GET_MASK,"uvm_nonblocking_get_imp",IMP) `UVM_NONBLOCKING_GET_IMP (m_imp, T, t) endclass class uvm_get_imp #(type T=int, type IMP=int) extends uvm_port_base #(uvm_tlm_if_base #(T,T)); `UVM_IMP_COMMON(`UVM_TLM_GET_MASK,"uvm_get_imp",IMP) `UVM_GET_IMP (m_imp, T, t) endclass class uvm_blocking_peek_imp #(type T=int, type IMP=int) extends uvm_port_base #(uvm_tlm_if_base #(T,T)); `UVM_IMP_COMMON(`UVM_TLM_BLOCKING_PEEK_MASK,"uvm_blocking_peek_imp",IMP) `UVM_BLOCKING_PEEK_IMP (m_imp, T, t) endclass class uvm_nonblocking_peek_imp #(type T=int, type IMP=int) extends uvm_port_base #(uvm_tlm_if_base #(T,T)); `UVM_IMP_COMMON(`UVM_TLM_NONBLOCKING_PEEK_MASK,"uvm_nonblocking_peek_imp",IMP) `UVM_NONBLOCKING_PEEK_IMP (m_imp, T, t) endclass class uvm_peek_imp #(type T=int, type IMP=int) extends uvm_port_base #(uvm_tlm_if_base #(T,T)); `UVM_IMP_COMMON(`UVM_TLM_PEEK_MASK,"uvm_peek_imp",IMP) `UVM_PEEK_IMP (m_imp, T, t) endclass class uvm_blocking_get_peek_imp #(type T=int, type IMP=int) extends uvm_port_base #(uvm_tlm_if_base #(T,T)); `UVM_IMP_COMMON(`UVM_TLM_BLOCKING_GET_PEEK_MASK,"uvm_blocking_get_peek_imp",IMP) `UVM_BLOCKING_GET_PEEK_IMP (m_imp, T, t) endclass class uvm_nonblocking_get_peek_imp #(type T=int, type IMP=int) extends uvm_port_base #(uvm_tlm_if_base #(T,T)); `UVM_IMP_COMMON(`UVM_TLM_NONBLOCKING_GET_PEEK_MASK,"uvm_nonblocking_get_peek_imp",IMP) `UVM_NONBLOCKING_GET_PEEK_IMP (m_imp, T, t) endclass class uvm_get_peek_imp #(type T=int, type IMP=int) extends uvm_port_base #(uvm_tlm_if_base #(T,T)); `UVM_IMP_COMMON(`UVM_TLM_GET_PEEK_MASK,"uvm_get_peek_imp",IMP) `UVM_GET_PEEK_IMP (m_imp, T, t) endclass //------------------------------------------------------------------------------ // // CLASS -- NODOCS -- uvm_*_imp #(REQ, RSP, IMP, REQ_IMP, RSP_IMP) // // Bidirectional implementation (imp) port classes--An imp port provides access // to an implementation of the associated interface to all connected ~ports~ and // ~exports~. Each imp port instance ~must~ be connected to the component instance // that implements the associated interface, typically the imp port's parent. // All other connections-- e.g. to other ports and exports-- are prohibited. // // The interface represented by the asterisk is any of the following // //| blocking_transport //| nonblocking_transport //| transport //| //| blocking_master //| nonblocking_master //| master //| //| blocking_slave //| nonblocking_slave //| slave // // Type parameters // // REQ - Request transaction type // // RSP - Response transaction type // // IMP - Component type that implements the interface methods, typically the // the parent of this imp port. // // REQ_IMP - Component type that implements the request side of the // interface. Defaults to IMP. For master and slave imps only. // // RSP_IMP - Component type that implements the response side of the // interface. Defaults to IMP. For master and slave imps only. // // The interface methods are implemented in a component of type ~IMP~, a handle // to which is passed in a constructor argument. The imp port delegates all // interface calls to this component. // // The master and slave imps have two modes of operation. // // - A single component of type IMP implements the entire interface for // both requests and responses. // // - Two sibling components of type REQ_IMP and RSP_IMP implement the request // and response interfaces, respectively. In this case, the IMP parent // instantiates this imp port ~and~ the REQ_IMP and RSP_IMP components. // // The second mode is needed when a component instantiates more than one imp // port, as in the channel. // //------------------------------------------------------------------------------ // Function -- NODOCS -- new // // Creates a new bidirectional imp port with the given ~name~ and ~parent~. // The ~parent~, whose type is specified by ~IMP~ type parameter, // must implement the interface associated with this port. // // Transport imp constructor // //| function new(string name, IMP imp) // // Master and slave imp constructor // // The optional ~req_imp~ and ~rsp_imp~ arguments, available to master and // slave imp ports, allow the requests and responses to be handled by different // subcomponents. If they are specified, they must point to the underlying // component that implements the request and response methods, respectively. // //| function new(string name, IMP imp, //| REQ_IMP req_imp=imp, RSP_IMP rsp_imp=imp) class uvm_blocking_master_imp #(type REQ=int, type RSP=REQ, type IMP=int, type REQ_IMP=IMP, type RSP_IMP=IMP) extends uvm_port_base #(uvm_tlm_if_base #(REQ, RSP)); typedef IMP this_imp_type; typedef REQ_IMP this_req_type; typedef RSP_IMP this_rsp_type; `UVM_MS_IMP_COMMON(`UVM_TLM_BLOCKING_MASTER_MASK,"uvm_blocking_master_imp") `UVM_BLOCKING_PUT_IMP (m_req_imp, REQ, t) `UVM_BLOCKING_GET_PEEK_IMP (m_rsp_imp, RSP, t) endclass class uvm_nonblocking_master_imp #(type REQ=int, type RSP=REQ, type IMP=int, type REQ_IMP=IMP, type RSP_IMP=IMP) extends uvm_port_base #(uvm_tlm_if_base #(REQ, RSP)); typedef IMP this_imp_type; typedef REQ_IMP this_req_type; typedef RSP_IMP this_rsp_type; `UVM_MS_IMP_COMMON(`UVM_TLM_NONBLOCKING_MASTER_MASK,"uvm_nonblocking_master_imp") `UVM_NONBLOCKING_PUT_IMP (m_req_imp, REQ, t) `UVM_NONBLOCKING_GET_PEEK_IMP (m_rsp_imp, RSP, t) endclass class uvm_master_imp #(type REQ=int, type RSP=REQ, type IMP=int, type REQ_IMP=IMP, type RSP_IMP=IMP) extends uvm_port_base #(uvm_tlm_if_base #(REQ, RSP)); typedef IMP this_imp_type; typedef REQ_IMP this_req_type; typedef RSP_IMP this_rsp_type; `UVM_MS_IMP_COMMON(`UVM_TLM_MASTER_MASK,"uvm_master_imp") `UVM_PUT_IMP (m_req_imp, REQ, t) `UVM_GET_PEEK_IMP (m_rsp_imp, RSP, t) endclass class uvm_blocking_slave_imp #(type REQ=int, type RSP=REQ, type IMP=int, type REQ_IMP=IMP, type RSP_IMP=IMP) extends uvm_port_base #(uvm_tlm_if_base #(RSP, REQ)); typedef IMP this_imp_type; typedef REQ_IMP this_req_type; typedef RSP_IMP this_rsp_type; `UVM_MS_IMP_COMMON(`UVM_TLM_BLOCKING_SLAVE_MASK,"uvm_blocking_slave_imp") `UVM_BLOCKING_PUT_IMP (m_rsp_imp, RSP, t) `UVM_BLOCKING_GET_PEEK_IMP (m_req_imp, REQ, t) endclass class uvm_nonblocking_slave_imp #(type REQ=int, type RSP=REQ, type IMP=int, type REQ_IMP=IMP, type RSP_IMP=IMP) extends uvm_port_base #(uvm_tlm_if_base #(RSP, REQ)); typedef IMP this_imp_type; typedef REQ_IMP this_req_type; typedef RSP_IMP this_rsp_type; `UVM_MS_IMP_COMMON(`UVM_TLM_NONBLOCKING_SLAVE_MASK,"uvm_nonblocking_slave_imp") `UVM_NONBLOCKING_PUT_IMP (m_rsp_imp, RSP, t) `UVM_NONBLOCKING_GET_PEEK_IMP (m_req_imp, REQ, t) endclass class uvm_slave_imp #(type REQ=int, type RSP=REQ, type IMP=int, type REQ_IMP=IMP, type RSP_IMP=IMP) extends uvm_port_base #(uvm_tlm_if_base #(RSP, REQ)); typedef IMP this_imp_type; typedef REQ_IMP this_req_type; typedef RSP_IMP this_rsp_type; `UVM_MS_IMP_COMMON(`UVM_TLM_SLAVE_MASK,"uvm_slave_imp") `UVM_PUT_IMP (m_rsp_imp, RSP, t) `UVM_GET_PEEK_IMP (m_req_imp, REQ, t) endclass class uvm_blocking_transport_imp #(type REQ=int, type RSP=REQ, type IMP=int) extends uvm_port_base #(uvm_tlm_if_base #(REQ, RSP)); `UVM_IMP_COMMON(`UVM_TLM_BLOCKING_TRANSPORT_MASK,"uvm_blocking_transport_imp",IMP) `UVM_BLOCKING_TRANSPORT_IMP (m_imp, REQ, RSP, req, rsp) endclass class uvm_nonblocking_transport_imp #(type REQ=int, type RSP=REQ, type IMP=int) extends uvm_port_base #(uvm_tlm_if_base #(REQ, RSP)); `UVM_IMP_COMMON(`UVM_TLM_NONBLOCKING_TRANSPORT_MASK,"uvm_nonblocking_transport_imp",IMP) `UVM_NONBLOCKING_TRANSPORT_IMP (m_imp, REQ, RSP, req, rsp) endclass class uvm_transport_imp #(type REQ=int, type RSP=REQ, type IMP=int) extends uvm_port_base #(uvm_tlm_if_base #(REQ, RSP)); `UVM_IMP_COMMON(`UVM_TLM_TRANSPORT_MASK,"uvm_transport_imp",IMP) `UVM_BLOCKING_TRANSPORT_IMP (m_imp, REQ, RSP, req, rsp) `UVM_NONBLOCKING_TRANSPORT_IMP (m_imp, REQ, RSP, req, rsp) endclass