2#include "SpartaTLMTargetGasket.hpp"
3#include "MemoryRequest.hpp"
4#include "SpartaMemory.hpp"
10namespace sparta_target
13 static const char *filename =
"SpartaTLMTargetGasket.cpp";
15 int SpartaTLMTargetGasket::nextID = 0;
17 tlm::tlm_sync_enum SpartaTLMTargetGasket::nb_transport_fw(tlm::tlm_generic_payload &gp,
18 tlm::tlm_phase &phase,
19 sc_core::sc_time &delay_time)
21 std::ostringstream msg;
23 tlm::tlm_sync_enum return_val = tlm::TLM_COMPLETED;
28 std::cout <<
"Info: Gasket: BEGIN_REQ" << std::endl;
34 target_memory_.get_delay(gp, delay_time);
36 MemoryRequest request = {
37 (gp.get_command() == tlm::TLM_READ_COMMAND ?
38 MemoryRequest::Command::READ :
39 MemoryRequest::Command::WRITE),
51 event_end_req_.preparePayload(request)->
52 schedule(sparta::sparta_sysc_utils::calculateSpartaOffset
53 (
getClock(), accept_delay_.value() + delay_time.value()));
54 return_val = tlm::TLM_ACCEPTED;
60 std::cout <<
"Info: Gasket: END_RESP" << std::endl;
61 return_val = tlm::TLM_COMPLETED;
67 msg <<
"Target: " << ID_
68 <<
" Illegal phase received by target -- END_REQ or BEGIN_RESP";
69 REPORT_FATAL(filename, __FUNCTION__, msg.str());
70 return_val = tlm::TLM_ACCEPTED;
77 return_val = tlm::TLM_ACCEPTED;
78 if (!nb_trans_fw_prev_warning_)
80 msg <<
"Target: " << ID_
81 <<
" unknown phase " << phase <<
" encountered";
82 REPORT_WARNING(filename, __FUNCTION__, msg.str());
83 nb_trans_fw_prev_warning_ =
true;
91 void SpartaTLMTargetGasket::send_end_request_(
const MemoryRequest &req)
93 std::ostringstream msg;
95 tlm::tlm_sync_enum status = tlm::TLM_COMPLETED;
98 msg <<
"Target: " << ID_
99 <<
" starting end-request method";
101 sc_core::sc_time delay = sc_core::SC_ZERO_TIME;
105#ifdef DIRECT_MEMORY_OPERATION
106 delay_time += accept_delay_;
107 response_PEQ_.notify(gp, delay_time);
116 out_memory_request_.send(req,
getClock()->getCycle
117 (sparta::sparta_sysc_utils::calculateSpartaOffset(
getClock(), 0)));
119 tlm::tlm_phase phase = tlm::END_REQ;
120 delay = sc_core::SC_ZERO_TIME;
125 <<
" transaction moved to send-response PEQ "
128 msg <<
"Target: " << ID_
129 <<
" nb_transport_bw (GP, "
130 << report::print(phase) <<
", "
132 REPORT_INFO(filename, __FUNCTION__, msg.str());
134 auto &gp = *((tlm::tlm_generic_payload *)req.meta_data);
135 gp.set_response_status(tlm::TLM_OK_RESPONSE);
139 status = memory_socket_->nb_transport_bw(gp, phase, delay);
142 msg <<
"Target: " << ID_
143 <<
" " << report::print(status) <<
" (GP, "
144 << report::print(phase) <<
", "
146 REPORT_INFO(filename, __FUNCTION__, msg.str());
151 case tlm::TLM_ACCEPTED:
159 case tlm::TLM_COMPLETED:
161 msg <<
"Target: " << ID_
162 <<
" TLM_COMPLETED invalid response to END_REQ" << endl
163 <<
" Initiator must receive data before ending transaction";
164 REPORT_FATAL(filename, __FUNCTION__, msg.str());
169 case tlm::TLM_UPDATED:
171 msg <<
"Target: " << ID_
172 <<
" TLM_UPDATED invalid response to END_REQ" << endl
173 <<
" Initiator must receive data before updating transaction";
174 REPORT_FATAL(filename, __FUNCTION__, msg.str());
182 msg <<
"Target: " << ID_
183 <<
" Illegal return status";
184 REPORT_FATAL(filename, __FUNCTION__, msg.str());
191 void SpartaTLMTargetGasket::forwardMemoryResponse_(
const MemoryRequest &req)
193 std::ostringstream msg;
197 tlm::tlm_phase resp = tlm::BEGIN_RESP;
198 sc_core::sc_time delay = sc_core::SC_ZERO_TIME;
205 auto &gp = *((tlm::tlm_generic_payload *)req.meta_data);
206 gp.set_response_status(tlm::TLM_OK_RESPONSE);
211 auto status = memory_socket_->nb_transport_bw(*((tlm::tlm_generic_payload *)req.meta_data),
217 case tlm::TLM_COMPLETED:
224 case tlm::TLM_ACCEPTED:
231 case tlm::TLM_UPDATED:
233 if (!begin_resp_method_prev_warning_)
235 msg <<
"Target: " << ID_
236 <<
" TLM_UPDATED invalid response to BEGIN_RESP";
237 REPORT_WARNING(filename, __FUNCTION__, msg.str());
240 begin_resp_method_prev_warning_ =
true;
247 if (!begin_resp_method_prev_warning_)
249 msg <<
"Target: " << ID_
250 <<
" undefined return status ";
251 REPORT_WARNING(filename, __FUNCTION__, msg.str());
254 begin_resp_method_prev_warning_ =
true;
#define SPARTA_EXPECT_FALSE(x)
A macro for hinting to the compiler a particular condition should be considered most likely false.
Glue code that connect the Sparta scheduler to SystemC.
const Clock * getClock() const
log::MessageSource info_logger_
Default info logger.