33#include <scc/report.h>
34#include <scc/utilities.h>
38using namespace sc_core;
40tl_uh_bfm::tl_uh_bfm(sc_module_name nm, int64_t offset)
46, NAMED(a_bits_address)
55, NAMED(a_bits_corrupt)
63 socket.register_nb_transport_fw(
64 [
this](tlm::tlm_generic_payload& gp, tlm::tlm_phase& phase, sc_core::sc_time& delay) -> tlm::tlm_sync_enum {
65 if(phase == tlm::BEGIN_REQ && gp.get_command() != tlm::TLM_IGNORE_COMMAND) {
67 fw_queue.notify(gp, delay);
68 return tlm::TLM_ACCEPTED;
69 }
else if(phase == tlm::END_RESP) {
75 SC_METHOD(tl_response_method);
76 sensitive << clock.pos();
80tl_uh_bfm::~tl_uh_bfm() =
default;
82void tl_uh_bfm::fw_thread() {
86 wait(fw_queue.get_event());
87 auto gp = fw_queue.get_next_transaction();
88 if(gp->get_data_length() == 4) {
89 auto addr = gp->get_address() + offset;
90 a_bits_address = addr;
96 a_bits_corrupt =
false;
97 if(gp->get_command() == tlm::TLM_WRITE_COMMAND) {
98 a_bits_opcode = PutFullData;
99 a_bits_data = *(uint32_t*)gp->get_data_ptr();
104 tl_in_progress.push_back(gp);
106 wait(clock.posedge_event());
107 }
while(a_ready ==
false);
109 SCCERR(
"tlbfm") <<
"Got transaction with unequal length";
113void tl_uh_bfm::tl_response_method() {
114 if(d_valid && d_ready) {
116 auto gp = tl_in_progress.front();
117 sc_assert(gp &&
"Got TL response without a request in queue");
118 tl_in_progress.pop_front();
119 if(gp->get_command() == tlm::TLM_WRITE_COMMAND) {
120 sc_assert(d_bits_opcode == AccessAck &&
"TL did not respond with AccessAck to write request");
122 sc_assert(d_bits_opcode == AccessAckData &&
"TL did not respond with AccessAckData to read request");
123 *(uint32_t*)(gp->get_data_ptr()) = d_bits_data;
125 gp->set_response_status(tlm::TLM_OK_RESPONSE);
126 sc_core::sc_time delay;
127 tlm::tlm_phase phase{tlm::BEGIN_RESP};
128 auto ret = socket->nb_transport_bw(*gp, phase, delay);
129 if(ret == tlm::TLM_COMPLETED || (ret == tlm::TLM_UPDATED && phase == tlm::END_RESP)) {