63 cci::cci_broker_handle m_broker;
65 cci::cci_param<bool> p_dump;
66 cci::cci_param<std::string> p_outfile;
72 for (std::string
m : gs::find_object_of_type<gs::gs_memory<BUSWIDTH>>()) {
73 uint64_t addr = gs::cci_get<uint64_t>(m_broker,
m +
".target_socket.address");
74 uint64_t size = gs::cci_get<uint64_t>(m_broker,
m +
".target_socket.size");
75 tlm::tlm_generic_payload
trans;
77 fnamestr <<
m <<
".0x" << std::hex <<
addr <<
"-0x" << (
addr + size) <<
"." << p_outfile.get_value();
83 for (
uint64_t offset = 0; offset < size;) {
85 if (offset +
rsize >= size) {
86 rsize = size - offset;
88 trans.set_command(tlm::TLM_READ_COMMAND);
90 trans.set_data_ptr(data);
93 trans.set_byte_enable_length(0);
95 if (!initiator_socket->get_direct_mem_ptr(
trans, dmi)) {
96 std::stringstream
info;
98 <<
"0x" << std::hex <<
addr + offset;
101 uint64_t size = (dmi.get_end_address() - dmi.get_start_address()) + 1;
113 void b_transport(tlm::tlm_generic_payload&
txn, sc_core::sc_time& delay)
115 unsigned int len =
txn.get_data_length();
116 unsigned char*
ptr =
txn.get_data_ptr();
117 sc_dt::uint64
addr =
txn.get_address();
121 txn.set_response_status(tlm::TLM_OK_RESPONSE);
125 tlm_utils::simple_initiator_socket<memory_dumper<BUSWIDTH>,
BUSWIDTH> initiator_socket;
126 tlm_utils::simple_target_socket<memory_dumper<BUSWIDTH>,
BUSWIDTH> target_socket;
129 : m_broker(cci::cci_get_broker())
130 , p_dump(
"MemoryDumper_trigger",
false)
131 , p_outfile(
"outfile",
"dumpfile")
132 , initiator_socket(
"initiator_socket")
133 , target_socket(
"target_socket")
136 p_dump.register_post_write_callback([
this](
auto ev) { this->dump(); });
137 target_socket.register_b_transport(
this, &memory_dumper::b_transport);