diff options
Diffstat (limited to 'src/systemc/ext/tlm_core/1/req_rsp/channels/req_rsp_channels')
-rw-r--r-- | src/systemc/ext/tlm_core/1/req_rsp/channels/req_rsp_channels/put_get_imp.h | 115 | ||||
-rw-r--r-- | src/systemc/ext/tlm_core/1/req_rsp/channels/req_rsp_channels/req_rsp_channels.h | 138 |
2 files changed, 253 insertions, 0 deletions
diff --git a/src/systemc/ext/tlm_core/1/req_rsp/channels/req_rsp_channels/put_get_imp.h b/src/systemc/ext/tlm_core/1/req_rsp/channels/req_rsp_channels/put_get_imp.h new file mode 100644 index 000000000..e821573b9 --- /dev/null +++ b/src/systemc/ext/tlm_core/1/req_rsp/channels/req_rsp_channels/put_get_imp.h @@ -0,0 +1,115 @@ +/***************************************************************************** + + Licensed to Accellera Systems Initiative Inc. (Accellera) under one or + more contributor license agreements. See the NOTICE file distributed + with this work for additional information regarding copyright ownership. + Accellera licenses this file to you 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. + + *****************************************************************************/ + +#ifndef \ + __SYSTEMC_EXT_TLM_CORE_1_REQ_RSP_CHANNELS_REQ_RSP_CHANNELS_PUT_GET_IMP_H__ +#define \ + __SYSTEMC_EXT_TLM_CORE_1_REQ_RSP_CHANNELS_REQ_RSP_CHANNELS_PUT_GET_IMP_H__ + +#include "tlm_core/1/req_rsp/interfaces/master_slave_ifs.h" + +namespace tlm +{ + +template <typename PUT_DATA, typename GET_DATA> +class tlm_put_get_imp : private virtual tlm_put_if<PUT_DATA>, + private virtual tlm_get_peek_if<GET_DATA> +{ + public: + tlm_put_get_imp(tlm_put_if<PUT_DATA> &p, tlm_get_peek_if<GET_DATA> &g) : + put_fifo(p), get_fifo(g) + {} + + // Put interface. + void put(const PUT_DATA &t) { put_fifo.put(t); } + bool nb_put(const PUT_DATA &t) { return put_fifo.nb_put(t); } + bool + nb_can_put(tlm_tag<PUT_DATA> *t=nullptr) const + { + return put_fifo.nb_can_put(t); + } + const sc_core::sc_event & + ok_to_put(tlm_tag<PUT_DATA> *t=nullptr) const + { + return put_fifo.ok_to_put(t); + } + + // Get interface. + GET_DATA get(tlm_tag<GET_DATA> * =nullptr) { return get_fifo.get(); } + bool nb_get(GET_DATA &t) { return get_fifo.nb_get(t); } + bool + nb_can_get(tlm_tag<GET_DATA> *t=nullptr) const + { + return get_fifo.nb_can_get(t); + } + + virtual const sc_core::sc_event & + ok_to_get(tlm_tag<GET_DATA> *t=nullptr) const + { + return get_fifo.ok_to_get(t); + } + + // Peek interface. + GET_DATA + peek(tlm_tag<GET_DATA> * =nullptr) const + { + return get_fifo.peek(); + } + bool nb_peek(GET_DATA &t) const { return get_fifo.nb_peek(t); } + bool + nb_can_peek(tlm_tag<GET_DATA> *t=nullptr) const + { + return get_fifo.nb_can_peek(t); + } + + virtual const sc_core::sc_event & + ok_to_peek(tlm_tag<GET_DATA> *t=nullptr) const + { + return get_fifo.ok_to_peek(t); + } + + private: + tlm_put_if<PUT_DATA> &put_fifo; + tlm_get_peek_if<GET_DATA> &get_fifo; +}; + +template <typename REQ, typename RSP> +class tlm_master_imp : private tlm_put_get_imp<REQ, RSP>, + public virtual tlm_master_if<REQ, RSP> +{ + public: + tlm_master_imp(tlm_put_if<REQ> &req, tlm_get_peek_if<RSP> &rsp) : + tlm_put_get_imp<REQ, RSP>(req, rsp) + {} +}; + +template <typename REQ, typename RSP> +class tlm_slave_imp : private tlm_put_get_imp<RSP, REQ>, + public virtual tlm_slave_if<REQ, RSP> +{ + public: + tlm_slave_imp(tlm_get_peek_if<REQ> &req, tlm_put_if<RSP> &rsp) : + tlm_put_get_imp<RSP, REQ>(rsp, req) + {} +}; + +} // namespace tlm + +#endif +/* __SYSTEMC_EXT_TLM_CORE_1_REQ_RSP_CHANNELS_REQ_RSP_CHANNELS_PUT_GET_IMP_H__*/ diff --git a/src/systemc/ext/tlm_core/1/req_rsp/channels/req_rsp_channels/req_rsp_channels.h b/src/systemc/ext/tlm_core/1/req_rsp/channels/req_rsp_channels/req_rsp_channels.h new file mode 100644 index 000000000..321d947ea --- /dev/null +++ b/src/systemc/ext/tlm_core/1/req_rsp/channels/req_rsp_channels/req_rsp_channels.h @@ -0,0 +1,138 @@ +/***************************************************************************** + + Licensed to Accellera Systems Initiative Inc. (Accellera) under one or + more contributor license agreements. See the NOTICE file distributed + with this work for additional information regarding copyright ownership. + Accellera licenses this file to you 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. + + *****************************************************************************/ + +#ifndef __EXT_TLM_CORE_1_REQ_RSP_CHANNELS_REQ_RSP_CHANNELS_REQ_RSP_CHANNELS_H__ +#define __EXT_TLM_CORE_1_REQ_RSP_CHANNELS_REQ_RSP_CHANNELS_REQ_RSP_CHANNELS_H__ + +#include "tlm_core/1/req_rsp/adapters/adapters.h" +#include "tlm_core/1/req_rsp/channels/fifo/fifo.h" +#include "tlm_core/1/req_rsp/channels/req_rsp_channels/put_get_imp.h" + +namespace tlm +{ + +template <typename REQ, typename RSP, typename REQ_CHANNEL=tlm_fifo<REQ>, + typename RSP_CHANNEL=tlm_fifo<RSP>> +class tlm_req_rsp_channel : public sc_core::sc_module +{ + public: + // Uni-directional slave interface. + sc_core::sc_export<tlm_fifo_get_if<REQ>> get_request_export; + sc_core::sc_export<tlm_fifo_put_if<RSP>> put_response_export; + + // Uni-directional master interface. + sc_core::sc_export<tlm_fifo_put_if<REQ>> put_request_export; + sc_core::sc_export<tlm_fifo_get_if<RSP>> get_response_export; + + // Master/slave interfaces. + sc_core::sc_export<tlm_master_if<REQ, RSP>> master_export; + sc_core::sc_export<tlm_slave_if<REQ, RSP>> slave_export; + + tlm_req_rsp_channel(int req_size=1, int rsp_size=1) : + sc_core::sc_module(sc_core::sc_module_name( + sc_core::sc_gen_unique_name("tlm_req_rsp_channel"))), + request_fifo(req_size), response_fifo(rsp_size), + master(request_fifo, response_fifo), + slave(request_fifo, response_fifo) + { + bind_exports(); + } + + tlm_req_rsp_channel(sc_core::sc_module_name module_name, + int req_size=1, int rsp_size=1) : + sc_core::sc_module(module_name), + request_fifo(req_size), response_fifo(rsp_size), + master(request_fifo, response_fifo), + slave(request_fifo, response_fifo) + { + bind_exports(); + } + + private: + void + bind_exports() + { + put_request_export(request_fifo); + get_request_export(request_fifo); + + put_response_export(response_fifo); + get_response_export(response_fifo); + + master_export(master); + slave_export(slave); + } + + protected: + REQ_CHANNEL request_fifo; + RSP_CHANNEL response_fifo; + + tlm_master_imp<REQ, RSP> master; + tlm_slave_imp<REQ, RSP> slave; +}; + +template <typename REQ, typename RSP, + typename REQ_CHANNEL=tlm_fifo<REQ>, + typename RSP_CHANNEL=tlm_fifo<RSP>> +class tlm_transport_channel : public sc_core::sc_module +{ + public: + // Master transport interface. + sc_core::sc_export<tlm_transport_if<REQ, RSP>> target_export; + + // Slave interfaces. + sc_core::sc_export<tlm_fifo_get_if<REQ>> get_request_export; + sc_core::sc_export<tlm_fifo_put_if<RSP>> put_response_export; + + sc_core::sc_export<tlm_slave_if<REQ, RSP>> slave_export; + + tlm_transport_channel() : + sc_core::sc_module(sc_core::sc_module_name( + sc_core::sc_gen_unique_name("transport_channel"))), + target_export("target_export"), req_rsp("req_rsp", 1, 1), t2m("ts2m") + { + do_binding(); + } + + tlm_transport_channel(sc_core::sc_module_name nm) : + sc_core::sc_module(nm), target_export("target_export"), + req_rsp("req_rsp", 1, 1), t2m("tsm") + { + do_binding(); + } + + private: + void + do_binding() + { + target_export(t2m.target_export); + t2m.master_port(req_rsp.master_export); + + get_request_export(req_rsp.get_request_export); + put_response_export(req_rsp.put_response_export); + slave_export(req_rsp.slave_export); + } + + tlm_req_rsp_channel<REQ, RSP, REQ_CHANNEL, RSP_CHANNEL> req_rsp; + tlm_transport_to_master<REQ, RSP> t2m; +}; + +} // namespace tlm + +#endif +/* __EXT_TLM_CORE_1_REQ_RSP_CHANNELS_REQ_RSP_CHANNELS_REQ_RSP_CHANNELS_H__ */ |