59 bool has_vlan =
false;
60 std::uint16_t vlan_tpid = 0;
61 std::uint16_t vlan_id = 0;
62 std::uint16_t vlan_pcp = 0;
63 bool vlan_dei =
false;
65 ether_kind kind = ether_kind::ETHER_TYPE;
66 std::uint16_t etherType_or_len = 0;
67 nonstd::span<const std::uint8_t> payload;
68 static ethernet_frame parse_ethernet(nonstd::span<const std::uint8_t> frame);
121struct eth_channel :
public sc_core::sc_module,
125 using transaction_type = eth_packet_types::tlm_payload_type;
126 using phase_type = eth_packet_types::tlm_phase_type;
128 eth_pkt_target_socket<> rx{
"rx"};
130 eth_pkt_initiator_socket<> tx{
"tx"};
132 cci::cci_param<sc_core::sc_time> channel_delay{
"channel_delay", sc_core::SC_ZERO_TIME,
"delay of the ETH channel"};
134 eth_channel(sc_core::sc_module_name
const& nm)
135 : sc_core::sc_module(nm)
141 void b_transport(transaction_type& trans, sc_core::sc_time& t)
override {
142 t += trans.
get_data().size() * 8 * trans.get_sender_clk_period() + channel_delay.get_value();
143 tx->b_transport(trans, t);
146 tlm::tlm_sync_enum nb_transport_fw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t)
override {
147 SCCTRACE(SCMOD) <<
"Received non-blocking transaction in fw path with phase " << phase.get_name();
148 if(phase == tlm::nw::REQUEST) {
149 phase_type ph = tlm::nw::INDICATION;
150 auto ret = tx->nb_transport_fw(trans, ph, t);
151 if(ph == tlm::nw::RESPONSE)
152 phase = tlm::nw::CONFIRM;
155 return tlm::TLM_ACCEPTED;
158 tlm::tlm_sync_enum nb_transport_bw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t)
override {
159 SCCTRACE(SCMOD) <<
"Received non-blocking transaction in bw path with phase " << phase.get_name();
160 if(phase == tlm::nw::RESPONSE) {
161 phase_type ph = tlm::nw::CONFIRM;
162 return rx->nb_transport_bw(trans, ph, t);
164 return tlm::TLM_ACCEPTED;
167 unsigned int transport_dbg(transaction_type& trans)
override {
return tx->transport_dbg(trans); }