File gtoa.h
Go to the documentation of this file
#pragma once
#include <ARM/TLM/arm_axi4.h>
#include <tlm_utils/peq_with_cb_and_phase.h>
#include <tlm_utils/simple_initiator_socket.h>
#include <tlm_utils/simple_target_socket.h>
#include <deque>
#include <map>
#include "axi_tlm_ext.h"
enum class GToAState : uint8_t { REQ, DATA, ACK };
class GToA : sc_core::sc_module {
private:
tlm_utils::peq_with_cb_and_phase<GToA> peq_;
std::deque<ARM::AXI::Payload*> req_queue_;
std::map<ARM::AXI::Payload*, tlm::tlm_generic_payload*> arm_to_gen_map_;
std::map<tlm::tlm_generic_payload*, ARM::AXI::Payload*> gen_to_arm_map_;
uint32_t data_to_send_;
void nb_transport_fw_untimed(tlm::tlm_generic_payload& gen_payload,
const tlm::tlm_phase& gen_phase);
void clock_negedge();
void process_resp();
tlm::tlm_generic_payload* resp_payload_;
GToAState write_state_;
GToAState read_state_;
public:
GToA(sc_core::sc_module_name name, ARM::TLM::Protocol protocol)
: peq_(this, >oA::nb_transport_fw_untimed),
write_state_(GToAState::REQ),
read_state_(GToAState::REQ),
target_("target_"),
initiator_("initiator_", *this, >oA::nb_transport_bw, protocol, 32),
clock_("clock") {
target_.register_nb_transport_fw(this, >oA::nb_transport_fw);
SC_THREAD(clock_negedge);
sensitive << clock_.neg();
}
~GToA() {}
tlm::tlm_sync_enum nb_transport_bw(ARM::AXI::Payload& arm_payload,
ARM::AXI::Phase& arm_phase);
tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& gen_payload,
tlm::tlm_phase& gen_phase,
sc_core::sc_time& t);
tlm_utils::simple_target_socket<GToA, 32, tlm::tlm_base_protocol_types>
target_;
ARM::AXI::SimpleInitiatorSocket<GToA> initiator_;
sc_core::sc_in<bool> clock_;
};