33 #include <interfaces/tilelink/pin/tl_uh_bfm.h>
34 #include <scc/report.h>
35 #include <scc/utilities.h>
39 using namespace sc_core;
41 tl_uh_bfm::tl_uh_bfm(sc_module_name nm, int64_t offset)
47 , NAMED(a_bits_address)
51 , NAMED(a_bits_opcode)
54 , NAMED(a_bits_source)
56 , NAMED(a_bits_corrupt)
60 , NAMED(d_bits_opcode)
62 , NAMED(d_bits_source)
64 socket.register_nb_transport_fw(
65 [
this](tlm::tlm_generic_payload& gp, tlm::tlm_phase& phase, sc_core::sc_time& delay) -> tlm::tlm_sync_enum {
66 if(phase == tlm::BEGIN_REQ && gp.get_command() != tlm::TLM_IGNORE_COMMAND) {
68 fw_queue.notify(gp, delay);
69 return tlm::TLM_ACCEPTED;
70 }
else if(phase == tlm::END_RESP) {
76 SC_METHOD(tl_response_method);
77 sensitive << clock.pos();
81 tl_uh_bfm::~tl_uh_bfm() =
default;
83 void tl_uh_bfm::fw_thread() {
87 wait(fw_queue.get_event());
88 auto gp = fw_queue.get_next_transaction();
89 if(gp->get_data_length() == 4) {
90 auto addr = gp->get_address() + offset;
91 a_bits_address = addr;
97 a_bits_corrupt =
false;
98 if(gp->get_command() == tlm::TLM_WRITE_COMMAND) {
99 a_bits_opcode = PutFullData;
100 a_bits_data = *(uint32_t*)gp->get_data_ptr();
105 tl_in_progress.push_back(gp);
107 wait(clock.posedge_event());
108 }
while(a_ready ==
false);
110 SCCERR(
"tlbfm") <<
"Got transaction with unequal length";
114 void tl_uh_bfm::tl_response_method() {
115 if(d_valid && d_ready) {
117 auto gp = tl_in_progress.front();
118 sc_assert(gp &&
"Got TL response without a request in queue");
119 tl_in_progress.pop_front();
120 if(gp->get_command() == tlm::TLM_WRITE_COMMAND) {
121 sc_assert(d_bits_opcode == AccessAck &&
"TL did not respond with AccessAck to write request");
123 sc_assert(d_bits_opcode == AccessAckData &&
"TL did not respond with AccessAckData to read request");
124 *(uint32_t*)(gp->get_data_ptr()) = d_bits_data;
126 gp->set_response_status(tlm::TLM_OK_RESPONSE);
127 sc_core::sc_time delay;
128 tlm::tlm_phase phase{tlm::BEGIN_RESP};
129 auto ret = socket->nb_transport_bw(*gp, phase, delay);
130 if(ret == tlm::TLM_COMPLETED || (ret == tlm::TLM_UPDATED && phase == tlm::END_RESP)) {