83struct spi_channel :
public sc_core::sc_module,
87 using transaction_type = spi_packet_types::tlm_payload_type;
88 using phase_type = spi_packet_types::tlm_phase_type;
90 spi_pkt_target_socket<> tsck{
"tsck"};
92 sc_core::sc_vector<spi_pkt_initiator_socket<>> isck{
"isck"};
94 cci::cci_param<sc_core::sc_time> channel_delay{
"channel_delay", sc_core::SC_ZERO_TIME,
"delay of the SPI channel"};
96 spi_channel(sc_core::sc_module_name
const& nm,
size_t slave_count)
97 : sc_core::sc_module(nm)
98 , isck{
"isckt", slave_count} {
104 spi_pkt_target_socket<>& operator()() {
return tsck; }
106 spi_pkt_initiator_socket<>& operator()(
size_t idx) {
return isck.at(idx); }
108 void b_transport(transaction_type& trans, sc_core::sc_time& t)
override {
110 isck.at(trans.get_target_id())->b_transport(trans, t);
113 tlm::tlm_sync_enum nb_transport_fw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t)
override {
114 SCCTRACE(SCMOD) <<
"Received non-blocking transaction in fw path with phase " << phase.get_name();
115 if(phase == tlm::nw::REQUEST) {
116 auto idx = trans.get_target_id();
117 if(idx < isck.size()) {
118 phase_type ph = tlm::nw::INDICATION;
119 auto ret = isck.at(idx)->nb_transport_fw(trans, ph, t);
120 if(ph == tlm::nw::RESPONSE)
121 phase = tlm::nw::CONFIRM;
125 phase = tlm::nw::CONFIRM;
126 return tlm::TLM_COMPLETED;
129 return tlm::TLM_ACCEPTED;
132 tlm::tlm_sync_enum nb_transport_bw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t)
override {
133 SCCTRACE(SCMOD) <<
"Received non-blocking transaction in bw path with phase " << phase.get_name();
134 if(phase == tlm::nw::RESPONSE) {
135 phase_type ph = tlm::nw::CONFIRM;
136 return tsck->nb_transport_bw(trans, ph, t);
138 return tlm::TLM_ACCEPTED;
141 unsigned int transport_dbg(transaction_type& trans)
override {
return isck.at(trans.get_target_id())->transport_dbg(trans); }