Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .github/workflows/ci-config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
99 changes: 57 additions & 42 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,15 @@
# You should have received a copy of the GNU General Public License
# along with ECAP5-DPROC. If not, see <http://www.gnu.org/licenses/>.

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)
Expand All @@ -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()
67 changes: 49 additions & 18 deletions cmake/dependency.cmake
Original file line number Diff line number Diff line change
@@ -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()
9 changes: 2 additions & 7 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
114 changes: 52 additions & 62 deletions tests/benches/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,95 +20,85 @@
# along with ECAP5-DPROC. If not, see <http://www.gnu.org/licenses/>.

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})
Expand Down
Loading
Loading