scc 2025.09
SystemC components library
tlm2_pv_av.h
1/*******************************************************************************
2 * Copyright 2020 MINRES Technologies GmbH
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *******************************************************************************/
16
17#ifndef _TLM_TLM2_PV_AV_H_
18#define _TLM_TLM2_PV_AV_H_
19
20#include <memory>
21#include <tlm>
22#include <util/ities.h>
23
25namespace tlm {
27namespace scc {
36template <unsigned int BUSWIDTH = 32, typename TYPES = tlm_base_protocol_types, int N = 1,
37 sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND,
38 typename TSOCKET_TYPE = tlm::tlm_target_socket<BUSWIDTH, TYPES, N, POL>,
39 typename ISOCKET_TYPE = tlm::tlm_initiator_socket<BUSWIDTH, TYPES, N, POL>>
40class tlm2_pv_av_target_adapter : public sc_core::sc_module,
41 public tlm::tlm_fw_transport_if<TYPES>,
42 public tlm::tlm_bw_transport_if<TYPES> {
43public:
44 using tlm_payload_type = typename TYPES::tlm_payload_type;
45 using tlm_phase_type = typename TYPES::tlm_phase_type;
46 using target_socket_type = TSOCKET_TYPE;
47 using initiator_socket_type = ISOCKET_TYPE;
51 target_socket_type tsck{"tsck"};
57 : tlm2_pv_av_target_adapter(sc_core::sc_gen_unique_name("tlm_pv_av_split")) {}
58
63 tlm2_pv_av_target_adapter(sc_core::sc_module_name const& nm)
64 : sc_core::sc_module(nm) {
65 tsck.bind(*this);
66 }
67
71 void bind_pv(target_socket_type& tsck) {
72 pv_isck = util::make_unique<initiator_socket_type>(sc_core::sc_gen_unique_name("pv_isck"));
73 pv_isck->bind(*this);
74 pv_isck->bind(tsck);
75 }
76
80 void bind_av(TSOCKET_TYPE& tsck) {
81 av_isck = util::make_unique<initiator_socket_type>(sc_core::sc_gen_unique_name("av_isck"));
82 av_isck->bind(*this);
83 av_isck->bind(tsck);
84 }
85
88 virtual ~tlm2_pv_av_target_adapter() = default;
89
90private:
91 tlm::tlm_sync_enum nb_transport_fw(tlm_payload_type& trans, tlm_phase_type& phase, sc_core::sc_time& t) {
92 if(av_isck)
93 return (*av_isck)->nb_transport_fw(trans, phase, t);
94 trans.set_response_status(tlm::TLM_GENERIC_ERROR_RESPONSE);
95 return tlm::TLM_COMPLETED;
96 };
97
98 void b_transport(tlm_payload_type& trans, sc_core::sc_time& t) {
99 if(pv_isck)
100 (*pv_isck)->b_transport(trans, t);
101 else
102 trans.set_response_status(tlm::TLM_GENERIC_ERROR_RESPONSE);
103 }
104
105 bool get_direct_mem_ptr(tlm_payload_type& trans, tlm_dmi& dmi_data) {
106 if(pv_isck)
107 return (*pv_isck)->get_direct_mem_ptr(trans, dmi_data);
108 trans.set_response_status(tlm::TLM_GENERIC_ERROR_RESPONSE);
109 trans.set_dmi_allowed(false);
110 return false;
111 }
112
113 unsigned int transport_dbg(tlm_payload_type& trans) {
114 if(pv_isck)
115 return (*pv_isck)->transport_dbg(trans);
116 trans.set_response_status(tlm::TLM_GENERIC_ERROR_RESPONSE);
117 return 0;
118 }
119
120 tlm::tlm_sync_enum nb_transport_bw(tlm_payload_type& trans, tlm_phase_type& phase, sc_core::sc_time& t) {
121 return tsck->nb_transport_bw(trans, phase, t);
122 }
123
124 void invalidate_direct_mem_ptr(sc_dt::uint64 start_range, sc_dt::uint64 end_range) {
125 tsck->invalidate_direct_mem_ptr(start_range, end_range);
126 }
127
128 std::unique_ptr<initiator_socket_type> pv_isck;
129 std::unique_ptr<initiator_socket_type> av_isck;
130};
131
139
140template <unsigned int BUSWIDTH = 32, typename TYPES = tlm_base_protocol_types, int N = 1,
141 sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND,
142 typename TSOCKET_TYPE = tlm::tlm_target_socket<BUSWIDTH, TYPES, N, POL>,
143 typename ISOCKET_TYPE = tlm::tlm_initiator_socket<BUSWIDTH, TYPES, N, POL>>
144class tlm2_pv_av_initiator_adapter : public sc_core::sc_module,
145 public tlm::tlm_fw_transport_if<TYPES>,
146 public tlm::tlm_bw_transport_if<TYPES> {
147public:
148 using tlm_payload_type = typename TYPES::tlm_payload_type;
149 using tlm_phase_type = typename TYPES::tlm_phase_type;
150 using target_socket_type = TSOCKET_TYPE;
151 using initiator_socket_type = ISOCKET_TYPE;
155 initiator_socket_type isck{"isck"};
161 : tlm2_pv_av_initiator_adapter(sc_core::sc_gen_unique_name("tlm_pv_av_split")) {}
162
167 tlm2_pv_av_initiator_adapter(sc_core::sc_module_name const& nm)
168 : sc_core::sc_module(nm) {
169 isck.bind(*this);
170 }
171
175 void bind_pv(initiator_socket_type& isck) {
176 pv_tsck = util::make_unique<target_socket_type>(sc_core::sc_gen_unique_name("pv_tsck"));
177 pv_tsck->bind(*this);
178 isck(*pv_tsck);
179 }
180
184 void bind_av(initiator_socket_type& isck) {
185 av_tsck = util::make_unique<target_socket_type>(sc_core::sc_gen_unique_name("av_tsck"));
186 av_tsck->bind(*this);
187 isck(*av_tsck);
188 }
189
192 virtual ~tlm2_pv_av_initiator_adapter() = default;
193
194private:
195 tlm::tlm_sync_enum nb_transport_fw(tlm_payload_type& trans, tlm_phase_type& phase, sc_core::sc_time& t) {
196 return isck->nb_transport_fw(trans, phase, t);
197 };
198
199 void b_transport(tlm_payload_type& trans, sc_core::sc_time& t) { isck->b_transport(trans, t); }
200
201 bool get_direct_mem_ptr(tlm_payload_type& trans, tlm_dmi& dmi_data) { return isck->get_direct_mem_ptr(trans, dmi_data); }
202
203 unsigned int transport_dbg(tlm_payload_type& trans) { return isck->transport_dbg(trans); }
204
205 tlm::tlm_sync_enum nb_transport_bw(tlm_payload_type& trans, tlm_phase_type& phase, sc_core::sc_time& t) {
206 if(av_tsck)
207 return (*av_tsck)->nb_transport_bw(trans, phase, t);
208 trans.set_response_status(tlm::TLM_GENERIC_ERROR_RESPONSE);
209 return tlm::TLM_COMPLETED;
210 }
211
212 void invalidate_direct_mem_ptr(sc_dt::uint64 start_range, sc_dt::uint64 end_range) {
213 if(pv_tsck)
214 (*pv_tsck)->invalidate_direct_mem_ptr(start_range, end_range);
215 }
216
217 std::unique_ptr<target_socket_type> pv_tsck{};
218 std::unique_ptr<target_socket_type> av_tsck{};
219};
220
221} // namespace scc
222} /* namespace tlm */
223
224#endif /* OSCI_LIB_SCC_INCL_TLM_TLM2_PV_AV_TARGET_ADAPTER_H_ */
void bind_pv(initiator_socket_type &isck)
Definition tlm2_pv_av.h:175
virtual ~tlm2_pv_av_initiator_adapter()=default
tlm2_pv_av_initiator_adapter(sc_core::sc_module_name const &nm)
Definition tlm2_pv_av.h:167
void bind_av(initiator_socket_type &isck)
Definition tlm2_pv_av.h:184
tlm2_pv_av_target_adapter(sc_core::sc_module_name const &nm)
Definition tlm2_pv_av.h:63
virtual ~tlm2_pv_av_target_adapter()=default
void bind_pv(target_socket_type &tsck)
Definition tlm2_pv_av.h:71
void bind_av(TSOCKET_TYPE &tsck)
Definition tlm2_pv_av.h:80
SCC TLM utilities.
Definition axis_tlm.h:56
SystemC TLM.
Definition dmi_mgr.h:19