diff --git a/src/components/scc/tlm_target.h b/src/components/scc/tlm_target.h index 1e14b0a83..430d3af7c 100644 --- a/src/components/scc/tlm_target.h +++ b/src/components/scc/tlm_target.h @@ -104,9 +104,15 @@ template class private: sc_core::sc_time& clk; + tlm::tlm_generic_payload* current_payload{nullptr}; protected: util::range_lut> socket_map; + template T* get_payload_extendsion() { + if(current_payload) + return current_payload->get_extension(); + return nullptr; + } }; /** * helper structure to define a address range for a socket @@ -192,6 +198,7 @@ void scc::tlm_target::b_tranport_cb(tlm::tlm_gener gp.set_response_status(tlm::TLM_BYTE_ENABLE_ERROR_RESPONSE); } else { gp.set_response_status(tlm::TLM_COMMAND_ERROR_RESPONSE); + current_payload = &gp; switch(gp.get_command()) { case tlm::TLM_READ_COMMAND: if(ra->read(gp.get_data_ptr() + offset, len, (gp.get_address() - base + offset), delay)) @@ -201,7 +208,10 @@ void scc::tlm_target::b_tranport_cb(tlm::tlm_gener if(ra->write(gp.get_data_ptr() + offset, len, (gp.get_address() - base + offset), delay)) gp.set_response_status(tlm::TLM_OK_RESPONSE); break; + case tlm::TLM_IGNORE_COMMAND: + break; } + current_payload = nullptr; } } else { gp.set_response_status(tlm::TLM_ADDRESS_ERROR_RESPONSE); @@ -216,6 +226,7 @@ unsigned int scc::tlm_target::tranport_dbg_cb(tlm: std::tie(ra, base) = socket_map.getEntry(gp.get_address()); if(ra) { if(gp.get_data_length() == ra->size() && gp.get_byte_enable_ptr() == nullptr && gp.get_data_length() == gp.get_streaming_width()) { + current_payload = &gp; if(gp.get_command() == tlm::TLM_READ_COMMAND) { if(ra->read_dbg(gp.get_data_ptr(), gp.get_data_length(), (gp.get_address() - base) / ra->size())) return gp.get_data_length(); @@ -223,6 +234,7 @@ unsigned int scc::tlm_target::tranport_dbg_cb(tlm: if(ra->write_dbg(gp.get_data_ptr(), gp.get_data_length(), (gp.get_address() - base) / ra->size())) return gp.get_data_length(); } + current_payload = nullptr; } } return 0; diff --git a/src/sysc/tlm/scc/tlm_id.h b/src/sysc/tlm/scc/tlm_id.h index 359af552d..5deb74a6f 100644 --- a/src/sysc/tlm/scc/tlm_id.h +++ b/src/sysc/tlm/scc/tlm_id.h @@ -26,7 +26,7 @@ namespace scc { struct tlm_id_extension : public tlm_extension { virtual tlm_extension_base* clone() const { - tlm_id_extension* t = new tlm_id_extension(this->id); + auto* t = new tlm_id_extension(this->id); return t; } virtual void copy_from(tlm_extension_base const& from) { id = static_cast(from).id; } @@ -63,5 +63,17 @@ inline void setId(tlm::tlm_generic_payload& gp, uintptr_t id) { else gp.set_extension(new tlm_id_extension(id)); } + +struct initiator_id_extension : public tlm_extension { + virtual tlm_extension_base* clone() const { + auto* t = new initiator_id_extension(this->id); + return t; + } + virtual void copy_from(tlm_extension_base const& from) {} + initiator_id_extension(uint64_t i) + : id(i) {} + const uint64_t id; +}; + } // namespace scc } // namespace tlm