From c15fd95d4c152c760485d4e79a5325e8d5c37fa5 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 30 Jun 2024 20:22:19 +0200 Subject: [PATCH] updates README.md, FW, some names and does some cleanup --- .cproject | 5 +- .gitpod.yml | 4 +- CMakeLists.txt | 2 +- README.md | 110 +++++---------------- dbt-rise-riscv | 2 +- fw/.gitignore | 1 + fw/hello-world/.gitignore | 3 + fw/hello-world/Makefile | 17 ++++ fw/hello-world/hello.c | 24 +++++ fw/hello-world/prebuilt/hello.elf | Bin 0 -> 64360 bytes src/CLIParser.cpp | 2 +- src/vp/gen/PipelinedMemoryBusToApbBridge.h | 6 +- src/vp/gen/platform_mmap.h | 26 ----- src/vp/platform.rdl | 25 ----- src/vp/system.cpp | 1 - src/vp/system.h | 6 +- 16 files changed, 81 insertions(+), 153 deletions(-) create mode 100644 fw/.gitignore create mode 100644 fw/hello-world/.gitignore create mode 100644 fw/hello-world/Makefile create mode 100644 fw/hello-world/hello.c create mode 100755 fw/hello-world/prebuilt/hello.elf delete mode 100644 src/vp/gen/platform_mmap.h delete mode 100644 src/vp/platform.rdl diff --git a/.cproject b/.cproject index da3a85e..f2a8b0a 100644 --- a/.cproject +++ b/.cproject @@ -12,7 +12,7 @@ - + @@ -99,11 +99,12 @@ - + + diff --git a/.gitpod.yml b/.gitpod.yml index c41875c..1bac205 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -9,10 +9,10 @@ tasks: python3 -m venv /workspace/venv python3 -m pip install --upgrade pip source /workspace/venv/bin/activate - pip install 'conan<2.0' + pip install conan command: | source /workspace/venv/bin/activate - cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON + cmake -B build --preset=Release -DBUILD_SHARED_LIBS=ON cmake --build build vscode: extensions: diff --git a/CMakeLists.txt b/CMakeLists.txt index 37e7daa..3fc3c6c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,6 +84,6 @@ if(FW_BUILD) if(NOT riscvfw_POPULATED) FetchContent_Populate(riscvfw) endif() - set(BOARD tgc_vp) + set(BOARD ehrenberg) add_subdirectory(${riscvfw_SOURCE_DIR}) endif() diff --git a/README.md b/README.md index 325fddc..47602f6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ -# TGC-VP -The Scale4Edge ecosystem VP using VP-VIBES peripherals. +# RISCV-VP + +A RISC-V VP using VP-VIBES peripherals. This VP is based in MINRES TGC series cores and uses CoreDSL to generate the concrete ISS of a particular ISA + extensions. The generator approach makes it very flexible and adaptable. @@ -8,7 +9,7 @@ provides a comprehensive and consistent solution to develop processor cores. ## Ultra Quick start -Using gitpod you can run the VP in the cloud. Just visit [Gitpod.io](https://www.gitpod.io/#https://github.com/Minres/TGC-VP/tree/develop) +Using gitpod you can run the VP in the cloud. Just visit [Gitpod.io](https://www.gitpod.io/#https://github.com/Minres/RISCV-VP/tree/develop) and follow the instructions. After the build finished you can run ``` @@ -31,96 +32,29 @@ You will see on console the prints of the hello world firmware at fw/hello-world [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/Minres/TGC-VP) -## Quick start +## Build instructions for Linux -* you need to have a C++14 capable compiler, make, python, and cmake installed +You need to have a C++17 capable compiler, make or Ninja, Python 3, and CMake installed. -* install conan.io (see also http://docs.conan.io/en/latest/installation.html): +To install conan.io version 2.0 and above (see also http://docs.conan.io/en/latest/installation.html) execute the following: - ``` - - pip3 install --user conan - - ``` - - It is advised to use conan version 1.36 or newer. In case of an older version please run - - ```sh - - pip3 install --user --upgrade conan - - ``` - - Installing conan for the first time you need to create a profile: - - ``` - - conan profile create default --detect - - ``` - -* checkout source from git - - ```sh - - git clone --recursive -b develop https://github.com/Minres/TGC-VP.git - - ``` - -* start an out-of-source build: - - ``` - - cd TGC-VP - mkdir build - cd build - cmake .. - make -j tgc-vp - - ``` - -* run the VP with pre-built firmware - - ``` - - ctest - - ``` - - or - - ``` - - src/tgc-vp -f ../fw/hello-world/prebuild/hello.elf - - ``` - -To rebuild the firmware you need to install a RISC-V toolchain like https://github.com/riscv/riscv-tools. - -# Windows/Visual Studio build - -TGC-VP supports VS2019/MSVC 16 and has been tested only with this version - -## Prerequisites - -You need to have to following installed: - -* Visual Studio 2019 (community edition is sufficient) with C/C++ support -* Python 3.6 or newer -* SystemC 2.3.3 and SystemC-CCI 1.0.0. Both should be installed into the same location and the - environment variable SYSTEMC_HOME should point to it -* Conan (https://conan.io/) version 1.36 or newer. If python is installed this can be installed using pip - (see above in [Quick start](#quick-start)) - -## build step - -Create a project at the location of the git workarea. This can be done - +``` +python3 -m venv .venv +. .venv/bin/activate +pip3 install conan +conan profile new default --detect ``` -devenv +Building the VP is as simple as: +``` +cmake -S . -B build/Release --preset Release && cmake --build build/Release -j24 ``` -The build steps are as described in the VS documentation for CMake based projects. - +Building a debug version is analogous: + +``` +cmake -S . -B build/Debug --preset Debug && cmake --build build/Debug -j24 +``` + +To build some firmware you need to install a RISC-V toolchain like https://github.com/riscv/riscv-tools. diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 85e2ced..0aaf363 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 85e2cedb1a9cc86aae4d63e77627df18fc1e3923 +Subproject commit 0aaf3633fb0192389b5bc937b5f6f83e111bb3e6 diff --git a/fw/.gitignore b/fw/.gitignore new file mode 100644 index 0000000..0e8815f --- /dev/null +++ b/fw/.gitignore @@ -0,0 +1 @@ +/fir diff --git a/fw/hello-world/.gitignore b/fw/hello-world/.gitignore new file mode 100644 index 0000000..ebea2da --- /dev/null +++ b/fw/hello-world/.gitignore @@ -0,0 +1,3 @@ +/hello +/hello.dis +/firmware.map diff --git a/fw/hello-world/Makefile b/fw/hello-world/Makefile new file mode 100644 index 0000000..c7efb06 --- /dev/null +++ b/fw/hello-world/Makefile @@ -0,0 +1,17 @@ + +TARGET = hello +C_SRCS = $(wildcard *.c) +HEADERS = $(wildcard *.h) +CFLAGS += -O0 -g + +BOARD=tgc_vp +LINK_TARGET=link +RISCV_ARCH:=rv32imc +RISCV_ABI:=ilp32 +LDFLAGS := -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) + +compiler := $(shell which riscv32-unknown-elf-gcc) +TOOL_DIR=$(dir $(compiler)) + +BSP_BASE = ../bsp +include $(BSP_BASE)/env/common-gcc.mk diff --git a/fw/hello-world/hello.c b/fw/hello-world/hello.c new file mode 100644 index 0000000..91bf133 --- /dev/null +++ b/fw/hello-world/hello.c @@ -0,0 +1,24 @@ +#include +#include +#include + +#include +#include "encoding.h" + +int factorial(int i){ + + volatile int result = 1; + for (int ii = 1; ii <= i; ii++) { + result = result * ii; + } + return result; + +} + +int main() +{ + volatile int result = factorial (10); + printf("Factorial is %d\n", result); + printf("End of execution"); + return 0; +} diff --git a/fw/hello-world/prebuilt/hello.elf b/fw/hello-world/prebuilt/hello.elf new file mode 100755 index 0000000000000000000000000000000000000000..5f9677b5bdb29265d0250f17870ffff2c986d015 GIT binary patch literal 64360 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 literal 0 HcmV?d00001 diff --git a/src/CLIParser.cpp b/src/CLIParser.cpp index e80ed7d..92c4ab9 100644 --- a/src/CLIParser.cpp +++ b/src/CLIParser.cpp @@ -83,7 +83,7 @@ void CLIParser::build() { "enable gdb server and specify port to use") ("backend", po::value()->default_value("interp"), "the ISS backend to use, options are: interp, tcc") - ("isa", po::value()->default_value("tgc5c"), + ("isa", po::value()->default_value("rv32imac"), "core or isa name to use for simulation, use '?' to get list") ("dump-ir", "dump the intermediate representation") diff --git a/src/vp/gen/PipelinedMemoryBusToApbBridge.h b/src/vp/gen/PipelinedMemoryBusToApbBridge.h index df1acc7..0ff5bea 100644 --- a/src/vp/gen/PipelinedMemoryBusToApbBridge.h +++ b/src/vp/gen/PipelinedMemoryBusToApbBridge.h @@ -10,12 +10,12 @@ #pragma once // need double braces, see https://stackoverflow.com/questions/6893700/how-to-construct-stdarray-object-with-initializer-list#6894191 -const std::array, 6> PipelinedMemoryBusToApbBridge_map = {{ +const std::array, 7> 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 }, - }} ; \ No newline at end of file + { boot_rom.target, 0x80000, 0x2000 }, + }} ; diff --git a/src/vp/gen/platform_mmap.h b/src/vp/gen/platform_mmap.h deleted file mode 100644 index 9f8b352..0000000 --- a/src/vp/gen/platform_mmap.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2019 -2021 MINRES Technolgies GmbH - * - * SPDX-License-Identifier: Apache-2.0 - */ -#ifndef _PLATFORM_MMAP_H_ -#define _PLATFORM_MMAP_H_ -// need double braces, see -// https://stackoverflow.com/questions/6893700/how-to-construct-stdarray-object-with-initializer-list#6894191 -const std::array, 13> platfrom_mmap = {{ - {clint.socket, 0x2000000, 0xc000}, - {plic.socket, 0xc000000, 0x200008}, - {aon.socket, 0x10000000, 0x150}, - {prci.socket, 0x10008000, 0x14}, - {gpio0.socket, 0x10012000, 0x44}, - {uart0.socket, 0x10013000, 0x1c}, - {qspi0.socket, 0x10014000, 0x78}, - {pwm0.socket, 0x10015000, 0x30}, - {uart1.socket, 0x10023000, 0x1c}, - {qspi1.socket, 0x10024000, 0x78}, - {pwm1.socket, 0x10025000, 0x30}, - {qspi2.socket, 0x10034000, 0x78}, - {pwm2.socket, 0x10035000, 0x30}, -}}; - -#endif /* _PLATFORM_MMAP_H_ */ diff --git a/src/vp/platform.rdl b/src/vp/platform.rdl deleted file mode 100644 index aedabcb..0000000 --- a/src/vp/platform.rdl +++ /dev/null @@ -1,25 +0,0 @@ -`include "gpio.rdl" -`include "uart.rdl" -`include "spi.rdl" -`include "pwm.rdl" -`include "plic.rdl" -`include "aon.rdl" -`include "prci.rdl" -`include "clint.rdl" - -addrmap e300_plat_t { - lsb0; - clint_regs clint @0x02000000; - plic_regs plic @0x0C000000; - aon_regs aon @0x10000000; - prci_regs prci @0x10008000; - gpio_regs gpio0 @0x10012000; - uart_regs uart0 @0x10013000; - spi_regs qspi0 @0x10014000; - pwm_regs pwm0 @0x10015000; - uart_regs uart1 @0x10023000; - spi_regs qspi1 @0x10024000; - pwm_regs pwm1 @0x10025000; - spi_regs qspi2 @0x10034000; - pwm_regs pwm2 @0x10035000; -} e300_plat; diff --git a/src/vp/system.cpp b/src/vp/system.cpp index e565092..760d4e0 100644 --- a/src/vp/system.cpp +++ b/src/vp/system.cpp @@ -13,7 +13,6 @@ namespace tgc_vp { using namespace sc_core; using namespace vpvper::minres; -using namespace sysc::tgfs; system::system(sc_core::sc_module_name nm) : sc_core::sc_module(nm) diff --git a/src/vp/system.h b/src/vp/system.h index 516f55f..a0a3df7 100644 --- a/src/vp/system.h +++ b/src/vp/system.h @@ -52,7 +52,7 @@ public: system(sc_core::sc_module_name nm); private: - sysc::tgfs::core_complex core_complex{"core_complex"}; + sysc::riscv_vp::core_complex core_complex{"core_complex"}; scc::router<> ahb_router, apbBridge; vpvper::minres::gpio_tl gpio0{"gpio0"}; vpvper::minres::uart_tl uart0{"uart0"}; @@ -61,8 +61,8 @@ private: vpvper::minres::irq_tl irq_ctrl{"irq_ctrl"}; vpvper::minres::qspi_tl qspi{"qspi"}; - //scc::memory<1_kB, scc::LT> bootloader{"bootloader"}; - scc::memory<32_kB, scc::LT> mem_ram {"mem_ram"}; + scc::memory<128_kB, scc::LT> mem_ram {"mem_ram"}; + scc::memory<8_kB, scc::LT> boot_rom {"boot_rom"}; sc_core::sc_signal rst_s{"rst_s"}, mtime_int_s{"mtime_int_s"}, msip_int_s{"msip_int_s"};