inline void lt_target::b_transport(tlm::tlm_generic_payload& trans, sc_time& delay){ sc_dt::uint64 adr = trans.get_address() / 4; unsigned char* ptr = trans.get_data_ptr(); unsigned int len = trans.get_data_length(); unsigned char* byt = trans.get_byte_enable_ptr(); unsigned int blen = trans.get_byte_enable_length(); unsigned int wid = trans.get_streaming_width(); if (adr >= sc_dt::uint64(mem_size) ) { trans.set_response_status( tlm::TLM_ADDRESS_ERROR_RESPONSE ); return; } if ( wid < len ) { trans.set_response_status( tlm::TLM_BURST_ERROR_RESPONSE ); return; } if (trans.is_read()) { delay += rd_latency; if ( byt != 0 ) { for ( unsigned int i = 0; i < len; i++ ) if ( byt[i % blen] == TLM_BYTE_ENABLED ){ ptr[i] = (mem[adr+i/4] >> ((i&3)*8)) & 0xFF; } } else {
void DNP_master_device::master_cb( tlm::tlm_generic_payload &arg_Req, sc_time& delay) { uint32_t addr = (uint32_t) arg_Req.get_address(); uint32_t len = (uint32_t) arg_Req.get_data_length(); uint8_t *data_ptr = (uint8_t *) arg_Req.get_data_ptr(); crt_trans_id ++ ; memset(recvd_data, 0, sizeof(recvd_data)); if (arg_Req.is_read()){ /* * Read command */ DPRINTF("R @ 0x%08x(%d) <%d>\n", addr, len, crt_trans_id); for(uint32_t i = 0; i < len; i+=4){ #ifdef DEBUG_DNP_MASTER uint32_t *p = (uint32_t *)recvd_data; #endif send_req(crt_trans_id, (addr + i), recvd_data, 4, false); wait(rsp_rcvd_ev); memcpy((data_ptr + i), (uint32_t *)recvd_data, 4); DPRINTF("R @ 0x%08x -- %08x \n", (addr + i), *p); } }else{ /* * Write command */ DPRINTF("W @ 0x%08x(%d) <%d>\n", addr, len, crt_trans_id); for (uint32_t i = 0; i < len; i+=4){ #ifdef DEBUG_DNP_MASTER uint32_t *p = (uint32_t *)(data_ptr + i); #endif DPRINTF("W @ 0x%08x -- %08x\n", (addr + i), *p); send_req(crt_trans_id, (addr + i), (data_ptr + i), 4, true); wait(rsp_rcvd_ev); } } arg_Req.set_response_status(tlm::TLM_OK_RESPONSE); }