aboutsummaryrefslogtreecommitdiff
path: root/rv64cpu/tools
diff options
context:
space:
mode:
Diffstat (limited to 'rv64cpu/tools')
-rw-r--r--rv64cpu/tools/toolchain-riscv64.cmake36
-rw-r--r--rv64cpu/tools/verilator.cmake60
2 files changed, 96 insertions, 0 deletions
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()