51 using payload_type = axi::axi_protocol_types::tlm_payload_type;
52 using phase_type = axi::axi_protocol_types::tlm_phase_type;
54 sc_core::sc_in<bool> clk_i{
"clk_i"};
56 sc_core::sc_port<tlm::scc::pe::intor_fw_nb, 1, sc_core::SC_ZERO_OR_MORE_BOUND> fw_o{
"fw_o"};
58 sc_core::sc_export<tlm::scc::pe::intor_bw_nb> bw_i{
"bw_i"};
93 void b_transport(
payload_type& trans, sc_core::sc_time& t)
override;
95 tlm::tlm_sync_enum nb_transport_fw(
payload_type& trans, phase_type& phase, sc_core::sc_time& t)
override;
97 bool get_direct_mem_ptr(
payload_type& trans, tlm::tlm_dmi& dmi_data)
override;
99 unsigned int transport_dbg(
payload_type& trans)
override;
110 void set_operation_cb(std::function<
unsigned(payload_type& trans)> cb) { operation_cb = cb; }
139 explicit axi_target_pe(
const sc_core::sc_module_name& nm,
size_t transfer_width, flavor_e flavor = flavor_e::AXI);
143 inline unsigned getAllOutStandingTx()
const {
return outstanding_rd_tx + outstanding_wr_tx + outstanding_ign_tx; }
156 void end_of_elaboration()
override;
158 void start_of_simulation()
override;
170 unsigned operations_callback(payload_type& trans);
173 std::function<unsigned(payload_type& trans)> operation_cb;
174 scc::fifo_w_cb<std::tuple<payload_type*, unsigned>> rd_req2resp_fifo{
"rd_req2resp_fifo"};
175 scc::fifo_w_cb<std::tuple<payload_type*, unsigned>> wr_req2resp_fifo{
"wr_req2resp_fifo"};
176 void process_req2resp_fifos();
177 sc_core::sc_fifo<payload_type*> rd_resp_fifo{1}, wr_resp_fifo{1};
178 void start_rd_resp_thread();
179 void start_wr_resp_thread();
180 sc_core::sc_fifo<std::tuple<fsm::fsm_handle*, axi::fsm::protocol_time_point_e>> wr_resp_beat_fifo{128}, rd_resp_beat_fifo{128};
181 scc::ordered_semaphore rd_resp{1}, wr_resp_ch{1}, rd_resp_ch{1};
182 void send_wr_resp_beat_thread();
183 void send_rd_resp_beat_thread();
185 sc_core::sc_clock* clk_if{
nullptr};
186 std::unique_ptr<bw_intor_impl> bw_intor;
187 std::array<unsigned, 3> outstanding_cnt{{0, 0, 0}};
188 scc::sc_variable<unsigned> outstanding_rd_tx{
"OutstandingRd", 0};
189 scc::sc_variable<unsigned> outstanding_wr_tx{
"OutstandingWr", 0};
190 scc::sc_variable<unsigned> outstanding_ign_tx{
"OutstandingIgn", 0};
191 inline scc::sc_variable<unsigned>& getOutStandingTx(tlm::tlm_command cmd) {
193 case tlm::TLM_READ_COMMAND:
194 return outstanding_rd_tx;
195 case tlm::TLM_WRITE_COMMAND:
196 return outstanding_wr_tx;
198 return outstanding_ign_tx;
201 inline scc::sc_variable<unsigned>
const& getOutStandingTx(tlm::tlm_command cmd)
const {
203 case tlm::TLM_READ_COMMAND:
204 return outstanding_rd_tx;
205 case tlm::TLM_WRITE_COMMAND:
206 return outstanding_wr_tx;
208 return outstanding_ign_tx;
211 std::array<tlm::tlm_generic_payload*, 3> stalled_tx{
nullptr,
nullptr,
nullptr};
212 std::array<axi::fsm::protocol_time_point_e, 3> stalled_tp{{axi::fsm::CB_CNT, axi::fsm::CB_CNT, axi::fsm::CB_CNT}};
213 void nb_fw(payload_type& trans,
const phase_type& phase) {
214 auto delay = sc_core::SC_ZERO_TIME;
215 base::nb_fw(trans, phase, delay);
217 tlm_utils::peq_with_cb_and_phase<axi_target_pe> fw_peq{
this, &axi_target_pe::nb_fw};
218 std::unordered_set<unsigned> active_rdresp_id;