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;
16 tlm::tlm_sync_enum SpartaTLMTargetGasket::nb_transport_fw (tlm::tlm_generic_payload &gp,
17 tlm::tlm_phase &phase ,
18 sc_core::sc_time &delay_time )
20 tlm::tlm_sync_enum return_val = tlm::TLM_COMPLETED;
24 std::cout <<
"Info: Gasket: BEGIN_REQ" << std::endl;
29 target_memory_.get_delay(gp, delay_time);
31#ifdef DIRECT_MEMORY_OPERATION
32 delay_time += accept_delay_;
33 response_PEQ_.notify(gp, delay_time);
41 MemoryRequest request = {
42 (gp.get_command() == tlm::TLM_READ_COMMAND ?
43 MemoryRequest::Command::READ : MemoryRequest::Command::WRITE),
57 out_memory_request_.send(request,
getClock()->
58 getCycle(sparta::sparta_sysc_utils::calculateSpartaOffset(
getClock(),
59 delay_time.value())));
62 delay_time = accept_delay_;
67 return_val = tlm::TLM_UPDATED;
71 std::cout <<
"Info: Gasket: END_RESP" << std::endl;
72 return_val = tlm::TLM_COMPLETED;
76 return_val = tlm::TLM_ACCEPTED;
84 void SpartaTLMTargetGasket::forwardMemoryResponse_(
const MemoryRequest &req)
86 std::ostringstream msg;
90 tlm::tlm_phase resp = tlm::BEGIN_RESP;
91 sc_core::sc_time delay = sc_core::SC_ZERO_TIME;
98 auto &gp = *((tlm::tlm_generic_payload *)req.meta_data);
99 gp.set_response_status(tlm::TLM_OK_RESPONSE);
104 auto status = memory_socket_->nb_transport_bw(*((tlm::tlm_generic_payload *)req.meta_data),
110 case tlm::TLM_COMPLETED:
117 case tlm::TLM_ACCEPTED:
124 case tlm::TLM_UPDATED:
126 if (!begin_resp_method_prev_warning_)
128 msg <<
"Target: " << ID_
129 <<
" TLM_UPDATED invalid response to BEGIN_RESP";
130 REPORT_WARNING(filename, __FUNCTION__, msg.str());
133 begin_resp_method_prev_warning_ =
true;
140 if (!begin_resp_method_prev_warning_)
142 msg <<
"Target: " << ID_
143 <<
" undefined return status ";
144 REPORT_WARNING(filename, __FUNCTION__, msg.str());
147 begin_resp_method_prev_warning_ =
true;
152 void SpartaTLMTargetGasket::send_end_request_(
const MemoryRequest & req)
#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.