34class axi_initiator_b :
public sc_core::sc_module,
38 using payload_type = axi::axi_protocol_types::tlm_payload_type;
39 using phase_type = axi::axi_protocol_types::tlm_phase_type;
41 sc_core::sc_in<bool> clk_i{
"clk_i"};
43 sc_core::sc_export<tlm::scc::pe::intor_fw_b> fw_i{
"fw_i"};
45 sc_core::sc_port<tlm::scc::pe::intor_bw_b, 1, sc_core::SC_ZERO_OR_MORE_BOUND> bw_o{
"bw_o"};
47 void b_snoop(payload_type& trans, sc_core::sc_time& t)
override;
49 tlm::tlm_sync_enum nb_transport_bw(payload_type& trans, phase_type& phase, sc_core::sc_time& t)
override;
51 void invalidate_direct_mem_ptr(sc_dt::uint64 start_range, sc_dt::uint64 end_range)
override;
53 size_t get_transferwith_in_bytes()
const {
return transfer_width_in_bytes; }
63 void transport(payload_type& trans,
bool blocking)
override;
70 void snoop_resp(payload_type& trans,
bool sync =
false)
override;
73 size_t transfer_width, flavor_e flavor);
75 virtual ~axi_initiator_b();
77 axi_initiator_b() =
delete;
79 axi_initiator_b(axi_initiator_b
const&) =
delete;
81 axi_initiator_b(axi_initiator_b&&) =
delete;
83 axi_initiator_b& operator=(axi_initiator_b
const&) =
delete;
85 axi_initiator_b& operator=(axi_initiator_b&&) =
delete;
90 cci::cci_param<bool> data_interleaving{
"data_interleaving",
false};
92 cci::cci_param<unsigned>
artv{
"artv", 1};
94 cci::cci_param<unsigned>
awtv{
"awtv", 1};
96 cci::cci_param<unsigned>
wbv{
"wbv", 1};
98 cci::cci_param<unsigned>
rbr{
"rbr", 0};
100 cci::cci_param<unsigned>
br{
"br", 0};
102 cci::cci_param<unsigned>
rla{
"rla", 1};
104 cci::cci_param<unsigned>
ba{
"ba", 1};
119 void add_protocol_cb(axi::fsm::protocol_time_point_e e, std::function<
void(payload_type&,
bool)> cb) {
120 assert(e < axi::fsm::CB_CNT);
125 unsigned calculate_beats(payload_type& p) {
126 sc_assert(p.get_data_length() > 0);
127 return p.get_data_length() < transfer_width_in_bytes ? 1 : p.get_data_length() / transfer_width_in_bytes;
132 const size_t transfer_width_in_bytes;
134 const flavor_e flavor;
136 sc_core::sc_port_b<axi::axi_fw_transport_if<axi_protocol_types>>& socket_fw;
139 payload_type* active_tx{
nullptr};
142 std::unordered_map<void*, tx_state*> tx_state_by_tx;
143 std::unordered_map<unsigned, scc::ordered_semaphore*> id_mtx;
145 tlm_utils::peq_with_get<payload_type> snp_peq{
"snp_peq"};
147 std::unordered_map<void*, tx_state*> snp_state_by_id;
155 sc_core::sc_event any_tx_finished;
157 sc_core::sc_time clk_period{10, sc_core::SC_NS};
159 scc::sc_variable<unsigned> rd_waiting{
"RdWaiting", 0};
160 scc::sc_variable<unsigned> wr_waiting{
"WrWaiting", 0};
161 scc::sc_variable<unsigned> rd_outstanding{
"RdOutstanding", 0};
162 scc::sc_variable<unsigned> wr_outstanding{
"WrOutstanding", 0};
165 sc_core::sc_clock* clk_if{
nullptr};
166 void end_of_elaboration()
override;
167 void clk_counter() { m_clock_counter++; }
168 unsigned get_clk_cnt() {
return m_clock_counter; }
170 tlm::tlm_phase send(payload_type& trans, axi::pe::axi_initiator_b::tx_state* txs, tlm::tlm_phase phase);
172 unsigned m_clock_counter{0};
173 unsigned m_prev_clk_cnt{0};
174 unsigned snoops_in_flight{0};
176 std::array<std::function<void(payload_type&,
bool)>, axi::fsm::CB_CNT> protocol_cb;