diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 778f9bc..a61b9c3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -21,7 +21,7 @@ add_executable(${PROJECT_NAME} ) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}) target_force_link_libraries(${PROJECT_NAME} PUBLIC dbt-rise-tgc_sc) -target_link_libraries(${PROJECT_NAME} PUBLIC vpvper_generic vpvper_sifive ${BOOST_program_options_LIBRARY}) +target_link_libraries(${PROJECT_NAME} PUBLIC vpvper_generic vpvper_minres ${BOOST_program_options_LIBRARY}) if(TARGET Boost::program_options) target_link_libraries(${PROJECT_NAME} PUBLIC Boost::program_options Boost::thread) else() diff --git a/test_gen/PipelinedMemoryBusToApbBridge.h b/src/tgc_vp/gen/PipelinedMemoryBusToApbBridge.h similarity index 51% rename from test_gen/PipelinedMemoryBusToApbBridge.h rename to src/tgc_vp/gen/PipelinedMemoryBusToApbBridge.h index c7954fd..df1acc7 100644 --- a/test_gen/PipelinedMemoryBusToApbBridge.h +++ b/src/tgc_vp/gen/PipelinedMemoryBusToApbBridge.h @@ -1,22 +1,21 @@ /* - * Copyright (c) 2023 MINRES Technologies GmbH - * - * SPDX-License-Identifier: Apache-2.0 - * - * Created on: «new Date» - * * «componentDefinition.effectiveName».h Author: - * +* Copyright (c) 2023 - 2024 MINRES Technologies GmbH +* +* SPDX-License-Identifier: Apache-2.0 +* +* Generated at 2024-02-08 14:41:56 UTC +* by peakrdl_mnrs version 1.2.2 */ #pragma once // need double braces, see https://stackoverflow.com/questions/6893700/how-to-construct-stdarray-object-with-initializer-list#6894191 -const std::array, 7> PipelinedMemoryBusToApbBridge_map = {{ +const std::array, 6> PipelinedMemoryBusToApbBridge_map = {{ { gpio0.socket, 0x0, 0xc }, { uart0.socket, 0x1000, 0x14 }, { timer0.socket, 0x20000, 0x1c }, { aclint.socket, 0x30000, 0xc000 }, { irq_ctrl.socket, 0x40000, 0x8 }, { qspi.socket, 0x50000, 0x5c }, - { bootloader.socket, 0x80000, 0x400 }, + //{ bootloader.socket, 0x80000, 0x400 }, }} ; \ No newline at end of file diff --git a/src/tgc_vp/system.cpp b/src/tgc_vp/system.cpp index 1dedcbc..5d48fc6 100644 --- a/src/tgc_vp/system.cpp +++ b/src/tgc_vp/system.cpp @@ -5,124 +5,91 @@ */ #include "tgc_vp/system.h" +#include "minres/timer.h" +#include "minres/uart.h" +#include "scc/utilities.h" namespace tgc_vp { using namespace sc_core; -using namespace vpvper::sifive; +using namespace vpvper::minres; using namespace sysc::tgfs; system::system(sc_core::sc_module_name nm) : sc_core::sc_module(nm) -, NAMED(router, platfrom_mmap.size() + 2, 2) -{ - core_complex.ibus(router.target[0]); - core_complex.dbus(router.target[1]); +, NAMED(ahb_router, 3, 2) +, NAMED(apbBridge, PipelinedMemoryBusToApbBridge_map.size(), 1){ + core_complex.ibus(ahb_router.target[0]); + core_complex.dbus(ahb_router.target[1]); + + ahb_router.initiator.at(0)(qspi.xip_sck); + ahb_router.set_target_range(0, 0xE0000000, 16_MB); + ahb_router.initiator.at(1)(mem_ram.target); + ahb_router.set_target_range(1, 0x80000000, 32_kB); + ahb_router.initiator.at(2)(apbBridge.target[0]); + ahb_router.set_target_range(2, 0xF0000000, 256_MB); + size_t i = 0; - for (const auto &e : platfrom_mmap) { - router.initiator.at(i)(e.target); - router.set_target_range(i, e.start, e.size); + for (const auto &e : PipelinedMemoryBusToApbBridge_map) { + apbBridge.initiator.at(i)(e.target); + apbBridge.set_target_range(i, e.start, e.size); i++; } - router.initiator.at(i)(mem_qspi.target); - router.set_target_range(i, 0x20000000, 512_MB); - router.initiator.at(++i)(mem_ram.target); - router.set_target_range(i, 0x80000000, 128_kB); - uart1.clk_i(tlclk_s); - qspi0.clk_i(tlclk_s); - qspi1.clk_i(tlclk_s); - qspi2.clk_i(tlclk_s); - pwm0.clk_i(tlclk_s); - pwm1.clk_i(tlclk_s); - pwm2.clk_i(tlclk_s); - gpio0.clk_i(tlclk_s); - plic.clk_i(tlclk_s); - aon.clk_i(tlclk_s); - aon.lfclkc_o(lfclk_s); - prci.hfclk_o(tlclk_s); // clock driver - clint.tlclk_i(tlclk_s); - clint.lfclk_i(lfclk_s); - core_complex.clk_i(tlclk_s); - mem_qspi.clk_i(tlclk_s); - mem_ram.clk_i(tlclk_s); + gpio0.clk_i(clk_i); + uart0.clk_i(clk_i); + timer0.clk_i(clk_i); + aclint.clk_i(clk_i); + irq_ctrl.clk_i(clk_i); + qspi.clk_i(clk_i); + core_complex.clk_i(clk_i); + //mem_ram.clk_i(clk_i); - uart0.rst_i(rst_s); - uart1.rst_i(rst_s); - qspi0.rst_i(rst_s); - qspi1.rst_i(rst_s); - qspi2.rst_i(rst_s); - pwm0.rst_i(rst_s); - pwm1.rst_i(rst_s); - pwm2.rst_i(rst_s); gpio0.rst_i(rst_s); - plic.rst_i(rst_s); - aon.rst_o(rst_s); - prci.rst_i(rst_s); - clint.rst_i(rst_s); + uart0.rst_i(rst_s); + timer0.rst_i(rst_s); + aclint.rst_i(rst_s); + irq_ctrl.rst_i(rst_s); + qspi.rst_i(rst_s); core_complex.rst_i(rst_s); - aon.erst_n_i(erst_n); + aclint.mtime_int_o(mtime_int_s); + aclint.msip_int_o(msip_int_s); + irq_ctrl.irq_o(core_int_s); + irq_ctrl.pending_irq_i(irq_int_s); - clint.mtime_int_o(mtime_int_s); - clint.msip_int_o(msie_int_s); + uart0.irq_o(irq_int_s[0]); + timer0.interrupt_o[0](irq_int_s[1]); + timer0.interrupt_o[1](irq_int_s[2]); + qspi.irq_o(irq_int_s[3]); - plic.global_interrupts_i(global_int_s); - plic.core_interrupt_o(core_int_s); - - core_complex.sw_irq_i(msie_int_s); core_complex.timer_irq_i(mtime_int_s); core_complex.ext_irq_i(core_int_s); core_complex.local_irq_i(local_int_s); + core_complex.sw_irq_i(msip_int_s); - pins_i(gpio0.pins_i); + gpio0.pins_i(pins_i); gpio0.pins_o(pins_o); + gpio0.oe_o(pins_oe_o); - uart0.irq_o(global_int_s[3]); + uart0.tx_o(uart0_tx_o); + uart0.rx_i(uart0_rx_i); - gpio0.iof0_i[5](qspi1.sck_o); - gpio0.iof0_i[3](qspi1.mosi_o); - qspi1.miso_i(gpio0.iof0_o[4]); - gpio0.iof0_i[2](qspi1.scs_o[0]); - gpio0.iof0_i[9](qspi1.scs_o[2]); - gpio0.iof0_i[10](qspi1.scs_o[3]); + timer0.clear_i(t0_clear_i); + timer0.tick_i(t0_tick_i); - qspi0.irq_o(global_int_s[5]); - qspi1.irq_o(global_int_s[6]); - qspi2.irq_o(global_int_s[7]); + qspi.ssclk_o(ssclk_o); + qspi.dq_o(dq_o); + qspi.dq_i(dq_i); + qspi.oe_o(dq_oe_o); - gpio0.iof0_i[16](uart1.tx_o); - uart1.rx_i(gpio0.iof0_o[17]); - uart1.irq_o(global_int_s[4]); - - gpio0.iof1_i[0](pwm0.cmpgpio_o[0]); - gpio0.iof1_i[1](pwm0.cmpgpio_o[1]); - gpio0.iof1_i[2](pwm0.cmpgpio_o[2]); - gpio0.iof1_i[3](pwm0.cmpgpio_o[3]); - - gpio0.iof1_i[10](pwm2.cmpgpio_o[0]); - gpio0.iof1_i[11](pwm2.cmpgpio_o[1]); - gpio0.iof1_i[12](pwm2.cmpgpio_o[2]); - gpio0.iof1_i[13](pwm2.cmpgpio_o[3]); - - gpio0.iof1_i[19](pwm1.cmpgpio_o[0]); - gpio0.iof1_i[20](pwm1.cmpgpio_o[1]); - gpio0.iof1_i[21](pwm1.cmpgpio_o[2]); - gpio0.iof1_i[22](pwm1.cmpgpio_o[3]); - - pwm0.cmpip_o[0](global_int_s[40]); - pwm0.cmpip_o[1](global_int_s[41]); - pwm0.cmpip_o[2](global_int_s[42]); - pwm0.cmpip_o[3](global_int_s[43]); - - pwm1.cmpip_o[0](global_int_s[44]); - pwm1.cmpip_o[1](global_int_s[45]); - pwm1.cmpip_o[2](global_int_s[46]); - pwm1.cmpip_o[3](global_int_s[47]); - - pwm2.cmpip_o[0](global_int_s[48]); - pwm2.cmpip_o[1](global_int_s[49]); - pwm2.cmpip_o[2](global_int_s[50]); - pwm2.cmpip_o[3](global_int_s[51]); + SC_METHOD(gen_reset); + sensitive << erst_n; +} +void system::gen_reset(){ + if(erst_n.read()) + rst_s = 0; + else rst_s = 1; } + } /* namespace sysc */ diff --git a/src/tgc_vp/system.h b/src/tgc_vp/system.h index be94f29..014fa1a 100644 --- a/src/tgc_vp/system.h +++ b/src/tgc_vp/system.h @@ -7,20 +7,21 @@ #ifndef _PLATFORM_H_ #define _PLATFORM_H_ -#include -#include -#include -#include -#include -#include -#include +#include "minres/irq.h" +#include "minres/timer.h" +#include +#include +#include +#include +#include #include -#include -#include +#include #include #include #include #include +#include +#include #include #include #include @@ -32,8 +33,19 @@ class system : public sc_core::sc_module { public: SC_HAS_PROCESS(system);// NOLINT - sc_core::sc_vector> pins_o{"pins_o", 32}; - sc_core::sc_vector> pins_i{"pins_i", 32}; + sc_core::sc_vector> pins_o{"pins_o",32}; + sc_core::sc_vector> pins_oe_o{"pins_oe_o", 32}; + sc_core::sc_vector> pins_i{"pins_i", 32}; + sc_core::sc_out uart0_tx_o {"uart0_tx_o"}; + sc_core::sc_in uart0_rx_i {"uart0_rx_i"}; + sc_core::sc_vector> t0_clear_i {"t0_clear_i", vpvper::minres::timer::CLEAR_CNT}; + sc_core::sc_vector> t0_tick_i {"t0_tick_i", vpvper::minres::timer::TICK_CNT-1}; + sc_core::sc_out ssclk_o{"ssclk_o"}; + sc_core::sc_vector> dq_o{"dq_o", 4}; + sc_core::sc_vector> dq_oe_o{"dq_oe_o", 4}; + sc_core::sc_vector> dq_i{"dq_i", 4}; + + sc_core::sc_in clk_i{"clk_i"}; sc_core::sc_in erst_n{"erst_n"}; @@ -41,32 +53,24 @@ public: private: sysc::tgfs::core_complex core_complex{"core_complex"}; - scc::router<> router; - vpvper::sifive::uart_terminal uart0{"uart0"}; - vpvper::sifive::uart uart1{"uart1"}; - vpvper::sifive::spi qspi0{"qspi0"}, qspi1{"qspi1"}, qspi2{"qspi2"}; - vpvper::sifive::pwm pwm0{"pwm0"}, pwm1{"pwm1"}, pwm2{"pwm2"}; - vpvper::sifive::gpio gpio0{"gpio0"}; - vpvper::sifive::plic plic{"plic"}; - vpvper::sifive::aon aon{"aon"}; - vpvper::sifive::prci prci{"prci"}; - vpvper::sifive::clint clint{"clint"}; + scc::router<> ahb_router, apbBridge; + vpvper::minres::gpio_tl gpio0{"gpio0"}; + vpvper::minres::uart_tl uart0{"uart0"}; + vpvper::minres::timer_tl timer0{"timer0"}; + vpvper::minres::aclint_tl aclint{"aclint"}; + vpvper::minres::irq_tl irq_ctrl{"irq_ctrl"}; + vpvper::minres::qspi_tl qspi{"qspi"}; - using mem_qspi_t = scc::memory<512_MB, scc::LT>; - mem_qspi_t mem_qspi{"mem_qspi"}; - using mem_ram_t = scc::memory<128_kB, scc::LT>; - mem_ram_t mem_ram{"mem_ram"}; - - sc_core::sc_signal tlclk_s{"tlclk_s"}; - sc_core::sc_signal lfclk_s{"lfclk_s"}; + //scc::memory<1_kB, scc::LT> bootloader{"bootloader"}; + scc::memory<32_kB, scc::LT> mem_ram {"mem_ram"}; + + sc_core::sc_signal rst_s{"rst_s"}, mtime_int_s{"mtime_int_s"}, msip_int_s{"msip_int_s"}; - sc_core::sc_signal rst_s{"rst_s"}, mtime_int_s{"mtime_int_s"}, msie_int_s{"msie_int_s"}; - - sc_core::sc_vector> global_int_s{"global_int_s", 256}, local_int_s{"local_int_s", 16}; + sc_core::sc_vector> irq_int_s{"irq_int_s", 32}, local_int_s{"local_int_s", 16}; sc_core::sc_signal core_int_s{"core_int_s"}; void gen_reset(); -#include "tgc_vp/gen/platform_mmap.h" +#include "tgc_vp/gen/PipelinedMemoryBusToApbBridge.h" }; } /* namespace sysc */ diff --git a/src/tgc_vp/tb.cpp b/src/tgc_vp/tb.cpp index dbacd2d..408c147 100644 --- a/src/tgc_vp/tb.cpp +++ b/src/tgc_vp/tb.cpp @@ -5,20 +5,25 @@ */ #include "tgc_vp/tb.h" +#include namespace tgc_vp { SC_HAS_PROCESS(tb); tb::tb(const sc_core::sc_module_name &nm): sc_core::sc_module(nm) { top.erst_n(rst_n); rst_gen.rst_n(rst_n); - for (auto i = 0U; i < gpio_s.size(); ++i) { - gpio_s[i].in(top.pins_o[i]); - top.pins_i[i](gpio_s[i].out); - } -#ifndef WIN32 - // terminal - terminal.tx_o(gpio_s[16].in); - gpio_s[17].out(terminal.rx_i); -#endif + top.pins_o(pins_o); + top.pins_i(pins_i); + top.pins_oe_o(pins_oe_o); + top.uart0_rx_i(uart0_rx_i); + top.uart0_tx_o(uart0_tx_o); + top.t0_clear_i(t0_clear_i); + top.t0_tick_i(t0_tick_i); + top.ssclk_o(ssclk_o); + top.dq_o(dq_o); + top.dq_i(dq_i); + top.dq_oe_o(dq_oe_o); + top.clk_i(clk_i); + clk_i = 10_ns; } } diff --git a/src/tgc_vp/tb.h b/src/tgc_vp/tb.h index 062905f..7bb2335 100644 --- a/src/tgc_vp/tb.h +++ b/src/tgc_vp/tb.h @@ -19,11 +19,19 @@ public: tb(sc_core::sc_module_name const& nm); tgc_vp::system top{"top"}; tgc_vp::rst_gen rst_gen{"rst_gen"}; - sc_core::sc_vector> gpio_s{"gpio_s", 32}; sc_core::sc_signal rst_n{"rst_n"}; -#ifndef WIN32 // Seasocks not available under windows - vpvper::generic::terminal terminal{"terminal"}; -#endif + sc_core::sc_vector> pins_o{"pins_o",32}; + sc_core::sc_vector> pins_oe_o{"pins_oe_o", 32}; + sc_core::sc_vector> pins_i{"pins_i", 32}; + sc_core::sc_signal uart0_tx_o {"uart0_tx_o"}; + sc_core::sc_signal uart0_rx_i {"uart0_rx_i"}; + sc_core::sc_vector> t0_clear_i {"t0_clear_i", vpvper::minres::timer::CLEAR_CNT}; + sc_core::sc_vector> t0_tick_i {"t0_tick_i", vpvper::minres::timer::TICK_CNT-1}; + sc_core::sc_signal ssclk_o{"ssclk_o"}; + sc_core::sc_vector> dq_o{"dq_o", 4}; + sc_core::sc_vector> dq_oe_o{"dq_oe_o", 4}; + sc_core::sc_vector> dq_i{"dq_i", 4}; + sc_core::sc_signal clk_i{"clk_i"}; }; } /* namespace tgc_vp */ diff --git a/vpvper b/vpvper index 2a3ec57..899316d 160000 --- a/vpvper +++ b/vpvper @@ -1 +1 @@ -Subproject commit 2a3ec57906b8c5a1ab1cb146f214fe0b19aed564 +Subproject commit 899316db7ec527a46c968199a9c0e0f64e48fc2b