//----------------------------------------------------------------------
// Copyright 2010-2011 Mentor Graphics Corporation
// Copyright 2010 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.
//----------------------------------------------------------------------
// File: TLM2 Types
// Enum: uvm_tlm_phase_e
//
// Nonblocking transport synchronization state values between
// an initiator and a target.
//
// UNINITIALIZED_PHASE - Defaults for constructor
// BEGIN_REQ - Beginning of request phase
// END_REQ - End of request phase
// BEGIN_RESP - Beginning of response phase
// END_RESP - End of response phase
typedef enum
{
UNINITIALIZED_PHASE,
BEGIN_REQ,
END_REQ,
BEGIN_RESP,
END_RESP
} [docs]uvm_tlm_phase_e;
// Enum: uvm_tlm_sync_e
//
// Pre-defined phase state values for the nonblocking transport
// Base Protocol between an initiator and a target.
//
// UVM_TLM_ACCEPTED - Transaction has been accepted
// UVM_TLM_UPDATED - Transaction has been modified
// UVM_TLM_COMPLETED - Execution of transaction is complete
typedef enum
{
UVM_TLM_ACCEPTED,
UVM_TLM_UPDATED,
UVM_TLM_COMPLETED
} [docs]uvm_tlm_sync_e;
// MACRO: `UVM_TLM_TASK_ERROR
//
// Defines Not-Yet-Implemented TLM tasks
`define UVM_TLM_TASK_ERROR "TLM-2 interface task not implemented"
// MACRO: `UVM_TLM_FUNCTION_ERROR
//
// Defines Not-Yet-Implemented TLM functions
`define UVM_TLM_FUNCTION_ERROR "TLM-2 interface function not implemented"
//
// Class: uvm_tlm_if
//
// Base class type to define the transport functions.
//
// - <nb_transport_fw>
//
// - <nb_transport_bw>
//
// - <b_transport>
//
class [docs]uvm_tlm_if #(type T=uvm_tlm_generic_payload,
type P=uvm_tlm_phase_e);
//----------------------------------------------------------------------
// Group: tlm transport methods
//
// Each of the interface methods take a handle to the transaction to be
// transported and a reference argument for the delay. In addition, the
// nonblocking interfaces take a reference argument for the phase.
//
//----------------------------------------------------------------------
// Function: nb_transport_fw
//
// Forward path call.
// The first call to this method for a transaction marks the initial timing point.
// Every call to this method may mark a timing point in the execution of the
// transaction. The timing annotation argument allows the timing points
// to be offset from the simulation times at which the forward path is used.
// The final timing point of a transaction may be marked by a call
// to <nb_transport_bw> or a return from this or subsequent call to
// nb_transport_fw.
//
// See <TLM2 Interfaces, Ports, Exports and Transport Interfaces Subset>
// for more details on the semantics and rules of the nonblocking
// transport interface.
virtual function uvm_tlm_sync_e [docs]nb_transport_fw(T t, ref P p, input uvm_tlm_time delay);
`uvm_error("nb_transport_fw", `UVM_TLM_FUNCTION_ERROR)
return UVM_TLM_ACCEPTED;
endfunction
// Function: nb_transport_bw
//
// Implementation of the backward path.
// This function MUST be implemented in the INITIATOR component class.
//
// Every call to this method may mark a timing point, including the final
// timing point, in the execution of the transaction.
// The timing annotation argument allows the timing point
// to be offset from the simulation times at which the backward path is used.
// The final timing point of a transaction may be marked by a call
// to <nb_transport_fw> or a return from this or subsequent call to
// nb_transport_bw.
//
// See <TLM2 Interfaces, Ports, Exports and Transport Interfaces Subset>
// for more details on the semantics and rules of the nonblocking
// transport interface.
//
// Example:
//
//| class master extends uvm_component;
// uvm_tlm_nb_initiator_socket #(trans, uvm_tlm_phase_e, this_t) initiator_socket;
//| ...
//| function void build_phase(uvm_phase phase);
// initiator_socket = new("initiator_socket", this, this);
//| endfunction
//|
//| function uvm_tlm_sync_e nb_transport_bw(ref trans t,
//| ref uvm_tlm_phase_e p,
//| input uvm_tlm_time delay);
//| transaction = t;
//| state = p;
//| return UVM_TLM_ACCEPTED;
//| endfunction
//|
//| ...
//| endclass
virtual function uvm_tlm_sync_e [docs]nb_transport_bw(T t, ref P p, input uvm_tlm_time delay);
`uvm_error("nb_transport_bw", `UVM_TLM_FUNCTION_ERROR)
return UVM_TLM_ACCEPTED;
endfunction
// Function: b_transport
//
// Execute a blocking transaction. Once this method returns,
// the transaction is assumed to have been executed. Whether
// that execution is successful or not must be indicated by the
// transaction itself.
//
// The callee may modify or update the transaction object, subject
// to any constraints imposed by the transaction class. The
// initiator may re-use a transaction object from one call to
// the next and across calls to b_transport().
//
// The call to b_transport shall mark the first timing point of the
// transaction. The return from b_transport shall mark the final
// timing point of the transaction. The timing annotation argument
// allows the timing points to be offset from the simulation times
// at which the task call and return are executed.
virtual task [docs]b_transport(T t, uvm_tlm_time delay);
`uvm_error("b_transport", `UVM_TLM_TASK_ERROR)
endtask
endclass