From 49c7fc8a1c06912caa89664af85801032a7bb7f8 Mon Sep 17 00:00:00 2001 From: Johannes Stoelp Date: Thu, 26 Oct 2023 01:35:28 +0200 Subject: initially add simple lt_bus --- src/lt_bus.cc | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/lt_bus.cc (limited to 'src/lt_bus.cc') diff --git a/src/lt_bus.cc b/src/lt_bus.cc new file mode 100644 index 0000000..078a8d8 --- /dev/null +++ b/src/lt_bus.cc @@ -0,0 +1,85 @@ +#include "models/lt_bus.h" +#include "utils.h" + +#include +#include + +// -- TARGET ------------------------------------------------------------------- + +struct target : public sc_core::sc_module { + explicit target(sc_core::sc_module_name nm) : sc_module(std::move(nm)) { + p_sock.register_b_transport(this, &target::b_transport); + } + + tlm_utils::simple_target_socket p_sock{"sock"}; + + private: + void b_transport(tlm::tlm_generic_payload& tx, sc_core::sc_time& t) { + LOGM("transport 0x%llx w: %d r: %d", tx.get_address(), tx.is_write(), + tx.is_read()); + tx.set_response_status(tlm::TLM_OK_RESPONSE); + } +}; + +// -- INITIATOR ---------------------------------------------------------------- + +struct initiator : public sc_core::sc_module { + SC_HAS_PROCESS(initiator); + + explicit initiator(sc_core::sc_module_name nm) : sc_module(std::move(nm)) { + SC_THREAD(run); + } + + tlm_utils::simple_initiator_socket p_sock{"sock"}; + + private: + void send_tx(tlm::tlm_command cmd, std::uint64_t addr) { + unsigned char data[4]; + tlm::tlm_generic_payload tx; + tx.set_command(cmd); + tx.set_address(addr); + tx.set_data_ptr(data); + tx.set_data_length(sizeof(data)); + tx.set_byte_enable_ptr(nullptr); + tx.set_byte_enable_length(0); + tx.set_response_status(tlm::TLM_INCOMPLETE_RESPONSE); + tx.set_dmi_allowed(false); + + sc_core::sc_time t; + p_sock->b_transport(tx, t); + + LOGM("ACCESS @%lx ok: %d (%s)", addr, tx.is_response_ok(), + tx.get_response_string().c_str()); + } + + void run() { + send_tx(tlm::TLM_WRITE_COMMAND, 0x1000); + send_tx(tlm::TLM_WRITE_COMMAND, 0x3000); + send_tx(tlm::TLM_WRITE_COMMAND, 0x4000); + send_tx(tlm::TLM_WRITE_COMMAND, 0x9000); + send_tx(tlm::TLM_WRITE_COMMAND, 0x80fc); + send_tx(tlm::TLM_WRITE_COMMAND, 0x80fd); + } +}; + +// -- SC_MAIN ------------------------------------------------------------------ + +extern "C" int sc_main(int, char*[]) { + lt_bus bus{"bus"}; + + target target1{"target1"}; + target target2{"target2"}; + target target3{"target3"}; + + initiator init1{"init1"}; + + bus.attach_target(target2.p_sock, 0x4000, 0x4fff); + bus.attach_target(target1.p_sock, 0x0000, 0x3fff); + bus.attach_target(target3.p_sock, 0x8000, 0x80ff); + + bus.attach_initiator(init1.p_sock); + + sc_core::sc_start(); + + return 0; +} -- cgit v1.2.3