112027Sjungma@eit.uni-kl.de/*****************************************************************************
212027Sjungma@eit.uni-kl.de
312027Sjungma@eit.uni-kl.de  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412027Sjungma@eit.uni-kl.de  more contributor license agreements.  See the NOTICE file distributed
512027Sjungma@eit.uni-kl.de  with this work for additional information regarding copyright ownership.
612027Sjungma@eit.uni-kl.de  Accellera licenses this file to you under the Apache License, Version 2.0
712027Sjungma@eit.uni-kl.de  (the "License"); you may not use this file except in compliance with the
812027Sjungma@eit.uni-kl.de  License.  You may obtain a copy of the License at
912027Sjungma@eit.uni-kl.de
1012027Sjungma@eit.uni-kl.de    http://www.apache.org/licenses/LICENSE-2.0
1112027Sjungma@eit.uni-kl.de
1212027Sjungma@eit.uni-kl.de  Unless required by applicable law or agreed to in writing, software
1312027Sjungma@eit.uni-kl.de  distributed under the License is distributed on an "AS IS" BASIS,
1412027Sjungma@eit.uni-kl.de  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512027Sjungma@eit.uni-kl.de  implied.  See the License for the specific language governing
1612027Sjungma@eit.uni-kl.de  permissions and limitations under the License.
1712027Sjungma@eit.uni-kl.de
1812027Sjungma@eit.uni-kl.de *****************************************************************************/
1912027Sjungma@eit.uni-kl.de
2012027Sjungma@eit.uni-kl.de#ifndef __TLM_FW_BW_IFS_H__
2112027Sjungma@eit.uni-kl.de#define __TLM_FW_BW_IFS_H__
2212027Sjungma@eit.uni-kl.de
2312027Sjungma@eit.uni-kl.de#include <systemc>
2412027Sjungma@eit.uni-kl.de#include "tlm_core/tlm_2/tlm_generic_payload/tlm_generic_payload.h"
2512027Sjungma@eit.uni-kl.de#include "tlm_core/tlm_2/tlm_2_interfaces/tlm_dmi.h"
2612027Sjungma@eit.uni-kl.de
2712027Sjungma@eit.uni-kl.denamespace tlm {
2812027Sjungma@eit.uni-kl.de
2912027Sjungma@eit.uni-kl.deenum tlm_sync_enum { TLM_ACCEPTED, TLM_UPDATED, TLM_COMPLETED };
3012027Sjungma@eit.uni-kl.de
3112027Sjungma@eit.uni-kl.de////////////////////////////////////////////////////////////////////////////
3212027Sjungma@eit.uni-kl.de// Basic interfaces
3312027Sjungma@eit.uni-kl.de////////////////////////////////////////////////////////////////////////////
3412027Sjungma@eit.uni-kl.detemplate <typename TRANS = tlm_generic_payload,
3512027Sjungma@eit.uni-kl.de          typename PHASE = tlm_phase>
3612027Sjungma@eit.uni-kl.declass tlm_fw_nonblocking_transport_if : public virtual sc_core::sc_interface {
3712027Sjungma@eit.uni-kl.depublic:
3812027Sjungma@eit.uni-kl.de  virtual tlm_sync_enum nb_transport_fw(TRANS& trans,
3912027Sjungma@eit.uni-kl.de                                        PHASE& phase,
4012027Sjungma@eit.uni-kl.de                                        sc_core::sc_time& t) = 0;
4112027Sjungma@eit.uni-kl.de};
4212027Sjungma@eit.uni-kl.de
4312027Sjungma@eit.uni-kl.detemplate <typename TRANS = tlm_generic_payload,
4412027Sjungma@eit.uni-kl.de          typename PHASE = tlm_phase>
4512027Sjungma@eit.uni-kl.declass tlm_bw_nonblocking_transport_if : public virtual sc_core::sc_interface {
4612027Sjungma@eit.uni-kl.depublic:
4712027Sjungma@eit.uni-kl.de  virtual tlm_sync_enum nb_transport_bw(TRANS& trans,
4812027Sjungma@eit.uni-kl.de                                        PHASE& phase,
4912027Sjungma@eit.uni-kl.de                                        sc_core::sc_time& t) = 0;
5012027Sjungma@eit.uni-kl.de};
5112027Sjungma@eit.uni-kl.de
5212027Sjungma@eit.uni-kl.detemplate <typename TRANS = tlm_generic_payload>
5312027Sjungma@eit.uni-kl.declass tlm_blocking_transport_if : public virtual sc_core::sc_interface {
5412027Sjungma@eit.uni-kl.depublic:
5512027Sjungma@eit.uni-kl.de  virtual void b_transport(TRANS& trans,
5612027Sjungma@eit.uni-kl.de                           sc_core::sc_time& t) = 0;
5712027Sjungma@eit.uni-kl.de};
5812027Sjungma@eit.uni-kl.de
5912027Sjungma@eit.uni-kl.de//////////////////////////////////////////////////////////////////////////
6012027Sjungma@eit.uni-kl.de// DMI interfaces for getting and invalidating DMI pointers:
6112027Sjungma@eit.uni-kl.de//////////////////////////////////////////////////////////////////////////
6212027Sjungma@eit.uni-kl.de
6312027Sjungma@eit.uni-kl.de// The semantics of the forward interface are as follows:
6412027Sjungma@eit.uni-kl.de//
6512027Sjungma@eit.uni-kl.de// - An initiator that wants to get direct access to a target's memory region
6612027Sjungma@eit.uni-kl.de//   can call the get_direct_mem_ptr method with the 'trans' parameter set to
6712027Sjungma@eit.uni-kl.de//   the address that it wants to gain access to. It sets the trans.m_command
6812027Sjungma@eit.uni-kl.de//   to specify if the initiator intended use (read or write)
6912027Sjungma@eit.uni-kl.de//   to the target's DMI region. The initiator is responsible for calling the
7012027Sjungma@eit.uni-kl.de//   method with a freshly initialized tlm_dmi object either by using a newly
7112027Sjungma@eit.uni-kl.de//   constructed object, or by calling an existing object's init() method.
7212027Sjungma@eit.uni-kl.de// - Although a reference to a complete 'TRANS' type is passed to the get_
7312027Sjungma@eit.uni-kl.de//   direct_mem_ptr call, only the address command, and extension fields are of
7412027Sjungma@eit.uni-kl.de//   interest in most cases.
7512027Sjungma@eit.uni-kl.de// - Read and write ranges are not necessarily identical. If they are, a target
7612027Sjungma@eit.uni-kl.de//   can specify that the range is valid for all accesses with the tlm_data
7712027Sjungma@eit.uni-kl.de//   m_type attribute in the.
7812027Sjungma@eit.uni-kl.de// - The interconnect, if any, needs to decode the address and forward the
7912027Sjungma@eit.uni-kl.de//   call to the corresponding target. It needs to handle the address exactly
8012027Sjungma@eit.uni-kl.de//   as the target would expect on a transaction call, e.g. mask the address
8112027Sjungma@eit.uni-kl.de//   according to the target's address width.
8212027Sjungma@eit.uni-kl.de// - If the target supports DMI access for the given address, it sets the
8312027Sjungma@eit.uni-kl.de//   data fields in the DMI struct and returns true.
8412027Sjungma@eit.uni-kl.de// - If a target does not support DMI access it needs to return false.
8512027Sjungma@eit.uni-kl.de//   The target can either set the correct address range in the DMI struct
8612027Sjungma@eit.uni-kl.de//   to indicate the memory region where DMI is disallowed, or it can specify
8712027Sjungma@eit.uni-kl.de//   the complete address range if it doesn't know it's memory range. In this
8812027Sjungma@eit.uni-kl.de//   case the interconnect is responsible for clipping the address range to
8912027Sjungma@eit.uni-kl.de//   the correct range that the target serves.
9012027Sjungma@eit.uni-kl.de// - The interconnect must always translate the addresses to the initiator's
9112027Sjungma@eit.uni-kl.de//   address space. This must be the inverse operation of what the
9212027Sjungma@eit.uni-kl.de//   interconnect needed to do when forwarding the call. In case the
9312027Sjungma@eit.uni-kl.de//   component wants to change any member of the tlm_dmi object, e.g. for
9412027Sjungma@eit.uni-kl.de//   its own latency to the target's latency, it must only do so *after* the
9512027Sjungma@eit.uni-kl.de//   target has been called. The target is always allowed to overwrite all
9612027Sjungma@eit.uni-kl.de//   values in the tlm_dmi object.
9712027Sjungma@eit.uni-kl.de// - In case the slave returned with an invalid region the bus/interconnect
9812027Sjungma@eit.uni-kl.de//   must fill in the complete address region for the particular slave in the
9912027Sjungma@eit.uni-kl.de//   DMI data structure.
10012027Sjungma@eit.uni-kl.de//
10112027Sjungma@eit.uni-kl.de// DMI hint optimization:
10212027Sjungma@eit.uni-kl.de//
10312027Sjungma@eit.uni-kl.de// Initiators may use the DMI hint in the tlm_generic_payload to avoid
10412027Sjungma@eit.uni-kl.de// unnecessary DMI attempts. The recommended sequence of interface
10512027Sjungma@eit.uni-kl.de// method calls would be:
10612027Sjungma@eit.uni-kl.de//
10712027Sjungma@eit.uni-kl.de// - The initiator first tries to check if it has a valid DMI region for the
10812027Sjungma@eit.uni-kl.de//   address that it wants to access next.
10912027Sjungma@eit.uni-kl.de// - If not, it performs a normal transaction.
11012027Sjungma@eit.uni-kl.de// - If the DMI hint in this transaction is true, the initiator can try and
11112027Sjungma@eit.uni-kl.de//   get the DMI region.
11212027Sjungma@eit.uni-kl.de//
11312027Sjungma@eit.uni-kl.de// Note that the DMI hint optimization is completely optional and every
11412027Sjungma@eit.uni-kl.de// initiator model is free to ignore the DMI hint. However, a target is
11512027Sjungma@eit.uni-kl.de// required to set the DMI hint to true if a DMI request on the given address
11612027Sjungma@eit.uni-kl.de// with the given transaction type (read or write) would have succeeded.
11712027Sjungma@eit.uni-kl.de
11812027Sjungma@eit.uni-kl.detemplate <typename TRANS = tlm_generic_payload>
11912027Sjungma@eit.uni-kl.declass tlm_fw_direct_mem_if : public virtual sc_core::sc_interface
12012027Sjungma@eit.uni-kl.de{
12112027Sjungma@eit.uni-kl.depublic:
12212027Sjungma@eit.uni-kl.de  virtual bool get_direct_mem_ptr(TRANS& trans,
12312027Sjungma@eit.uni-kl.de                                  tlm_dmi&  dmi_data) = 0;
12412027Sjungma@eit.uni-kl.de};
12512027Sjungma@eit.uni-kl.de
12612027Sjungma@eit.uni-kl.de// The semantics of the backwards call is as follows:
12712027Sjungma@eit.uni-kl.de//
12812027Sjungma@eit.uni-kl.de// - An interconnect component or a target is required to invalidate all
12912027Sjungma@eit.uni-kl.de//   affected DMI regions whenever any change in the regions take place.
13012027Sjungma@eit.uni-kl.de//   The exact rule is that a component must invalidate all those DMI regions
13112027Sjungma@eit.uni-kl.de//   that it already reported, if it would answer the same DMI request
13212027Sjungma@eit.uni-kl.de//   with any member of the tlm_dmi data structure set differently.
13312027Sjungma@eit.uni-kl.de// - An interconnect component must forward the invalidate_direct_mem_ptr call
13412027Sjungma@eit.uni-kl.de//   to all initiators that could potentially have a DMI pointer to the region
13512027Sjungma@eit.uni-kl.de//   specified in the method arguments. A safe implementation is to call
13612027Sjungma@eit.uni-kl.de//   every attached initiator.
13712027Sjungma@eit.uni-kl.de// - An interconnect component must transform the address region of an
13812027Sjungma@eit.uni-kl.de//   incoming invalidate_direct_mem_ptr to the corresponding address space
13912027Sjungma@eit.uni-kl.de//   for the initiators. Basically, this is the same address transformation
14012027Sjungma@eit.uni-kl.de//   that the interconnect does on the DMI ranges on the forward direction.
14112027Sjungma@eit.uni-kl.de// - Each initiator must check if it has a pointer to the given region and
14212027Sjungma@eit.uni-kl.de//   throw this away. It is recommended that the initiator throws away all DMI
14312027Sjungma@eit.uni-kl.de//   regions that have any overlap with the given regions, but this is not a
14412027Sjungma@eit.uni-kl.de//   hard requirement.
14512027Sjungma@eit.uni-kl.de//
14612027Sjungma@eit.uni-kl.de// - A full DMI pointer invalidation, e.g. for a bus remap can be signaled
14712027Sjungma@eit.uni-kl.de//   by setting the range: 0x0 - 0xffffffffffffffffull = (sc_dt::uint64)-1
14812027Sjungma@eit.uni-kl.de// - An initiator must throw away all DMI pointers in this case.
14912027Sjungma@eit.uni-kl.de//
15012027Sjungma@eit.uni-kl.de// - Under no circumstances a model is allowed to call the get_direct_mem_ptr
15112027Sjungma@eit.uni-kl.de//   from within the invalidate_direct_mem_ptr method, directly or indirectly.
15212027Sjungma@eit.uni-kl.de//
15312027Sjungma@eit.uni-kl.declass tlm_bw_direct_mem_if : public virtual sc_core::sc_interface
15412027Sjungma@eit.uni-kl.de{
15512027Sjungma@eit.uni-kl.depublic:
15612027Sjungma@eit.uni-kl.de  virtual void invalidate_direct_mem_ptr(sc_dt::uint64 start_range,
15712027Sjungma@eit.uni-kl.de                                         sc_dt::uint64 end_range) = 0;
15812027Sjungma@eit.uni-kl.de};
15912027Sjungma@eit.uni-kl.de
16012027Sjungma@eit.uni-kl.de/////////////////////////////////////////////////////////////////////
16112027Sjungma@eit.uni-kl.de// debug interface for memory access
16212027Sjungma@eit.uni-kl.de/////////////////////////////////////////////////////////////////////
16312027Sjungma@eit.uni-kl.de//
16412027Sjungma@eit.uni-kl.de// This interface can be used to gain access to a targets memory or registers
16512027Sjungma@eit.uni-kl.de// in a non-intrusive manner. No side effects, waits or event notifications
16612027Sjungma@eit.uni-kl.de// must happen in the course of the method.
16712027Sjungma@eit.uni-kl.de//
16812027Sjungma@eit.uni-kl.de// Semantics:
16912027Sjungma@eit.uni-kl.de// - The initiator calls the transport_dbg method with transaction 'trans' as
17012027Sjungma@eit.uni-kl.de//   argument. The commonly used parts of trans for debug are:
17112027Sjungma@eit.uni-kl.de//   . address: The start address that it wants to peek or poke.
17212027Sjungma@eit.uni-kl.de//   . length:  The number of bytes that it requests to read or write.
17312027Sjungma@eit.uni-kl.de//   . command: Indicates a read or write access.
17412027Sjungma@eit.uni-kl.de//   . data:    A pointer to the initiator-allocated data buffer, which must
17512027Sjungma@eit.uni-kl.de//              be at least num_bytes large. The data is always organized in
17612027Sjungma@eit.uni-kl.de//              the endianness of the machine.
17712027Sjungma@eit.uni-kl.de//   . extensions: Any extension that could affect the transaction.
17812027Sjungma@eit.uni-kl.de// - The interconnect, if any, will decode the address and forward the call to
17912027Sjungma@eit.uni-kl.de//   the appropriate target.
18012027Sjungma@eit.uni-kl.de// - The target must return the number of successfully transmitted bytes, where
18112027Sjungma@eit.uni-kl.de//   this number must be <= num_bytes. Thus, a target can safely return 0 if it
18212027Sjungma@eit.uni-kl.de//   does not support debug transactions.
18312027Sjungma@eit.uni-kl.de//
18412027Sjungma@eit.uni-kl.detemplate <typename TRANS = tlm_generic_payload>
18512027Sjungma@eit.uni-kl.declass tlm_transport_dbg_if : public virtual sc_core::sc_interface
18612027Sjungma@eit.uni-kl.de{
18712027Sjungma@eit.uni-kl.depublic:
18812027Sjungma@eit.uni-kl.de  // The return value of defines the number of bytes successfully
18912027Sjungma@eit.uni-kl.de  // transferred.
19012027Sjungma@eit.uni-kl.de  virtual unsigned int transport_dbg(TRANS& trans) = 0;
19112027Sjungma@eit.uni-kl.de};
19212027Sjungma@eit.uni-kl.de
19312027Sjungma@eit.uni-kl.de////////////////////////////////////////////////////////////////////////////
19412027Sjungma@eit.uni-kl.de// Combined interfaces
19512027Sjungma@eit.uni-kl.de////////////////////////////////////////////////////////////////////////////
19612027Sjungma@eit.uni-kl.de
19712027Sjungma@eit.uni-kl.destruct tlm_base_protocol_types
19812027Sjungma@eit.uni-kl.de{
19912027Sjungma@eit.uni-kl.de  typedef tlm_generic_payload tlm_payload_type;
20012027Sjungma@eit.uni-kl.de  typedef tlm_phase tlm_phase_type;
20112027Sjungma@eit.uni-kl.de};
20212027Sjungma@eit.uni-kl.de
20312027Sjungma@eit.uni-kl.de// The forward interface:
20412027Sjungma@eit.uni-kl.detemplate <typename TYPES = tlm_base_protocol_types>
20512027Sjungma@eit.uni-kl.declass tlm_fw_transport_if
20612027Sjungma@eit.uni-kl.de  : public virtual tlm_fw_nonblocking_transport_if<typename TYPES::tlm_payload_type,
20712027Sjungma@eit.uni-kl.de                                                   typename TYPES::tlm_phase_type>
20812027Sjungma@eit.uni-kl.de  , public virtual tlm_blocking_transport_if<typename TYPES::tlm_payload_type>
20912027Sjungma@eit.uni-kl.de  , public virtual tlm_fw_direct_mem_if<typename TYPES::tlm_payload_type>
21012027Sjungma@eit.uni-kl.de  , public virtual tlm_transport_dbg_if<typename TYPES::tlm_payload_type>
21112027Sjungma@eit.uni-kl.de{};
21212027Sjungma@eit.uni-kl.de
21312027Sjungma@eit.uni-kl.de// The backward interface:
21412027Sjungma@eit.uni-kl.detemplate <typename TYPES = tlm_base_protocol_types>
21512027Sjungma@eit.uni-kl.declass tlm_bw_transport_if
21612027Sjungma@eit.uni-kl.de  : public virtual tlm_bw_nonblocking_transport_if<typename TYPES::tlm_payload_type,
21712027Sjungma@eit.uni-kl.de                                                   typename TYPES::tlm_phase_type>
21812027Sjungma@eit.uni-kl.de  , public virtual tlm_bw_direct_mem_if
21912027Sjungma@eit.uni-kl.de{};
22012027Sjungma@eit.uni-kl.de
22112027Sjungma@eit.uni-kl.de} // namespace tlm
22212027Sjungma@eit.uni-kl.de
22312027Sjungma@eit.uni-kl.de#endif /* __TLM_FW_BW_IFS_H__ */
224