Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/components/scc/tlm_target.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,15 @@ template <unsigned int BUSWIDTH = LT, unsigned int ADDR_UNIT_BITWIDTH = 8> class

private:
sc_core::sc_time& clk;
tlm::tlm_generic_payload* current_payload{nullptr};

protected:
util::range_lut<std::pair<resource_access_if*, uint64_t>> socket_map;
template <typename T> T* get_payload_extendsion() {
if(current_payload)
return current_payload->get_extension<T>();
return nullptr;
}
};
/**
* helper structure to define a address range for a socket
Expand Down Expand Up @@ -192,6 +198,7 @@ void scc::tlm_target<BUSWIDTH, ADDR_UNIT_BITWIDTH>::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))
Expand All @@ -201,7 +208,10 @@ void scc::tlm_target<BUSWIDTH, ADDR_UNIT_BITWIDTH>::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);
Expand All @@ -216,13 +226,15 @@ unsigned int scc::tlm_target<BUSWIDTH, ADDR_UNIT_BITWIDTH>::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();
} else if(gp.get_command() == tlm::TLM_WRITE_COMMAND) {
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;
Expand Down
14 changes: 13 additions & 1 deletion src/sysc/tlm/scc/tlm_id.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ namespace scc {

struct tlm_id_extension : public tlm_extension<tlm_id_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<tlm_id_extension const&>(from).id; }
Expand Down Expand Up @@ -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<tlm_id_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