|
| 1 | +#ifndef PACKET_GENERATOR_TLM_CPP |
| 2 | +#define PACKET_GENERATOR_TLM_CPP |
| 3 | +#include <systemc.h> |
| 4 | +using namespace sc_core; |
| 5 | +using namespace sc_dt; |
| 6 | +using namespace std; |
| 7 | + |
| 8 | +#include <tlm.h> |
| 9 | +#include <tlm_utils/simple_initiator_socket.h> |
| 10 | +#include <tlm_utils/simple_target_socket.h> |
| 11 | +#include <tlm_utils/peq_with_cb_and_phase.h> |
| 12 | + |
| 13 | +#include "packetGenerator_tlm.hpp" |
| 14 | + |
| 15 | +#include "common_func.hpp" |
| 16 | + |
| 17 | +#include "address_map.hpp" |
| 18 | + |
| 19 | +void packetGenerator_tlm::do_when_read_transaction(unsigned char*& data, unsigned int data_length, sc_dt::uint64 address){ |
| 20 | + dbgimgtarmodprint(use_prints, "Calling do_when_read_transaction"); |
| 21 | + |
| 22 | + if ((address = ETHERNET_CHECK_DONE) && (data_length == 1)) |
| 23 | + { |
| 24 | + if (packetGenerator::tmp_data_out_valid == true) |
| 25 | + { |
| 26 | + *data = 1; |
| 27 | + } |
| 28 | + else |
| 29 | + { |
| 30 | + *data = 0; |
| 31 | + } |
| 32 | + } |
| 33 | +} |
| 34 | + |
| 35 | +void packetGenerator_tlm::do_when_write_transaction(unsigned char*& data, unsigned int data_length, sc_dt::uint64 address) |
| 36 | +{ |
| 37 | + dbgimgtarmodprint(use_prints, "Calling do_when_write_transaction"); |
| 38 | + |
| 39 | + if ((address >= ETHERNET_DATA_WR) && (address + data_length - 1 < ETHERNET_DATA_DONE)) |
| 40 | + { |
| 41 | + |
| 42 | + if (tmp_data_length == 0) |
| 43 | + { |
| 44 | + tmp_data = new unsigned char[data_length]; |
| 45 | + memcpy(tmp_data, data, sizeof(char) * data_length); |
| 46 | + } |
| 47 | + else |
| 48 | + { |
| 49 | + unsigned char* tmp_data_; |
| 50 | + tmp_data_ = tmp_data; |
| 51 | + tmp_data = new unsigned char[tmp_data_length + data_length]; |
| 52 | + memcpy(tmp_data, tmp_data_, sizeof(char) * tmp_data_length); |
| 53 | + memcpy(tmp_data + tmp_data_length, data, data_length); |
| 54 | + |
| 55 | + delete[] tmp_data_; |
| 56 | + } |
| 57 | + |
| 58 | + dbgimgtarmodprint(use_prints, "Previous data_length %0d new data_length %0d", tmp_data_length, tmp_data_length + data_length); |
| 59 | + tmp_data_length = tmp_data_length + data_length; |
| 60 | + } |
| 61 | + else if ((address == ETHERNET_DATA_DONE) && (data_length == 1) && (*data == 1)) |
| 62 | + { |
| 63 | + if (tmp_data_length == 0) |
| 64 | + { |
| 65 | + tmp_data = new unsigned char[1]; |
| 66 | + *tmp_data = 0; |
| 67 | + tmp_data_length = 1; |
| 68 | + } |
| 69 | + |
| 70 | + dbgimgtarmodprint(use_prints, "Preparing to send %0d bytes", tmp_data_length); |
| 71 | + |
| 72 | + fill_data(tmp_data, (int)tmp_data_length); |
| 73 | + |
| 74 | + delete[] tmp_data; |
| 75 | + tmp_data_length = 0; |
| 76 | + } |
| 77 | +} |
| 78 | + |
| 79 | +#endif // PACKET_GENERATOR_TLM_CPP |
0 commit comments