Skip to content

File gtoa.h

File List > axi > 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, &GToA::nb_transport_fw_untimed),
        write_state_(GToAState::REQ),
        read_state_(GToAState::REQ),
        target_("target_"),
        initiator_("initiator_", *this, &GToA::nb_transport_bw, protocol, 32),
        clock_("clock") {
    target_.register_nb_transport_fw(this, &GToA::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_;
};