aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt1
-rw-r--r--src/browse.cc2
-rw-r--r--src/event.cc2
-rw-r--r--src/lt_bus.cc2
-rw-r--r--src/minimal_socket.cc2
-rw-r--r--src/models/lt_bus.h196
-rw-r--r--src/sc_export.cc2
-rw-r--r--src/sc_export2.cc2
-rw-r--r--src/utils/log.h (renamed from src/utils.h)6
-rw-r--r--src/utils/range.h25
-rw-r--r--src/utils/sysc.h24
-rw-r--r--src/utils/tlm_initiator_socket_tagged.h48
-rw-r--r--src/utils/tlm_target_socket_tagged.h69
-rw-r--r--src/utils/types.h11
14 files changed, 218 insertions, 174 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6db84fe..ff29dfe 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -9,5 +9,6 @@ set (CMAKE_CXX_STANDARD ${SystemC_CXX_STANDARD} CACHE STRING "C++ standard to bu
foreach (X IN ITEMS event sc_export sc_export2 minimal_socket browse lt_bus)
add_executable(${X} src/${X}.cc)
+ target_include_directories(${X} PRIVATE src)
target_link_libraries(${X} SystemC::systemc)
endforeach()
diff --git a/src/browse.cc b/src/browse.cc
index afc132e..e151bc2 100644
--- a/src/browse.cc
+++ b/src/browse.cc
@@ -1,5 +1,5 @@
#include <systemc>
-#include "utils.h"
+#include "utils/log.h"
using sc_core::sc_module;
using sc_core::sc_module_name;
diff --git a/src/event.cc b/src/event.cc
index 96750bc..655beb2 100644
--- a/src/event.cc
+++ b/src/event.cc
@@ -1,5 +1,5 @@
#include <systemc>
-#include "utils.h"
+#include "utils/log.h"
using sc_core::sc_event;
using sc_core::sc_module;
diff --git a/src/lt_bus.cc b/src/lt_bus.cc
index 078a8d8..42495c0 100644
--- a/src/lt_bus.cc
+++ b/src/lt_bus.cc
@@ -1,5 +1,5 @@
#include "models/lt_bus.h"
-#include "utils.h"
+#include "utils/log.h"
#include <tlm_utils/simple_initiator_socket.h>
#include <tlm_utils/simple_target_socket.h>
diff --git a/src/minimal_socket.cc b/src/minimal_socket.cc
index 7fe7f38..1daac6b 100644
--- a/src/minimal_socket.cc
+++ b/src/minimal_socket.cc
@@ -1,5 +1,5 @@
#include <systemc>
-#include "utils.h"
+#include "utils/log.h"
using sc_core::sc_export;
using sc_core::sc_interface;
diff --git a/src/models/lt_bus.h b/src/models/lt_bus.h
index bab1866..f52f8b0 100644
--- a/src/models/lt_bus.h
+++ b/src/models/lt_bus.h
@@ -1,154 +1,16 @@
#ifndef SYSC_PLAYGROUND_LT_BUS
#define SYSC_PLAYGROUND_LT_BUS
-#include <tlm_core/tlm_2/tlm_generic_payload/tlm_generic_payload.h>
-#include <tlm_core/tlm_2/tlm_sockets/tlm_sockets.h>
+#include "utils/range.h"
+#include "utils/sysc.h"
+#include "utils/tlm_initiator_socket_tagged.h"
+#include "utils/tlm_target_socket_tagged.h"
+#include "utils/types.h"
#include <algorithm>
-#include <cstdint>
#include <memory>
#include <vector>
-struct scoped_push_hierarchy {
- [[nodiscard]] explicit scoped_push_hierarchy(sc_core::sc_module& mod)
- : m_mod(mod), m_simctx(sc_core::sc_get_curr_simcontext()) {
- assert(m_simctx);
- m_simctx->hierarchy_push(&m_mod);
- }
-
- ~scoped_push_hierarchy() {
- const auto* top = m_simctx->hierarchy_pop();
- assert(top == &m_mod);
- }
-
- private:
- sc_core::sc_simcontext* m_simctx{nullptr};
- sc_core::sc_module& m_mod;
-};
-
-struct range {
- constexpr explicit range(std::uint64_t start, std::uint64_t end)
- : start{start}, end{end} {
- assert(start < end);
- }
-
- constexpr bool overlaps(range rhs) const {
- return start <= rhs.end && rhs.start <= end;
- }
-
- constexpr bool contains(range rhs) const {
- return start <= rhs.start && rhs.end <= end;
- }
-
- std::uint64_t start;
- std::uint64_t end;
-};
-
-template <typename Module>
-class tlm_initiator_socket_tagged : public tlm::tlm_initiator_socket<>,
- public tlm::tlm_bw_transport_if<> {
- using cb_invalidate_direct_mem_ptr = void (Module::*)(std::size_t,
- sc_dt::uint64,
- sc_dt::uint64);
-
- public:
- explicit tlm_initiator_socket_tagged(const char* name,
- std::size_t id,
- Module* mod,
- cb_invalidate_direct_mem_ptr i)
- : tlm_initiator_socket<>{name},
- m_mod{mod},
- m_id{id},
- m_invalidate_direct_mem_ptr{i} {
- bind(*static_cast<tlm::tlm_bw_transport_if<>*>(this));
- }
-
- private:
- // -- TLM_BW_TRANSPORT_IF ----------------------------------------------------
-
- virtual void invalidate_direct_mem_ptr(sc_dt::uint64 start,
- sc_dt::uint64 end) override {
- (m_mod->*m_invalidate_direct_mem_ptr)(m_id, start, end);
- }
-
- virtual tlm::tlm_sync_enum nb_transport_bw(tlm::tlm_generic_payload&,
- tlm::tlm_phase&,
- sc_core::sc_time&) override {
- std::fprintf(
- stderr, "tlm_initiator_socket_tagged: nb_transport_bw not supported\n");
- std::abort();
- }
-
- // -- MEMBER -----------------------------------------------------------------
-
- std::size_t m_id{0};
- Module* m_mod{nullptr};
- cb_invalidate_direct_mem_ptr m_invalidate_direct_mem_ptr{nullptr};
-};
-
-template <typename Module>
-class tlm_target_socket_tagged : public tlm::tlm_target_socket<>,
- public tlm::tlm_fw_transport_if<> {
- using cb_b_transport = void (Module::*)(std::size_t,
- tlm::tlm_generic_payload&,
- sc_core::sc_time&);
-
- using cb_get_direct_mem_ptr = bool (Module::*)(std::size_t,
- tlm::tlm_generic_payload&,
- tlm::tlm_dmi&);
- using cb_transport_dbg = unsigned int (Module::*)(std::size_t,
- tlm::tlm_generic_payload&);
-
- public:
- explicit tlm_target_socket_tagged(const char* name,
- std::size_t id,
- Module* mod,
- cb_b_transport b,
- cb_get_direct_mem_ptr m,
- cb_transport_dbg d)
- : tlm_target_socket<>{name},
- m_mod{mod},
- m_id{id},
- m_b_transport{b},
- m_get_direct_mem_ptr{m},
- m_transport_dbg{d} {
- bind(*static_cast<tlm::tlm_fw_transport_if<>*>(this));
- }
-
- private:
- // -- TLM_FW_TRANSPORT_IF ----------------------------------------------------
-
- virtual void b_transport(tlm::tlm_generic_payload& tx,
- sc_core::sc_time& t) override {
- return (m_mod->*m_b_transport)(m_id, tx, t);
- }
-
- virtual bool get_direct_mem_ptr(tlm::tlm_generic_payload& tx,
- tlm::tlm_dmi& dmi_data) override {
- return (m_mod->*m_get_direct_mem_ptr)(m_id, tx, dmi_data);
- }
-
- virtual unsigned int transport_dbg(tlm::tlm_generic_payload& tx) override {
- return (m_mod->*m_transport_dbg)(m_id, tx);
- }
-
- virtual tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& tx,
- tlm::tlm_phase& phase,
- sc_core::sc_time& t) override {
- std::fprintf(stderr,
- "tlm_target_socket_tagged: nb_transport_fw not supported\n");
- std::abort();
- }
-
- // -- MEMBER -----------------------------------------------------------------
-
- std::size_t m_id{0};
- Module* m_mod{nullptr};
- cb_b_transport m_b_transport{nullptr};
- cb_get_direct_mem_ptr m_get_direct_mem_ptr{nullptr};
- cb_transport_dbg m_transport_dbg{nullptr};
-};
-
class lt_bus : public sc_core::sc_module {
using target_socket = tlm_target_socket_tagged<lt_bus>;
using target_socket_ptr = std::unique_ptr<target_socket>;
@@ -163,7 +25,7 @@ class lt_bus : public sc_core::sc_module {
// -- ATTACH BUS INITIATOR ---------------------------------------------------
void attach_initiator(tlm::tlm_base_initiator_socket_b<>& init) {
- const std::size_t id = m_initiators.size();
+ const usize id = m_initiators.size();
const std::string name = "init" + std::to_string(id);
{
// Add current module on top of module stack for tlm sockets.
@@ -183,8 +45,8 @@ class lt_bus : public sc_core::sc_module {
// -- ATTACH BUS TARGET ------------------------------------------------------
void attach_target(tlm::tlm_base_target_socket_b<>& target,
- std::uint64_t start,
- std::uint64_t end) {
+ u64 start,
+ u64 end) {
const range addr{start, end};
// Check if new range overlaps with any registered memory map range.
@@ -199,7 +61,7 @@ class lt_bus : public sc_core::sc_module {
}
}
- const std::size_t id = m_targets.size();
+ const usize id = m_targets.size();
const std::string name = "target" + std::to_string(id);
{
// Add current module on top of module stack for tlm sockets.
@@ -218,10 +80,20 @@ class lt_bus : public sc_core::sc_module {
m_mappings.push_back({addr, id});
}
+ // -- DUMP -------------------------------------------------------------------
+
+ void dump() const {
+ // Dump memory map.
+ for (const auto& map : m_mappings) {
+ std::printf("%08lx - %08lx :[%2ld] %s\n", map.addr.start, map.addr.end,
+ map.idx, m_targets[map.idx].get()->name());
+ }
+ }
+
private:
// -- TLM_BW_TRANSPORT_IF ----------------------------------------------------
- void invalidate_direct_mem_ptr(std::size_t id,
+ void invalidate_direct_mem_ptr(usize id,
sc_dt::uint64 start,
sc_dt::uint64 end) {
for (const auto& map : m_mappings) {
@@ -238,11 +110,11 @@ class lt_bus : public sc_core::sc_module {
// -- TLM_FW_TRANSPORT_IF ----------------------------------------------------
- void b_transport(std::size_t id,
+ void b_transport(usize id,
tlm::tlm_generic_payload& tx,
sc_core::sc_time& t) {
- std::uint64_t start = tx.get_address();
- std::uint64_t end = start + tx.get_data_length() - 1;
+ u64 start = tx.get_address();
+ u64 end = start + tx.get_data_length() - 1;
if (auto res = decode(range{start, end})) {
assert(res.base <= start);
@@ -255,11 +127,11 @@ class lt_bus : public sc_core::sc_module {
}
}
- bool get_direct_mem_ptr(std::size_t,
+ bool get_direct_mem_ptr(usize,
tlm::tlm_generic_payload& tx,
tlm::tlm_dmi& dmi) {
- std::uint64_t start = tx.get_address();
- std::uint64_t end = start + tx.get_data_length() - 1;
+ u64 start = tx.get_address();
+ u64 end = start + tx.get_data_length() - 1;
bool ret = false;
if (auto res = decode(range{start, end})) {
@@ -272,9 +144,9 @@ class lt_bus : public sc_core::sc_module {
return ret;
}
- unsigned int transport_dbg(std::size_t, tlm::tlm_generic_payload& tx) {
- std::uint64_t start = tx.get_address();
- std::uint64_t end = start + tx.get_data_length() - 1;
+ unsigned int transport_dbg(usize, tlm::tlm_generic_payload& tx) {
+ u64 start = tx.get_address();
+ u64 end = start + tx.get_data_length() - 1;
unsigned int ret = 0;
if (auto res = decode(range{start, end})) {
@@ -291,7 +163,7 @@ class lt_bus : public sc_core::sc_module {
struct decode_result {
initiator_socket* sock{nullptr};
- std::uint64_t base;
+ u64 base;
constexpr explicit operator bool() const {
return sock != nullptr;
@@ -315,19 +187,13 @@ class lt_bus : public sc_core::sc_module {
[](const mapping& lhs, const mapping& rhs) {
return lhs.addr.start < rhs.addr.start;
});
-
- // Dump memory map.
- // for (const auto& map : m_mappings) {
- // std::printf("%08lx - %08lx :[%2ld] %s\n", map.addr.start, map.addr.end,
- // map.idx, m_targets[map.idx].get()->name());
- // }
}
// -- LOCAL CLASSES ----------------------------------------------------------
struct mapping {
range addr;
- std::size_t idx;
+ usize idx;
};
// -- MEMBER -----------------------------------------------------------------
diff --git a/src/sc_export.cc b/src/sc_export.cc
index 7acca58..e3d475b 100644
--- a/src/sc_export.cc
+++ b/src/sc_export.cc
@@ -1,5 +1,5 @@
#include <systemc>
-#include "utils.h"
+#include "utils/log.h"
using sc_core::sc_export;
using sc_core::sc_in;
diff --git a/src/sc_export2.cc b/src/sc_export2.cc
index c5905bc..42381d2 100644
--- a/src/sc_export2.cc
+++ b/src/sc_export2.cc
@@ -1,5 +1,5 @@
#include <systemc>
-#include "utils.h"
+#include "utils/log.h"
// This file gives an example on how to define an own interface and use that
// interface to communicate between two sc_modules.
diff --git a/src/utils.h b/src/utils/log.h
index 1373b90..49b7ca8 100644
--- a/src/utils.h
+++ b/src/utils/log.h
@@ -1,11 +1,11 @@
-#ifndef UTILS_H
-#define UTILS_H
+#ifndef SYSC_PLAYGROUND_LOG
+#define SYSC_PLAYGROUND_LOG
#include <cstdio>
#define LOG(FMT, ...) \
do { \
- std::fprintf(stderr, "%10s | %4lld:%2lld | %12s | " FMT "\n", \
+ std::fprintf(stderr, "%10s | %4lld:%2lld | %16s | " FMT "\n", \
sc_core::sc_time_stamp().to_string().c_str(), \
sc_core::sc_delta_count(), \
sc_core::sc_delta_count_at_current_time(), __FUNCTION__, \
diff --git a/src/utils/range.h b/src/utils/range.h
new file mode 100644
index 0000000..ce25298
--- /dev/null
+++ b/src/utils/range.h
@@ -0,0 +1,25 @@
+#ifndef SYSC_PLAYGROUND_RANGE
+#define SYSC_PLAYGROUND_RANGE
+
+#include "utils/types.h"
+
+#include <cassert>
+
+struct range {
+ constexpr explicit range(u64 start, u64 end) : start{start}, end{end} {
+ assert(start < end);
+ }
+
+ constexpr bool overlaps(range rhs) const {
+ return start <= rhs.end && rhs.start <= end;
+ }
+
+ constexpr bool contains(range rhs) const {
+ return start <= rhs.start && rhs.end <= end;
+ }
+
+ u64 start;
+ u64 end;
+};
+
+#endif
diff --git a/src/utils/sysc.h b/src/utils/sysc.h
new file mode 100644
index 0000000..02ad412
--- /dev/null
+++ b/src/utils/sysc.h
@@ -0,0 +1,24 @@
+#ifndef SYSC_PLAYGROUND_SYSC
+#define SYSC_PLAYGROUND_SYSC
+
+#include <sysc/kernel/sc_module.h>
+#include <sysc/kernel/sc_simcontext.h>
+
+struct scoped_push_hierarchy {
+ [[nodiscard]] explicit scoped_push_hierarchy(sc_core::sc_module& mod)
+ : m_mod(mod), m_simctx(sc_core::sc_get_curr_simcontext()) {
+ assert(m_simctx);
+ m_simctx->hierarchy_push(&m_mod);
+ }
+
+ ~scoped_push_hierarchy() {
+ const auto* top = m_simctx->hierarchy_pop();
+ assert(top == &m_mod);
+ }
+
+ private:
+ sc_core::sc_simcontext* m_simctx{nullptr};
+ sc_core::sc_module& m_mod;
+};
+
+#endif
diff --git a/src/utils/tlm_initiator_socket_tagged.h b/src/utils/tlm_initiator_socket_tagged.h
new file mode 100644
index 0000000..f85ed91
--- /dev/null
+++ b/src/utils/tlm_initiator_socket_tagged.h
@@ -0,0 +1,48 @@
+#ifndef SYSC_PLAYGROUND_TAGGED_INITIATOR
+#define SYSC_PLAYGROUND_TAGGED_INITIATOR
+
+#include <tlm_core/tlm_2/tlm_sockets/tlm_initiator_socket.h>
+
+template <typename Module>
+class tlm_initiator_socket_tagged : public tlm::tlm_initiator_socket<>,
+ public tlm::tlm_bw_transport_if<> {
+ using cb_invalidate_direct_mem_ptr = void (Module::*)(std::size_t,
+ sc_dt::uint64,
+ sc_dt::uint64);
+
+ public:
+ explicit tlm_initiator_socket_tagged(const char* name,
+ std::size_t id,
+ Module* mod,
+ cb_invalidate_direct_mem_ptr i)
+ : tlm_initiator_socket<>{name},
+ m_mod{mod},
+ m_id{id},
+ m_invalidate_direct_mem_ptr{i} {
+ bind(*static_cast<tlm::tlm_bw_transport_if<>*>(this));
+ }
+
+ private:
+ // -- TLM_BW_TRANSPORT_IF ----------------------------------------------------
+
+ virtual void invalidate_direct_mem_ptr(sc_dt::uint64 start,
+ sc_dt::uint64 end) override {
+ (m_mod->*m_invalidate_direct_mem_ptr)(m_id, start, end);
+ }
+
+ virtual tlm::tlm_sync_enum nb_transport_bw(tlm::tlm_generic_payload&,
+ tlm::tlm_phase&,
+ sc_core::sc_time&) override {
+ std::fprintf(
+ stderr, "tlm_initiator_socket_tagged: nb_transport_bw not supported\n");
+ std::abort();
+ }
+
+ // -- MEMBER -----------------------------------------------------------------
+
+ std::size_t m_id{0};
+ Module* m_mod{nullptr};
+ cb_invalidate_direct_mem_ptr m_invalidate_direct_mem_ptr{nullptr};
+};
+
+#endif
diff --git a/src/utils/tlm_target_socket_tagged.h b/src/utils/tlm_target_socket_tagged.h
new file mode 100644
index 0000000..99ed547
--- /dev/null
+++ b/src/utils/tlm_target_socket_tagged.h
@@ -0,0 +1,69 @@
+#ifndef SYSC_PLAYGROUND_TAGGED_TARGET
+#define SYSC_PLAYGROUND_TAGGED_TARGET
+
+#include <tlm_core/tlm_2/tlm_sockets/tlm_target_socket.h>
+
+template <typename Module>
+class tlm_target_socket_tagged : public tlm::tlm_target_socket<>,
+ public tlm::tlm_fw_transport_if<> {
+ using cb_b_transport = void (Module::*)(std::size_t,
+ tlm::tlm_generic_payload&,
+ sc_core::sc_time&);
+
+ using cb_get_direct_mem_ptr = bool (Module::*)(std::size_t,
+ tlm::tlm_generic_payload&,
+ tlm::tlm_dmi&);
+ using cb_transport_dbg = unsigned int (Module::*)(std::size_t,
+ tlm::tlm_generic_payload&);
+
+ public:
+ explicit tlm_target_socket_tagged(const char* name,
+ std::size_t id,
+ Module* mod,
+ cb_b_transport b,
+ cb_get_direct_mem_ptr m,
+ cb_transport_dbg d)
+ : tlm_target_socket<>{name},
+ m_mod{mod},
+ m_id{id},
+ m_b_transport{b},
+ m_get_direct_mem_ptr{m},
+ m_transport_dbg{d} {
+ bind(*static_cast<tlm::tlm_fw_transport_if<>*>(this));
+ }
+
+ private:
+ // -- TLM_FW_TRANSPORT_IF ----------------------------------------------------
+
+ virtual void b_transport(tlm::tlm_generic_payload& tx,
+ sc_core::sc_time& t) override {
+ return (m_mod->*m_b_transport)(m_id, tx, t);
+ }
+
+ virtual bool get_direct_mem_ptr(tlm::tlm_generic_payload& tx,
+ tlm::tlm_dmi& dmi_data) override {
+ return (m_mod->*m_get_direct_mem_ptr)(m_id, tx, dmi_data);
+ }
+
+ virtual unsigned int transport_dbg(tlm::tlm_generic_payload& tx) override {
+ return (m_mod->*m_transport_dbg)(m_id, tx);
+ }
+
+ virtual tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& tx,
+ tlm::tlm_phase& phase,
+ sc_core::sc_time& t) override {
+ std::fprintf(stderr,
+ "tlm_target_socket_tagged: nb_transport_fw not supported\n");
+ std::abort();
+ }
+
+ // -- MEMBER -----------------------------------------------------------------
+
+ std::size_t m_id{0};
+ Module* m_mod{nullptr};
+ cb_b_transport m_b_transport{nullptr};
+ cb_get_direct_mem_ptr m_get_direct_mem_ptr{nullptr};
+ cb_transport_dbg m_transport_dbg{nullptr};
+};
+
+#endif
diff --git a/src/utils/types.h b/src/utils/types.h
new file mode 100644
index 0000000..a13b8ef
--- /dev/null
+++ b/src/utils/types.h
@@ -0,0 +1,11 @@
+#ifndef SYSC_PLAYGROUND_TYPES
+#define SYSC_PLAYGROUND_TYPES
+
+#include <cstdint>
+
+using u32 = std::uint32_t;
+using u64 = std::uint64_t;
+
+using usize = std::size_t;
+
+#endif