17 #ifndef SC_INCLUDE_DYNAMIC_PROCESSES
18 #define SC_INCLUDE_DYNAMIC_PROCESSES
21 #include <axi/pe/ace_target_pe.h>
22 #include <axi/fsm/protocol_fsm.h>
23 #include <axi/fsm/types.h>
24 #include <scc/report.h>
25 #include <scc/utilities.h>
29 using namespace sc_core;
32 using namespace axi::fsm;
42 unsigned transport(tlm::tlm_generic_payload& payload)
override {
43 if((payload.is_read() && that->rd_resp_fifo.num_free())){
44 that->rd_resp_fifo.write(&payload);
46 }
else if((payload.is_write() && that->wr_resp_fifo.num_free())){
47 that->wr_resp_fifo.write(&payload);
50 return std::numeric_limits<unsigned>::max();
56 ace_target_pe::ace_target_pe(
const sc_core::sc_module_name& nm,
size_t transfer_width)
58 ,
base(transfer_width, true)
60 isckt_axi.bind(*
this);
61 instance_name = name();
63 add_attribute(rd_resp_delay);
67 SC_METHOD(fsm_clk_method);
69 sensitive << clk_i.pos();
72 ace_target_pe::~ace_target_pe() =
default;
74 void ace_target_pe::end_of_elaboration() {
75 clk_if =
dynamic_cast<sc_core::sc_clock*
>(clk_i.get_interface());
78 void ace_target_pe::start_of_simulation() {
80 SCCFATAL(SCMOD) <<
"No backward interface registered!";
84 void ace_target_pe::b_transport(payload_type& trans, sc_time& t) {
85 auto latency = operation_cb ? operation_cb(trans) : trans.is_read() ? rd_resp_delay.get_value() :
wr_resp_delay.get_value();
86 trans.set_dmi_allowed(
false);
87 trans.set_response_status(tlm::TLM_OK_RESPONSE);
89 t += clk_if->period() * latency;
92 tlm_sync_enum ace_target_pe::nb_transport_fw(payload_type& trans, phase_type& phase, sc_time& t) {
93 SCCTRACE(SCMOD)<<
"in nb_transport_fw receives pahse " << phase;
94 auto ret = TLM_ACCEPTED;
95 if( phase == END_REQ) {
96 schedule(phase == END_REQ ? EndReqE : EndPartReqE, &trans, t,
false);
97 }
else if(phase == BEGIN_PARTIAL_RESP || phase == BEGIN_RESP) {
98 schedule(phase == BEGIN_RESP ? BegRespE : BegPartRespE, &trans, t,
false);
101 return tlm::TLM_COMPLETED;
102 SCCTRACE(SCMOD) <<
" forward via axi_i_sckt, in nb_transport_fw () with phase "<<phase ;
103 return isckt_axi->nb_transport_fw(trans, phase, t);
108 bool ace_target_pe::get_direct_mem_ptr(payload_type& trans, tlm_dmi& dmi_data) {
109 trans.set_dmi_allowed(
false);
113 unsigned int ace_target_pe::transport_dbg(payload_type& trans) {
return 0; }
118 fsm_hndl->
fsm->cb[RequestPhaseBeg] = [
this, fsm_hndl]() ->
void {
120 outstanding_cnt[fsm_hndl->
trans->get_command()]++;
122 fsm_hndl->
fsm->cb[BegPartReqE] = [
this, fsm_hndl]() ->
void {
125 fsm_hndl->
fsm->cb[EndPartReqE] = [
this, fsm_hndl]() ->
void {
128 fsm_hndl->
fsm->cb[BegReqE] = [
this, fsm_hndl]() ->
void {
129 SCCTRACE(SCMOD)<<
"in BegReq of setup_cb";
132 tlm::tlm_phase phase = tlm::BEGIN_REQ;
133 auto ret = socket_bw->nb_transport_bw(*fsm_hndl->
trans, phase, t);
136 fsm_hndl->
fsm->cb[EndReqE] = [
this, fsm_hndl]() ->
void {
137 SCCTRACE(SCMOD)<<
" EndReqE in setup_cb";
139 fsm_hndl->
fsm->cb[BegPartRespE] = [
this, fsm_hndl]() ->
void {
140 SCCTRACE(SCMOD) <<
"in BegPartRespE of setup_cb, ";
141 sc_time t(clk_if ? ::scc::time_to_next_posedge(clk_if) - 1_ps : SC_ZERO_TIME);
144 fsm_hndl->
fsm->cb[EndPartRespE] = [
this, fsm_hndl]() ->
void {
145 SCCTRACE(SCMOD) <<
"in EndPartRespE of setup_cb";
147 sc_time t(SC_ZERO_TIME);
148 tlm::tlm_phase phase = axi::END_PARTIAL_RESP;
149 auto ret = socket_bw->nb_transport_bw(*fsm_hndl->
trans, phase, t);
152 fsm_hndl->
fsm->cb[BegRespE] = [
this, fsm_hndl]() ->
void {
153 SCCTRACE(SCMOD) <<
"in BegRespE of setup_cb";
154 sc_time t(clk_if ? ::scc::time_to_next_posedge(clk_if) - 1_ps : SC_ZERO_TIME);
155 tlm::tlm_phase phase = tlm::END_RESP;
156 auto ret = socket_bw->nb_transport_bw(*fsm_hndl->
trans, phase, t);
157 t=::scc::time_to_next_posedge(clk_if);
163 fsm_hndl->
fsm->cb[EndRespE] = [
this, fsm_hndl]() ->
void {
169 SCCTRACE(SCMOD)<<
"notifying finish ";
170 fsm_hndl->
finish.notify();
176 void ace_target_pe::snoop(payload_type& trans) {
177 SCCTRACE(SCMOD) <<
"got transport snoop trans ";
182 SCCTRACE(SCMOD) <<
"started non-blocking protocol";
183 sc_core::wait(fsm->
finish);
184 SCCTRACE(SCMOD) <<
"finished non-blocking protocol";
fsm::fsm_handle * create_fsm_handle() override
scc::sc_attribute_randomized< int > wr_resp_delay
the latency between request and response phase. Will be overwritten by the return of the callback fun...
void setup_callbacks(fsm::fsm_handle *) override
protocol engine implementations
TLM2.0 components modeling AHB.
unsigned transport(tlm::tlm_generic_payload &payload) override
base class of all AXITLM based adapters and interfaces.
void react(axi::fsm::protocol_time_point_e event, tlm::scc::tlm_gp_shared_ptr &trans)
triggers the FSM with event and given transaction
void schedule(axi::fsm::protocol_time_point_e e, tlm::scc::tlm_gp_shared_ptr &gp, unsigned cycles)
processes the fsm_sched_queue and propagates events to fsm_clk_queue. Should be registered as falling...
axi::fsm::fsm_handle * find_or_create(payload_type *gp=nullptr, bool ace=false)
retrieve the FSM handle based on the transaction passed. If non exist one will be created
tlm::scc::tlm_gp_shared_ptr trans
pointer to the associated AXITLM payload
sc_core::sc_event finish
event indicating the end of the transaction
size_t beat_count
beat count of this transaction
AxiProtocolFsm *const fsm
pointer to the FSM
bool is_snoop
indicator if this is a snoop access