aboutsummaryrefslogtreecommitdiff
path: root/src/lt_bus.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/lt_bus.cc')
-rw-r--r--src/lt_bus.cc85
1 files changed, 85 insertions, 0 deletions
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 <tlm_utils/simple_initiator_socket.h>
+#include <tlm_utils/simple_target_socket.h>
+
+// -- 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<target> 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<initiator> 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;
+}