From f6441a2e6f901748b504ef93872649c9463a404e Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Sun, 15 Mar 2026 16:07:39 +0800 Subject: initial commit: project architecture --- rv64cpu/tools/toolchain-riscv64.cmake | 36 +++++++++++++++++++++ rv64cpu/tools/verilator.cmake | 60 +++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 rv64cpu/tools/toolchain-riscv64.cmake create mode 100644 rv64cpu/tools/verilator.cmake (limited to 'rv64cpu/tools') diff --git a/rv64cpu/tools/toolchain-riscv64.cmake b/rv64cpu/tools/toolchain-riscv64.cmake new file mode 100644 index 0000000..c177fda --- /dev/null +++ b/rv64cpu/tools/toolchain-riscv64.cmake @@ -0,0 +1,36 @@ +# ─── RISC-V 64 Bare-Metal Toolchain File ───────────────────────────────────────── +# +# Usage: cmake -B build_sw -DCMAKE_TOOLCHAIN_FILE=tools/toolchain-riscv64.cmake +# + +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR riscv64) + +# ─── Toolchain binaries ───────────────────────────────────────────────────────── +set(CROSS_PREFIX "riscv64-unknown-elf-" CACHE STRING "Cross compiler prefix") + +set(CMAKE_C_COMPILER ${CROSS_PREFIX}gcc) +set(CMAKE_CXX_COMPILER ${CROSS_PREFIX}g++) +set(CMAKE_ASM_COMPILER ${CROSS_PREFIX}gcc) +set(CMAKE_OBJCOPY ${CROSS_PREFIX}objcopy) +set(CMAKE_OBJDUMP ${CROSS_PREFIX}objdump) +set(CMAKE_SIZE ${CROSS_PREFIX}size) + +# ─── Architecture flags ───────────────────────────────────────────────────────── +set(RISCV_ARCH "rv64ima" CACHE STRING "RISC-V ISA string") +set(RISCV_ABI "lp64" CACHE STRING "RISC-V ABI") + +set(CMAKE_C_FLAGS_INIT "-march=${RISCV_ARCH} -mabi=${RISCV_ABI} -nostdlib -ffreestanding -fno-builtin -mcmodel=medany") +set(CMAKE_CXX_FLAGS_INIT "${CMAKE_C_FLAGS_INIT} -fno-exceptions -fno-rtti") +set(CMAKE_ASM_FLAGS_INIT "-march=${RISCV_ARCH} -mabi=${RISCV_ABI}") + +set(CMAKE_EXE_LINKER_FLAGS_INIT "-nostartfiles -static -Wl,--gc-sections") + +# ─── Search paths ─────────────────────────────────────────────────────────────── +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +# ─── Disable compiler checks (bare-metal can't run test binaries) ──────────────── +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) diff --git a/rv64cpu/tools/verilator.cmake b/rv64cpu/tools/verilator.cmake new file mode 100644 index 0000000..8c0a006 --- /dev/null +++ b/rv64cpu/tools/verilator.cmake @@ -0,0 +1,60 @@ +# ─── Verilator CMake Helper ────────────────────────────────────────────────────── +# +# Provides the `add_verilator_target()` function to simplify creating +# Verilator simulation executables. +# +# Usage: +# add_verilator_target( +# NAME tb_alu +# TOP_MODULE alu +# SOURCES ${RTL_CORE_DIR}/alu.sv +# INCLUDE_DIRS ${RTL_INCLUDE_DIR} +# TB_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/unit/tb_alu.cpp +# PREFIX Valu +# ) + +function(add_verilator_target) + cmake_parse_arguments(VT + "" # Options + "NAME;TOP_MODULE;PREFIX" # Single-value args + "SOURCES;INCLUDE_DIRS;TB_SOURCES;EXTRA_FLAGS" # Multi-value args + ${ARGN} + ) + + if(NOT VT_PREFIX) + set(VT_PREFIX "V${VT_TOP_MODULE}") + endif() + + # Create C++ executable for the testbench + add_executable(${VT_NAME} ${VT_TB_SOURCES}) + + target_include_directories(${VT_NAME} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/common + ) + + # Build include dir flags + set(_INCLUDE_FLAGS "") + foreach(_dir ${VT_INCLUDE_DIRS}) + list(APPEND _INCLUDE_FLAGS "-I${_dir}") + endforeach() + + # Verilate the RTL sources + verilate(${VT_NAME} + PREFIX ${VT_PREFIX} + SOURCES ${VT_SOURCES} + TOP_MODULE ${VT_TOP_MODULE} + VERILATOR_ARGS + ${VERILATOR_COMMON_FLAGS} + ${_INCLUDE_FLAGS} + ${VT_EXTRA_FLAGS} + ) + + # Register as CTest + add_test( + NAME ${VT_NAME} + COMMAND ${VT_NAME} + ) + + # Set test timeout + set_tests_properties(${VT_NAME} PROPERTIES TIMEOUT 60) +endfunction() -- cgit v1.2.3