37 FIELD_IT_RXWATERMARK = 0x2,
38 FIELD_CTRL_TXENABLE = 0x1,
39 FIELD_CTRL_RXENABLE = 0x2,
40 FIELD_STATUS_TXEMPTY = 0x04,
41 FIELD_STATUS_RXIDLE = 0x10,
42 FIELD_STATUS_RXEMPTY = 0x20,
45 sc_core::sc_out<bool> irq_rxwatermark;
54 void update_irqs(
void)
57 if (
it & FIELD_IT_RXWATERMARK) {
58 irq_rxwatermark =
true;
60 irq_rxwatermark =
false;
66 if ((ctrl & FIELD_CTRL_RXENABLE) && (status & FIELD_STATUS_RXEMPTY)) {
68 status &= ~(FIELD_STATUS_RXEMPTY | FIELD_STATUS_RXIDLE);
69 it_state |= FIELD_IT_RXWATERMARK;
70 update_event.notify();
72 SCP_ERR(()) <<
"ibex_uart: rx char overflow, ignoring chracter 0x" << (
unsigned)value <<
" '" << value
77 void receive(tlm::tlm_generic_payload&
txn, sc_core::sc_time&
t)
80 for (
int i = 0;
i <
txn.get_streaming_width();
i++) {
86 tlm_utils::simple_target_socket<ibex_uart> socket;
90 sc_core::sc_event update_event;
93 : irq_rxwatermark(
"irq_rx_watermark"), socket(
"target_socket"), backend_socket(
"backend_socket")
96 status = FIELD_STATUS_TXEMPTY | FIELD_STATUS_RXIDLE | FIELD_STATUS_RXEMPTY;
101 SCP_TRACE(()) <<
"ibex_uart constructor";
102 socket.register_b_transport(
this, &ibex_uart::b_transport);
109 void b_transport(tlm::tlm_generic_payload&
trans, sc_core::sc_time& delay)
111 unsigned char*
ptr =
trans.get_data_ptr();
113 unsigned int len =
trans.get_data_length();
116 trans.set_response_status(tlm::TLM_ADDRESS_ERROR_RESPONSE);
120 switch (
trans.get_command()) {
121 case tlm::TLM_WRITE_COMMAND:
133 SCP_FATAL(()) <<
"Incorrect transaction size";
137 case tlm::TLM_READ_COMMAND:
149 SCP_FATAL(()) <<
"Incorrect transaction size";
157 trans.set_dmi_allowed(
false);
158 trans.set_response_status(tlm::TLM_OK_RESPONSE);
180 if (ctrl & FIELD_CTRL_RXENABLE) {
181 status |= FIELD_STATUS_RXIDLE | FIELD_STATUS_RXEMPTY;
195 update_event.notify();
198 it_enable = data & FIELD_IT_RXWATERMARK;
200 update_event.notify();
208 backend_socket.
enqueue(data & 0xFF);
213 void before_end_of_elaboration()
215 if (!irq_rxwatermark.get_interface()) {
216 sc_core::sc_signal<bool>*
stub =
new sc_core::sc_signal<bool>(sc_core::sc_gen_unique_name(
"stub"));
217 irq_rxwatermark.bind(*
stub);
void register_b_transport(MODULE *mod, void(MODULE::*cb)(tlm::tlm_generic_payload &, sc_core::sc_time &))
Register b_transport to be called whenever data is received from the socket.
Definition biflow-socket.h:227