| | 510 | #ifndef __MY_TARGET_H__ |
| | 511 | #define __MY_TARGET_H__ |
| | 512 | |
| | 513 | #include "tlm.h" // TLM headers |
| | 514 | #include "tlmt_transactions.h" // VCI headers |
| | 515 | #include "tlmt_simple_target_socket.h" // VCI SOCKET |
| | 516 | #include "mapping_table.h" |
| | 517 | #include "soclib_endian.h" |
| | 518 | |
| | 519 | class my_target |
| | 520 | : public sc_core::sc_module |
| | 521 | { |
| | 522 | private: |
| | 523 | typedef soclib::tlmt::VciParams<uint32_t,uint32_t,4> vci_param; |
| | 524 | |
| | 525 | uint32_t m_targetid; |
| | 526 | soclib::common::MappingTable m_mt; |
| | 527 | |
| | 528 | |
| | 529 | ///////////////////////////////////////////////////////////////////////////////////// |
| | 530 | // Virtual Fuctions tlm::tlm_fw_transport_if (VCI SOCKET) |
| | 531 | ///////////////////////////////////////////////////////////////////////////////////// |
| | 532 | |
| | 533 | // receive command from initiator |
| | 534 | tlm::tlm_sync_enum vci_cmd_received /// |
| | 535 | ( soclib_vci_types::tlm_payload_type &payload, /// VCI payload pointer |
| | 536 | soclib_vci_types::tlm_phase_type &phase, /// transaction phase |
| | 537 | sc_core::sc_time &time); /// time |
| | 538 | |
| | 539 | protected: |
| | 540 | SC_HAS_PROCESS(my_target); |
| | 541 | public: |
| | 542 | tlmt_simple_target_socket<my_target,32,soclib_vci_types> p_vci_target; ///< VCI target socket |
| | 543 | |
| | 544 | my_target(sc_core::sc_module_name name, |
| | 545 | const soclib::common::IntTab &index, |
| | 546 | const soclib::common::MappingTable &mt); |
| | 547 | |
| | 548 | ~my_target(); |
| | 549 | }; |
| | 550 | |
| | 551 | #endif |
| | 555 | #include "my_target.h" |
| | 556 | |
| | 557 | #ifndef MY_TARGET_DEBUG |
| | 558 | #define MY_TARGET_DEBUG 1 |
| | 559 | #endif |
| | 560 | |
| | 561 | #define tmpl(x) x my_target |
| | 562 | |
| | 563 | ////////////////////////////////////////////////////////////////////////////////////////// |
| | 564 | // CONSTRUCTOR |
| | 565 | ////////////////////////////////////////////////////////////////////////////////////////// |
| | 566 | tmpl(/**/)::my_target |
| | 567 | ( sc_core::sc_module_name name, |
| | 568 | const soclib::common::IntTab &index, |
| | 569 | const soclib::common::MappingTable &mt) |
| | 570 | : sc_module(name), |
| | 571 | m_mt(mt), |
| | 572 | p_vci_target("p_vci_target") |
| | 573 | { |
| | 574 | //register callback fuction |
| | 575 | p_vci_target.register_nb_transport_fw(this, &my_target::vci_cmd_received); |
| | 576 | |
| | 577 | m_targetid = m_mt.indexForId(index); |
| | 578 | } |
| | 579 | |
| | 580 | tmpl(/**/)::~my_target(){} |
| | 581 | |
| | 582 | ///////////////////////////////////////////////////////////////////////////////////// |
| | 583 | // Virtual Fuctions tlm::tlm_fw_transport_if VCI SOCKET |
| | 584 | ///////////////////////////////////////////////////////////////////////////////////// |
| | 585 | |
| | 586 | //nb_transport_fw implementation calls from initiators |
| | 587 | tmpl(tlm::tlm_sync_enum)::vci_cmd_received // |
| | 588 | ( soclib_vci_types::tlm_payload_type &payload, // VCI payload pointer |
| | 589 | soclib_vci_types::tlm_phase_type &phase, // transaction phase |
| | 590 | sc_core::sc_time &time) // time |
| | 591 | { |
| | 592 | int nwords = payload.get_data_length() / vci_param::nbytes; |
| | 593 | switch(payload.get_command()){ |
| | 594 | case soclib::tlmt::VCI_READ_COMMAND: |
| | 595 | case soclib::tlmt::VCI_WRITE_COMMAND: |
| | 596 | case soclib::tlmt::VCI_LOCKED_READ_COMMAND: |
| | 597 | case soclib::tlmt::VCI_STORE_COND_COMMAND: |
| | 598 | { |
| | 599 | #if MY_TARGET_DEBUG |
| | 600 | std::cout << "[RAM " << m_targetid << "] Receive from source " << payload.get_src_id() <<" a packet "<< payload.get_pkt_id() << " Time = " << time.value() << std::endl; |
| | 601 | #endif |
| | 602 | |
| | 603 | payload.set_response_status(soclib::tlmt::TLMT_OK_RESPONSE); |
| | 604 | phase = soclib::tlmt::TLMT_RSP; |
| | 605 | time = time + (nwords * UNIT_TIME); |
| | 606 | |
| | 607 | #if MY_TARGET_DEBUG |
| | 608 | std::cout << "[RAM " << m_targetid << "] Send to source "<< payload.get_src_id() << " a anwser packet " << payload.get_pkt_id() << " Time = " << time.value() << std::endl; |
| | 609 | #endif |
| | 610 | |
| | 611 | p_vci_target->nb_transport_bw(payload, phase, time); |
| | 612 | return tlm::TLM_COMPLETED; |
| | 613 | } |
| | 614 | break; |
| | 615 | default: |
| | 616 | break; |
| | 617 | } |
| | 618 | |
| | 619 | //send error message |
| | 620 | payload.set_response_status(soclib::tlmt::TLMT_ERROR_RESPONSE); |
| | 621 | |
| | 622 | phase = soclib::tlmt::TLMT_RSP; |
| | 623 | time = time + nwords * UNIT_TIME; |
| | 624 | |
| | 625 | #if MY_TARGET_DEBUG |
| | 626 | std::cout << "[RAM " << m_targetid << "] Address " << payload.get_address() << " does not match any segment " << std::endl; |
| | 627 | std::cout << "[RAM " << m_targetid << "] Send to source "<< payload.get_src_id() << " a error packet with time = " << time.value() << std::endl; |
| | 628 | #endif |
| | 629 | p_vci_target->nb_transport_bw(payload, phase, time); |
| | 630 | return tlm::TLM_COMPLETED; |
| | 631 | } |