From 7f865ae69d244108f38bd2420882982123c1254e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chaine?= Date: Sun, 23 Nov 2025 23:57:37 +0100 Subject: [PATCH 1/7] Integrate testlib v1.1.0 --- CMakeLists.txt | 4 +- tests/CMakeLists.txt | 26 +++--- tests/benches/CMakeLists.txt | 141 +++++++++++++++++++------------ tests/emulator/CMakeLists.txt | 9 +- tests/riscv-tests/CMakeLists.txt | 9 +- 5 files changed, 109 insertions(+), 80 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 387b144..f18c8c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,7 +51,7 @@ add_dependency(ECAP5_TREQ add_dependency(ECAP5_DTESTLIB GIT ecap5/ecap5-dtestlib - TAG tags/v1.0.0) + TAG release/v1.1.0) add_dependency(riscv-tests GIT ecap5/riscv-tests @@ -70,6 +70,8 @@ add_dependency(verilator-cmake include(${verilator_cmake_SOURCE_DIR}/cmake/verilator-config.cmake) include(${ecap5_treq_SOURCE_DIR}/config.cmake) list(APPEND CMAKE_MODULE_PATH "${sphinx_cmake_SOURCE_DIR}/cmake") +include(${ecap5_dtestlib_SOURCE_DIR}/cmake/lint.cmake) +include(${ecap5_dtestlib_SOURCE_DIR}/cmake/testbench.cmake) # Include subdirectories diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6d82886..322e03e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -19,25 +19,25 @@ # You should have received a copy of the GNU General Public License # along with ECAP5-DPROC. If not, see . +# Bench parent directory set(BENCH_DIR ${CMAKE_CURRENT_SOURCE_DIR}/benches/) +# C++ bench include directory set(TEST_INCLUDE_DIR ${ecap5_dtestlib_SOURCE_DIR}/include) -set(SRC_DIR ${CMAKE_SOURCE_DIR}/src/) -set(INCLUDE_DIR ${SRC_DIR}/include/) +# HDL source directories +set(SRC_DIRS ${CMAKE_SOURCE_DIR}/src/) +set(INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/src/include) +# HDL library directories set(LIBS_DIR ${ecap5_dtestlib_SOURCE_DIR}/src/) -set(TESTDATA_DIR ${CMAKE_CURRENT_BINARY_DIR}/testdata/) -set(CONFIG_DIR ${CMAKE_SOURCE_DIR}/config/) - -# Create folders for the waves and testdata -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/waves) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/testdata) +# Bench CSV output directory +set(TESTDATA_DIR ${CMAKE_CURRENT_BINARY_DIR}/) # Lint -file(GLOB SRC_FILES ${SRC_DIR}/*.sv) -file(GLOB INCLUDE_FILES ${INCLUDE_DIR}/*.svh) -add_custom_target(lint - COMMAND verible-verilog-lint ${SRC_FILES} ${INCLUDE_FILES} --rules_config="${CONFIG_DIR}/verible-lint.rules" --waiver_files="${CONFIG_DIR}/verible-lint.waives" - DEPENDS ${SRC_FILES} ${INCLUDE_FILES}) +add_lint_target( + TARGET lint + SRC_DIRS ${SRC_DIRS} +) +# Testbenches add_subdirectory(benches) add_subdirectory(emulator) add_subdirectory(riscv-tests) diff --git a/tests/benches/CMakeLists.txt b/tests/benches/CMakeLists.txt index e7777c3..ed99a76 100644 --- a/tests/benches/CMakeLists.txt +++ b/tests/benches/CMakeLists.txt @@ -19,68 +19,97 @@ # You should have received a copy of the GNU General Public License # along with ECAP5-DPROC. If not, see . -set(SV_HEADERS ${SRC_DIR}/include/ecap5_dproc_pkg.svh - ${SRC_DIR}/include/riscv_pkg.svh) +add_testbench( + MODULE registers + BENCH_DIR ${BENCH_DIR} + LIBS_DIR ${LIBS_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + SRC_DIRS ${SRC_DIRS} + INCLUDE_DIRS ${INCLUDE_DIRS} +) -# Testbench -set(TEST_BINARIES) -set(TEST_TARGETS) -set(TEST_OUTPUTS) -macro(add_testbench module) - cmake_parse_arguments(ARG "" - "BENCH" - "LIBS" - ${ARGN}) +add_testbench( + MODULE fetch + BENCH_DIR ${BENCH_DIR} + LIBS_DIR ${LIBS_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + SRC_DIRS ${SRC_DIRS} + INCLUDE_DIRS ${INCLUDE_DIRS} +) - if("${ARG_BENCH}" STREQUAL "") - set(ARG_BENCH ${module}) - endif() - set(TARGET tb_${ARG_BENCH}) +add_testbench( + MODULE decode + BENCH_DIR ${BENCH_DIR} + LIBS_DIR ${LIBS_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + SRC_DIRS ${SRC_DIRS} + INCLUDE_DIRS ${INCLUDE_DIRS} +) - # Make a file list for testing libraries - list(TRANSFORM ARG_LIBS APPEND ".sv") - list(TRANSFORM ARG_LIBS PREPEND ${LIBS_DIR}) +add_testbench( + MODULE execute + BENCH_DIR ${BENCH_DIR} + LIBS_DIR ${LIBS_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + SRC_DIRS ${SRC_DIRS} + INCLUDE_DIRS ${INCLUDE_DIRS} +) - # Create the test executable - add_executable(${TARGET} ${BENCH_DIR}/${module}/${TARGET}.cpp) - target_include_directories(${TARGET} PUBLIC ${TEST_INCLUDE_DIR}) - verilate(${TARGET} - PREFIX V${TARGET} - SOURCES ${SV_HEADERS} - ${BENCH_DIR}/${module}/${TARGET}.sv - ${ARG_LIBS} - INCLUDE_DIRS ${SRC_DIR} - TRACE) +add_testbench( + MODULE loadstore + BENCH_DIR ${BENCH_DIR} + LIBS_DIR ${LIBS_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + SRC_DIRS ${SRC_DIRS} + INCLUDE_DIRS ${INCLUDE_DIRS} +) - set(TEST_TARGET simulate_${ARG_BENCH}) - set(TEST_OUTPUT ${TESTDATA_DIR}/${ARG_BENCH}.csv) - # Create the ${TEST_TARGET} command to run the test - get_target_property(BINARY_DIR "${TARGET}" BINARY_DIR) - if(${DEBUGLOG}) - set(RUN_TARGET_ARGUMENT "-v") - endif() - add_custom_command( - COMMAND ${TARGET} ${RUN_TARGET_ARGUMENT} - OUTPUT ${TEST_OUTPUT} - DEPENDS ${TARGET} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/tests/) - add_custom_target(${TEST_TARGET} DEPENDS ${TEST_OUTPUT}) - # Add the ${TEST_TARGET} target to the test targets - list(APPEND TEST_BINARIES ${TARGET}) - list(APPEND TEST_TARGETS ${TEST_TARGET}) - list(APPEND TEST_OUTPUTS ${TEST_OUTPUT}) -endmacro() +add_testbench( + MODULE loadstore + BENCH loadstore_w_slave + LIBS instr_wb_slave + BENCH_DIR ${BENCH_DIR} + LIBS_DIR ${LIBS_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + SRC_DIRS ${SRC_DIRS} + INCLUDE_DIRS ${INCLUDE_DIRS} +) -add_testbench(registers) -add_testbench(fetch) -add_testbench(decode) -add_testbench(execute) -add_testbench(loadstore) -add_testbench(loadstore BENCH loadstore_w_slave LIBS instr_wb_slave) -add_testbench(writeback) -add_testbench(memory) -add_testbench(hazard) -add_testbench(ecap5_dproc) +add_testbench( + MODULE writeback + BENCH_DIR ${BENCH_DIR} + LIBS_DIR ${LIBS_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + SRC_DIRS ${SRC_DIRS} + INCLUDE_DIRS ${INCLUDE_DIRS} +) + +add_testbench( + MODULE memory + BENCH_DIR ${BENCH_DIR} + LIBS_DIR ${LIBS_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + SRC_DIRS ${SRC_DIRS} + INCLUDE_DIRS ${INCLUDE_DIRS} +) + +add_testbench( + MODULE hazard + BENCH_DIR ${BENCH_DIR} + LIBS_DIR ${LIBS_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + SRC_DIRS ${SRC_DIRS} + INCLUDE_DIRS ${INCLUDE_DIRS} +) + +add_testbench( + MODULE ecap5_dproc + BENCH_DIR ${BENCH_DIR} + LIBS_DIR ${LIBS_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + SRC_DIRS ${SRC_DIRS} + INCLUDE_DIRS ${INCLUDE_DIRS} +) add_custom_target(benches-build DEPENDS ${TEST_BINARIES}) add_custom_target(benches DEPENDS ${TEST_TARGETS}) diff --git a/tests/emulator/CMakeLists.txt b/tests/emulator/CMakeLists.txt index 91058c9..c3e5dd6 100644 --- a/tests/emulator/CMakeLists.txt +++ b/tests/emulator/CMakeLists.txt @@ -19,16 +19,15 @@ # You should have received a copy of the GNU General Public License # along with ECAP5-DPROC. If not, see . -set(SV_HEADERS ${SRC_DIR}/include/ecap5_dproc_pkg.svh - ${SRC_DIR}/include/riscv_pkg.svh) +file(GLOB INCLUDE_FILES ${INCLUDE_DIRS}/*.svh) add_executable(emulator ${CMAKE_CURRENT_LIST_DIR}/emulator.cpp) target_include_directories(emulator PRIVATE ${TEST_INCLUDE_DIR}) verilate(emulator PREFIX Vecap5_dproc - SOURCES ${SV_HEADERS} - ${SRC_DIR}/ecap5_dproc.sv - INCLUDE_DIRS ${SRC_DIR} + SOURCES ${INCLUDE_FILES} + ${CMAKE_SOURCE_DIR}/src/ecap5_dproc.sv + INCLUDE_DIRS ${SRC_DIRS} TRACE) add_subdirectory(examples) diff --git a/tests/riscv-tests/CMakeLists.txt b/tests/riscv-tests/CMakeLists.txt index 5d01d63..2d219a7 100644 --- a/tests/riscv-tests/CMakeLists.txt +++ b/tests/riscv-tests/CMakeLists.txt @@ -21,17 +21,16 @@ add_subdirectory(tests) -set(SV_HEADERS ${SRC_DIR}/include/ecap5_dproc_pkg.svh - ${SRC_DIR}/include/riscv_pkg.svh) +file(GLOB INCLUDE_FILES ${INCLUDE_DIRS}/*.svh) # riscv-tests add_executable(riscv-tests-executable ${CMAKE_CURRENT_SOURCE_DIR}/riscv-tests.cpp) target_include_directories(riscv-tests-executable PRIVATE ${TEST_INCLUDE_DIR}) verilate(riscv-tests-executable PREFIX Vecap5_dproc - SOURCES ${SV_HEADERS} - ${SRC_DIR}/ecap5_dproc.sv - INCLUDE_DIRS ${SRC_DIR} + SOURCES ${INCLUDE_FILES} + ${CMAKE_SOURCE_DIR}/src/ecap5_dproc.sv + INCLUDE_DIRS ${SRC_DIRS} TRACE) get_target_property(RISCV_TESTS_EXECUTABLE riscv-tests-executable BINARY_DIR) if(${DEBUGLOG}) From 9a30e77e5c4af5345fb06f4de9c7a2b7df1ca9f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chaine?= Date: Mon, 24 Nov 2025 00:00:16 +0100 Subject: [PATCH 2/7] Update CI script --- ...ulate-with-verilator.yml => ci-config.yml} | 49 ++++++++++++++++--- 1 file changed, 42 insertions(+), 7 deletions(-) rename .github/workflows/{simulate-with-verilator.yml => ci-config.yml} (83%) diff --git a/.github/workflows/simulate-with-verilator.yml b/.github/workflows/ci-config.yml similarity index 83% rename from .github/workflows/simulate-with-verilator.yml rename to .github/workflows/ci-config.yml index 6870def..0e7cec5 100644 --- a/.github/workflows/simulate-with-verilator.yml +++ b/.github/workflows/ci-config.yml @@ -1,10 +1,10 @@ -name: Simulated testing using verilator +name: ECAP5-DPROC continuous integration on: push: - branches: [ "main" ] + branches: [ "main", "release/**" ] pull_request: - branches: [ "main" ] + branches: [ "main", "release/**" ] permissions: actions: write @@ -14,7 +14,7 @@ env: BUILD_TYPE: Release REPORT_ARTIFACT_NAME: ecap5-dproc-report-${{github.run_number}}-${{github.run_attempt}} DOCUMENTATION_ARTIFACT_NAME: ecap5-dproc-docs-${{github.run_number}}-${{github.run_attempt}} - BUILD_CACHE_KEY: build-directory-${{ github.run_id }}-${{ github.run_attempt }} + BUILD_CACHE_KEY: simulation-build-directory-${{ github.run_id }}-${{ github.run_attempt }} jobs: prepare: @@ -113,9 +113,43 @@ jobs: path: ${{ env.cache-folder-path }} key: ${{ runner.os }}-${{env.BUILD_CACHE_KEY}} - report: + synthesis: runs-on: self-hosted needs: simulate + + steps: + - uses: actions/checkout@v4.1.1 + + - name: Import build directory + id: import-build + uses: actions/cache/restore@v4.3.0 + env: + cache-folder-path: ${{github.workspace}}/build + with: + path: ${{ env.cache-folder-path }} + key: ${{ runner.os }}-${{env.BUILD_CACHE_KEY}} + + - name: Synthesis + run: ninja -C ${{github.workspace}}/build synth + + - name: Delete Previous Cache + if: ${{ always() && steps.import-build.outputs.cache-hit == 'true'}} + run: gh cache delete "${{ runner.os }}-${{env.BUILD_CACHE_KEY}}" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Cache build directory + if: always() + uses: actions/cache/save@v4.3.0 + env: + cache-folder-path: ${{github.workspace}}/build + with: + path: ${{ env.cache-folder-path }} + key: ${{ runner.os }}-${{env.BUILD_CACHE_KEY}} + + report: + runs-on: self-hosted + needs: synthesis if: always() steps: @@ -164,16 +198,17 @@ jobs: uses: exuanbo/actions-deploy-gist@v1.1.4 with: token: ${{ secrets.GIST_SECRET }} - gist_id: 32195ea7fa70c0218ef3f9952504c59e + gist_id: f525ce32a8951303b0892d98a54b8d66 file_path: build/test-result-badge.json file_type: text + - name: Upload traceability result badge if: ${{ always() && github.ref == 'refs/heads/main' }} uses: exuanbo/actions-deploy-gist@v1.1.4 with: token: ${{ secrets.GIST_SECRET }} - gist_id: 32195ea7fa70c0218ef3f9952504c59e + gist_id: f525ce32a8951303b0892d98a54b8d66 file_path: build/traceability-result-badge.json file_type: text From 20abe769996beef0815232905fdf3eaa6d2747f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chaine?= Date: Mon, 24 Nov 2025 18:03:31 +0100 Subject: [PATCH 3/7] Add missing synth target --- CMakeLists.txt | 15 +++++++++++++++ config/verible-lint.rules | 3 --- config/verible-lint.waives | 2 -- 3 files changed, 15 insertions(+), 5 deletions(-) delete mode 100644 config/verible-lint.rules delete mode 100644 config/verible-lint.waives diff --git a/CMakeLists.txt b/CMakeLists.txt index f18c8c3..a601964 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,11 +65,16 @@ add_dependency(verilator-cmake GIT ecap5/verilator-cmake TAG tags/v1.0.1) +add_dependency(oss-cad-suite-cmake + GIT ecap5/oss-cad-suite-cmake + TAG tags/v1.0.0) + # Configure dependencies include(${verilator_cmake_SOURCE_DIR}/cmake/verilator-config.cmake) include(${ecap5_treq_SOURCE_DIR}/config.cmake) list(APPEND CMAKE_MODULE_PATH "${sphinx_cmake_SOURCE_DIR}/cmake") +include(${oss_cad_suite_cmake_SOURCE_DIR}/cmake/oss-cad-suite-config.cmake) include(${ecap5_dtestlib_SOURCE_DIR}/cmake/lint.cmake) include(${ecap5_dtestlib_SOURCE_DIR}/cmake/testbench.cmake) @@ -77,3 +82,13 @@ include(${ecap5_dtestlib_SOURCE_DIR}/cmake/testbench.cmake) add_subdirectory(docs) add_subdirectory(tests) + +# Synthesis + +add_synthesis_target( + SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/* ${CMAKE_CURRENT_LIST_DIR}/src/include/* + TOP_MODULE ecap5_dproc + TARGET_FPGA ecp5 + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/synth.json) +add_custom_target(synth DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/synth.json) + diff --git a/config/verible-lint.rules b/config/verible-lint.rules deleted file mode 100644 index 98ddb9d..0000000 --- a/config/verible-lint.rules +++ /dev/null @@ -1,3 +0,0 @@ --no-trailing-spaces --line-length -+parameter-name-style="localparam_style:ALL_CAPS" diff --git a/config/verible-lint.waives b/config/verible-lint.waives deleted file mode 100644 index 139597f..0000000 --- a/config/verible-lint.waives +++ /dev/null @@ -1,2 +0,0 @@ - - From 16999d40a1a34bf5640efbdad73cd6c265eded0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chaine?= Date: Wed, 26 Nov 2025 22:46:29 +0100 Subject: [PATCH 4/7] Use cmake interface libraries --- .github/workflows/ci-config.yml | 6 +- CMakeLists.txt | 99 ++++++++++++--------- cmake/dependency.cmake | 67 +++++++++++---- tests/CMakeLists.txt | 9 +- tests/benches/CMakeLists.txt | 114 +++++++++++-------------- tests/emulator/CMakeLists.txt | 8 +- tests/riscv-tests/CMakeLists.txt | 8 +- tests/riscv-tests/tests/CMakeLists.txt | 6 +- 8 files changed, 174 insertions(+), 143 deletions(-) diff --git a/.github/workflows/ci-config.yml b/.github/workflows/ci-config.yml index 0e7cec5..85f76e5 100644 --- a/.github/workflows/ci-config.yml +++ b/.github/workflows/ci-config.yml @@ -24,7 +24,11 @@ jobs: - uses: actions/checkout@v4.1.1 - name: Configure CMake - run: cmake -B ${{github.workspace}}/build -GNinja + run: cmake -B ${{github.workspace}}/build -GNinja -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} 2>&1 | tee ${{github.workspace}}/cmake.log + + - name: Check versions + if: github.event.pull_request.base.ref == 'main' + run: (! grep -e "Using .* with unreleased version" ${{github.workspace}}/cmake.log) - name: Cache build directory if: always() diff --git a/CMakeLists.txt b/CMakeLists.txt index a601964..63dae7e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,16 +19,15 @@ # You should have received a copy of the GNU General Public License # along with ECAP5-DPROC. If not, see . -cmake_minimum_required(VERSION 3.12) +cmake_minimum_required(VERSION 3.21) include(FetchContent) -project(ECAP5_DPROC VERSION 1.0.0) +project(ECAP5_DPROC) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") set(CMAKE_PREFIX_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") # Create python virtual env -message(STATUS "Creating python venv") set(VENV_DIR ${CMAKE_BINARY_DIR}/venv) if(NOT EXISTS "${VENV_DIR}") find_package(Python3 COMPONENTS Interpreter) @@ -41,54 +40,70 @@ find_package(Python3 COMPONENTS Interpreter Development) # Dependencies -message(STATUS "Collecting dependencies") include(${CMAKE_CURRENT_LIST_DIR}/cmake/dependency.cmake) -add_dependency(ECAP5_TREQ - GIT ecap5/ecap5-treq - TAG tags/v2.3.1 - BINARY ecap5-treq) - -add_dependency(ECAP5_DTESTLIB - GIT ecap5/ecap5-dtestlib - TAG release/v1.1.0) - -add_dependency(riscv-tests - GIT ecap5/riscv-tests - TAG master) - -add_dependency(sphinx-cmake +add_dependency( GIT ecap5/sphinx-cmake TAG tags/v1.0.1) -add_dependency(verilator-cmake +add_dependency( GIT ecap5/verilator-cmake TAG tags/v1.0.1) -add_dependency(oss-cad-suite-cmake - GIT ecap5/oss-cad-suite-cmake - TAG tags/v1.0.0) - -# Configure dependencies - -include(${verilator_cmake_SOURCE_DIR}/cmake/verilator-config.cmake) -include(${ecap5_treq_SOURCE_DIR}/config.cmake) -list(APPEND CMAKE_MODULE_PATH "${sphinx_cmake_SOURCE_DIR}/cmake") -include(${oss_cad_suite_cmake_SOURCE_DIR}/cmake/oss-cad-suite-config.cmake) -include(${ecap5_dtestlib_SOURCE_DIR}/cmake/lint.cmake) -include(${ecap5_dtestlib_SOURCE_DIR}/cmake/testbench.cmake) - -# Include subdirectories +add_dependency( + GIT ecap5/ecap5-treq + TAG release/v3.0.0 + BINARY ecap5-treq) -add_subdirectory(docs) -add_subdirectory(tests) +add_dependency( + GIT ecap5/oss-cad-suite-cmake + TAG release/v2.0.0) -# Synthesis +add_dependency( + GIT ecap5/ecap5-dtestlib + TAG release/v1.1.0) -add_synthesis_target( - SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/* ${CMAKE_CURRENT_LIST_DIR}/src/include/* - TOP_MODULE ecap5_dproc - TARGET_FPGA ecp5 - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/synth.json) -add_custom_target(synth DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/synth.json) +add_dependency( + GIT ecap5/riscv-tests + TAG master) +# Define an interface library +add_library(ecap5_dproc INTERFACE) +target_sources(ecap5_dproc INTERFACE + ${CMAKE_CURRENT_LIST_DIR}/src/include/ecap5_dproc_pkg.svh + ${CMAKE_CURRENT_LIST_DIR}/src/include/riscv_pkg.svh + ${CMAKE_CURRENT_LIST_DIR}/src/ecap5_dproc.sv + ${CMAKE_CURRENT_LIST_DIR}/src/decode.sv + ${CMAKE_CURRENT_LIST_DIR}/src/execute.sv + ${CMAKE_CURRENT_LIST_DIR}/src/fetch.sv + ${CMAKE_CURRENT_LIST_DIR}/src/hazard.sv + ${CMAKE_CURRENT_LIST_DIR}/src/loadstore.sv + ${CMAKE_CURRENT_LIST_DIR}/src/memory.sv + ${CMAKE_CURRENT_LIST_DIR}/src/registers.sv + ${CMAKE_CURRENT_LIST_DIR}/src/writeback.sv +) + +if(PROJECT_IS_TOP_LEVEL) + # Configure dependencies + + include(${ecap5_verilator_cmake_SOURCE_DIR}/cmake/verilator-config.cmake) + include(${ecap5_ecap5_treq_SOURCE_DIR}/config.cmake) + list(APPEND CMAKE_MODULE_PATH "${ecap5_sphinx_cmake_SOURCE_DIR}/cmake") + include(${ecap5_oss_cad_suite_cmake_SOURCE_DIR}/cmake/oss-cad-suite-config.cmake) + include(${ecap5_ecap5_dtestlib_SOURCE_DIR}/cmake/testbench.cmake) + include(${ecap5_ecap5_dtestlib_SOURCE_DIR}/cmake/lint.cmake) + + # Include subdirectories + + add_subdirectory(docs) + add_subdirectory(tests) + + # Synthesis + + add_synthesis_target( + LIB ecap5_dproc + TOP_MODULE ecap5_dproc + TARGET_FPGA ecp5 + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/synth.json) + add_custom_target(synth DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/synth.json) +endif() diff --git a/cmake/dependency.cmake b/cmake/dependency.cmake index c82ee15..60e913a 100644 --- a/cmake/dependency.cmake +++ b/cmake/dependency.cmake @@ -1,26 +1,57 @@ -macro(add_dependency id) +macro(add_dependency) cmake_parse_arguments(ARG "" "GIT;TAG;BINARY" "" ${ARGN}) - string(MAKE_C_IDENTIFIER "${id}" name) - string(TOLOWER "${name}" name) - - FetchContent_Declare(${name} - GIT_REPOSITORY https://github.com/${ARG_GIT} - GIT_TAG ${ARG_TAG} - SOURCE_SUBDIR __none__ - ) - FetchContent_MakeAvailable(${name}) - - if(NOT DEFINED ${name}_EXECUTABLE) - if(EXISTS "${${name}_SOURCE_DIR}/pyproject.toml") - message(STATUS "Configuring ${name}") - execute_process(COMMAND ${Python3_EXECUTABLE} -m pip install -e ${${name}_SOURCE_DIR} OUTPUT_QUIET RESULT_VARIABLE rv) - if("${rv}" STREQUAL "0") - set(${name}_EXECUTABLE ${VENV_DIR}/bin/${ARG_BINARY} CACHE STRING "path to the ${name} executable") + set(REPOSITORY_URL https://github.com/${ARG_GIT}) + + # Create a unique identifier for the dependency + string(MAKE_C_IDENTIFIER "${ARG_GIT}" DEPENDENCY_ID) + string(TOLOWER "${DEPENDENCY_ID}" DEPENDENCY_ID) + + get_property(IS_DEPENDENCY_PRESENT GLOBAL PROPERTY ${DEPENDENCY_ID}_VERSION SET) + + # Check if the dependency is already present + if(${IS_DEPENDENCY_PRESENT}) + get_property(${DEPENDENCY_ID}_VERSION GLOBAL PROPERTY ${DEPENDENCY_ID}_VERSION) + # Check that the version is the same + if(NOT ${DEPENDENCY_ID}_VERSION STREQUAL ARG_TAG) + message(FATAL_ERROR "Dependency ${ARG_GIT} version mismatched\n\t${${DEPENDENCY_ID}_VERSION} != ${ARG_TAG}") + endif() + else() + message(STATUS "Configuring ${ARG_GIT}") + + # Define the version + set_property(GLOBAL PROPERTY ${DEPENDENCY_ID}_VERSION ${ARG_TAG}) + + # Check if released version + if(CMAKE_BUILD_TYPE STREQUAL "Release") + if(NOT ${ARG_TAG} MATCHES "^tags/.*") + message(WARNING "Using ${ARG_GIT} with unreleased version ${ARG_TAG}") endif() endif() - endif() + # Fetch the repository + FetchContent_Declare(${DEPENDENCY_ID} + GIT_REPOSITORY ${REPOSITORY_URL} + GIT_TAG ${ARG_TAG} + SOURCE_SUBDIR __none__ + ) + FetchContent_MakeAvailable(${DEPENDENCY_ID}) + + # Add cmake build if it exists + if(EXISTS "${${DEPENDENCY_ID}_SOURCE_DIR}/CMakeLists.txt") + add_subdirectory(${${DEPENDENCY_ID}_SOURCE_DIR} ${${DEPENDENCY_ID}_SOURCE_DIR}/../${DEPENDENCY_ID}-build) + endif() + + # Handle python executable if it exists + if(NOT DEFINED ${DEPENDENCY_ID}_EXECUTABLE) + if(EXISTS "${${DEPENDENCY_ID}_SOURCE_DIR}/pyproject.toml") + execute_process(COMMAND ${Python3_EXECUTABLE} -m pip install -e ${${DEPENDENCY_ID}_SOURCE_DIR} OUTPUT_QUIET RESULT_VARIABLE rv) + if("${rv}" STREQUAL "0") + set(${DEPENDENCY_ID}_EXECUTABLE ${VENV_DIR}/bin/${ARG_BINARY} CACHE STRING "path to the ${DEPENDENCY_ID} executable") + endif() + endif() + endif() + endif() endmacro() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 322e03e..85f132a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -22,19 +22,14 @@ # Bench parent directory set(BENCH_DIR ${CMAKE_CURRENT_SOURCE_DIR}/benches/) # C++ bench include directory -set(TEST_INCLUDE_DIR ${ecap5_dtestlib_SOURCE_DIR}/include) -# HDL source directories -set(SRC_DIRS ${CMAKE_SOURCE_DIR}/src/) -set(INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/src/include) -# HDL library directories -set(LIBS_DIR ${ecap5_dtestlib_SOURCE_DIR}/src/) +set(TEST_INCLUDE_DIRS ${ecap5_ecap5_dtestlib_SOURCE_DIR}/include) # Bench CSV output directory set(TESTDATA_DIR ${CMAKE_CURRENT_BINARY_DIR}/) # Lint add_lint_target( TARGET lint - SRC_DIRS ${SRC_DIRS} + LIB ecap5_dproc ) # Testbenches diff --git a/tests/benches/CMakeLists.txt b/tests/benches/CMakeLists.txt index ed99a76..bc3d39a 100644 --- a/tests/benches/CMakeLists.txt +++ b/tests/benches/CMakeLists.txt @@ -20,95 +20,85 @@ # along with ECAP5-DPROC. If not, see . add_testbench( - MODULE registers - BENCH_DIR ${BENCH_DIR} - LIBS_DIR ${LIBS_DIR} - TESTDATA_DIR ${TESTDATA_DIR} - SRC_DIRS ${SRC_DIRS} - INCLUDE_DIRS ${INCLUDE_DIRS} + MODULE registers + LIBS ecap5_dproc + BENCH_DIR ${BENCH_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + TEST_INCLUDE_DIRS ${TEST_INCLUDE_DIRS} ) add_testbench( - MODULE fetch - BENCH_DIR ${BENCH_DIR} - LIBS_DIR ${LIBS_DIR} - TESTDATA_DIR ${TESTDATA_DIR} - SRC_DIRS ${SRC_DIRS} - INCLUDE_DIRS ${INCLUDE_DIRS} + MODULE fetch + LIBS ecap5_dproc + BENCH_DIR ${BENCH_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + TEST_INCLUDE_DIRS ${TEST_INCLUDE_DIRS} ) add_testbench( - MODULE decode - BENCH_DIR ${BENCH_DIR} - LIBS_DIR ${LIBS_DIR} - TESTDATA_DIR ${TESTDATA_DIR} - SRC_DIRS ${SRC_DIRS} - INCLUDE_DIRS ${INCLUDE_DIRS} + MODULE decode + LIBS ecap5_dproc + BENCH_DIR ${BENCH_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + TEST_INCLUDE_DIRS ${TEST_INCLUDE_DIRS} ) add_testbench( - MODULE execute - BENCH_DIR ${BENCH_DIR} - LIBS_DIR ${LIBS_DIR} - TESTDATA_DIR ${TESTDATA_DIR} - SRC_DIRS ${SRC_DIRS} - INCLUDE_DIRS ${INCLUDE_DIRS} + MODULE execute + LIBS ecap5_dproc + BENCH_DIR ${BENCH_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + TEST_INCLUDE_DIRS ${TEST_INCLUDE_DIRS} ) add_testbench( - MODULE loadstore - BENCH_DIR ${BENCH_DIR} - LIBS_DIR ${LIBS_DIR} - TESTDATA_DIR ${TESTDATA_DIR} - SRC_DIRS ${SRC_DIRS} - INCLUDE_DIRS ${INCLUDE_DIRS} + MODULE loadstore + LIBS ecap5_dproc + BENCH_DIR ${BENCH_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + TEST_INCLUDE_DIRS ${TEST_INCLUDE_DIRS} ) add_testbench( - MODULE loadstore - BENCH loadstore_w_slave - LIBS instr_wb_slave - BENCH_DIR ${BENCH_DIR} - LIBS_DIR ${LIBS_DIR} - TESTDATA_DIR ${TESTDATA_DIR} - SRC_DIRS ${SRC_DIRS} - INCLUDE_DIRS ${INCLUDE_DIRS} + MODULE loadstore + BENCH loadstore_w_slave + LIBS ecap5_dproc + ecap5_dtestlib + BENCH_DIR ${BENCH_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + TEST_INCLUDE_DIRS ${TEST_INCLUDE_DIRS} ) add_testbench( - MODULE writeback - BENCH_DIR ${BENCH_DIR} - LIBS_DIR ${LIBS_DIR} - TESTDATA_DIR ${TESTDATA_DIR} - SRC_DIRS ${SRC_DIRS} - INCLUDE_DIRS ${INCLUDE_DIRS} + MODULE writeback + LIBS ecap5_dproc + BENCH_DIR ${BENCH_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + TEST_INCLUDE_DIRS ${TEST_INCLUDE_DIRS} ) add_testbench( - MODULE memory - BENCH_DIR ${BENCH_DIR} - LIBS_DIR ${LIBS_DIR} - TESTDATA_DIR ${TESTDATA_DIR} - SRC_DIRS ${SRC_DIRS} - INCLUDE_DIRS ${INCLUDE_DIRS} + MODULE memory + LIBS ecap5_dproc + BENCH_DIR ${BENCH_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + TEST_INCLUDE_DIRS ${TEST_INCLUDE_DIRS} ) add_testbench( - MODULE hazard - BENCH_DIR ${BENCH_DIR} - LIBS_DIR ${LIBS_DIR} - TESTDATA_DIR ${TESTDATA_DIR} - SRC_DIRS ${SRC_DIRS} - INCLUDE_DIRS ${INCLUDE_DIRS} + MODULE hazard + LIBS ecap5_dproc + BENCH_DIR ${BENCH_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + TEST_INCLUDE_DIRS ${TEST_INCLUDE_DIRS} ) add_testbench( - MODULE ecap5_dproc - BENCH_DIR ${BENCH_DIR} - LIBS_DIR ${LIBS_DIR} - TESTDATA_DIR ${TESTDATA_DIR} - SRC_DIRS ${SRC_DIRS} - INCLUDE_DIRS ${INCLUDE_DIRS} + MODULE ecap5_dproc + LIBS ecap5_dproc + BENCH_DIR ${BENCH_DIR} + TESTDATA_DIR ${TESTDATA_DIR} + TEST_INCLUDE_DIRS ${TEST_INCLUDE_DIRS} ) add_custom_target(benches-build DEPENDS ${TEST_BINARIES}) diff --git a/tests/emulator/CMakeLists.txt b/tests/emulator/CMakeLists.txt index c3e5dd6..a85c769 100644 --- a/tests/emulator/CMakeLists.txt +++ b/tests/emulator/CMakeLists.txt @@ -19,15 +19,13 @@ # You should have received a copy of the GNU General Public License # along with ECAP5-DPROC. If not, see . -file(GLOB INCLUDE_FILES ${INCLUDE_DIRS}/*.svh) +get_all_sources_recursive(ecap5_dproc EMULATOR_SOURCES) add_executable(emulator ${CMAKE_CURRENT_LIST_DIR}/emulator.cpp) -target_include_directories(emulator PRIVATE ${TEST_INCLUDE_DIR}) +target_include_directories(emulator PRIVATE ${TEST_INCLUDE_DIRS}) verilate(emulator PREFIX Vecap5_dproc - SOURCES ${INCLUDE_FILES} - ${CMAKE_SOURCE_DIR}/src/ecap5_dproc.sv - INCLUDE_DIRS ${SRC_DIRS} + SOURCES ${EMULATOR_SOURCES} TRACE) add_subdirectory(examples) diff --git a/tests/riscv-tests/CMakeLists.txt b/tests/riscv-tests/CMakeLists.txt index 2d219a7..a41f61b 100644 --- a/tests/riscv-tests/CMakeLists.txt +++ b/tests/riscv-tests/CMakeLists.txt @@ -21,16 +21,14 @@ add_subdirectory(tests) -file(GLOB INCLUDE_FILES ${INCLUDE_DIRS}/*.svh) +get_all_sources_recursive(ecap5_dproc RISCV_TESTS_SOURCES) # riscv-tests add_executable(riscv-tests-executable ${CMAKE_CURRENT_SOURCE_DIR}/riscv-tests.cpp) -target_include_directories(riscv-tests-executable PRIVATE ${TEST_INCLUDE_DIR}) +target_include_directories(riscv-tests-executable PRIVATE ${TEST_INCLUDE_DIRS}) verilate(riscv-tests-executable PREFIX Vecap5_dproc - SOURCES ${INCLUDE_FILES} - ${CMAKE_SOURCE_DIR}/src/ecap5_dproc.sv - INCLUDE_DIRS ${SRC_DIRS} + SOURCES ${RISCV_TESTS_SOURCES} TRACE) get_target_property(RISCV_TESTS_EXECUTABLE riscv-tests-executable BINARY_DIR) if(${DEBUGLOG}) diff --git a/tests/riscv-tests/tests/CMakeLists.txt b/tests/riscv-tests/tests/CMakeLists.txt index 149efb8..21e3395 100644 --- a/tests/riscv-tests/tests/CMakeLists.txt +++ b/tests/riscv-tests/tests/CMakeLists.txt @@ -32,7 +32,7 @@ set(TVM rv32ui) # Target Virtual Machine set(TE p) # Target Environment # Paths -set(SOURCE_DIR ${riscv_tests_SOURCE_DIR}/isa/${TVM}/) +set(SOURCE_DIR ${ecap5_riscv_tests_SOURCE_DIR}/isa/${TVM}/) set(ENV_DIR ${CMAKE_CURRENT_SOURCE_DIR}/env/) # Compile options @@ -41,9 +41,9 @@ set(CC_OPTS "-static \ -fvisibility=hidden \ -nostdlib \ -nostartfiles") -set(CC_INCS ${riscv_tests_SOURCE_DIR}/env +set(CC_INCS ${ecap5_riscv_tests_SOURCE_DIR}/env ${ENV_DIR} - ${riscv_tests_SOURCE_DIR}/isa/macros/scalar) + ${ecap5_riscv_tests_SOURCE_DIR}/isa/macros/scalar) set(TARGETS simple add addi From 8bbc279c30226ca16f5354118da5c93a0d563109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chaine?= Date: Sat, 6 Dec 2025 19:39:49 +0100 Subject: [PATCH 5/7] Use verilator-cmake v1.1.0 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 63dae7e..4094bef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,7 +48,7 @@ add_dependency( add_dependency( GIT ecap5/verilator-cmake - TAG tags/v1.0.1) + TAG release/v1.1.0) add_dependency( GIT ecap5/ecap5-treq From fa21d5d0d7396df8fc9b8c57bab80b3b7cdd90bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chaine?= Date: Sun, 4 Jan 2026 11:24:25 +0100 Subject: [PATCH 6/7] Update dependencies to released versions --- CMakeLists.txt | 9 +++++---- tests/CMakeLists.txt | 3 +++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4094bef..8c0f69f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,20 +48,20 @@ add_dependency( add_dependency( GIT ecap5/verilator-cmake - TAG release/v1.1.0) + TAG tags/v1.1.0) add_dependency( GIT ecap5/ecap5-treq - TAG release/v3.0.0 + TAG tags/v3.0.0 BINARY ecap5-treq) add_dependency( GIT ecap5/oss-cad-suite-cmake - TAG release/v2.0.0) + TAG tags/v2.0.0) add_dependency( GIT ecap5/ecap5-dtestlib - TAG release/v1.1.0) + TAG tags/v1.1.0) add_dependency( GIT ecap5/riscv-tests @@ -105,5 +105,6 @@ if(PROJECT_IS_TOP_LEVEL) TOP_MODULE ecap5_dproc TARGET_FPGA ecp5 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/synth.json) + add_custom_target(synth DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/synth.json) endif() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 85f132a..446975d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -19,6 +19,9 @@ # You should have received a copy of the GNU General Public License # along with ECAP5-DPROC. If not, see . +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + # Bench parent directory set(BENCH_DIR ${CMAKE_CURRENT_SOURCE_DIR}/benches/) # C++ bench include directory From 9ca138f14430b2683f085698c26e1b6ca78b3f48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chaine?= Date: Sun, 4 Jan 2026 11:47:31 +0100 Subject: [PATCH 7/7] Use released version of riscv-tests --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c0f69f..c2a4d6f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,7 +65,7 @@ add_dependency( add_dependency( GIT ecap5/riscv-tests - TAG master) + TAG tags/v1.0.0) # Define an interface library add_library(ecap5_dproc INTERFACE)