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
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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:
Expand All @@ -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 Expand Up @@ -113,9 +117,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:
Expand Down Expand Up @@ -164,16 +202,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

Expand Down
79 changes: 56 additions & 23 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,37 +40,71 @@ find_package(Python3 COMPONENTS Interpreter Development)

# Dependencies

message(STATUS "Collecting dependencies")
include(${CMAKE_CURRENT_LIST_DIR}/cmake/dependency.cmake)

add_dependency(ECAP5_TREQ
add_dependency(
GIT ecap5/sphinx-cmake
TAG tags/v1.0.1)

add_dependency(
GIT ecap5/verilator-cmake
TAG tags/v1.1.0)

add_dependency(
GIT ecap5/ecap5-treq
TAG tags/v2.3.1
TAG tags/v3.0.0
BINARY ecap5-treq)

add_dependency(ECAP5_DTESTLIB
add_dependency(
GIT ecap5/oss-cad-suite-cmake
TAG tags/v2.0.0)

add_dependency(
GIT ecap5/ecap5-dtestlib
TAG tags/v1.0.0)
TAG tags/v1.1.0)

add_dependency(riscv-tests
add_dependency(
GIT ecap5/riscv-tests
TAG master)
TAG tags/v1.0.0)

add_dependency(sphinx-cmake
GIT ecap5/sphinx-cmake
TAG tags/v1.0.1)
# 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
)

add_dependency(verilator-cmake
GIT ecap5/verilator-cmake
TAG tags/v1.0.1)
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)

# Configure dependencies
# Include subdirectories

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")
add_subdirectory(docs)
add_subdirectory(tests)

# Include subdirectories
# Synthesis

add_subdirectory(docs)
add_subdirectory(tests)
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()
3 changes: 0 additions & 3 deletions config/verible-lint.rules

This file was deleted.

2 changes: 0 additions & 2 deletions config/verible-lint.waives

This file was deleted.

28 changes: 13 additions & 15 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,23 @@
# You should have received a copy of the GNU General Public License
# along with ECAP5-DPROC. If not, see <http://www.gnu.org/licenses/>.

set(BENCH_DIR ${CMAKE_CURRENT_SOURCE_DIR}/benches/)
set(TEST_INCLUDE_DIR ${ecap5_dtestlib_SOURCE_DIR}/include)
set(SRC_DIR ${CMAKE_SOURCE_DIR}/src/)
set(INCLUDE_DIR ${SRC_DIR}/include/)
set(LIBS_DIR ${ecap5_dtestlib_SOURCE_DIR}/src/)
set(TESTDATA_DIR ${CMAKE_CURRENT_BINARY_DIR}/testdata/)
set(CONFIG_DIR ${CMAKE_SOURCE_DIR}/config/)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Create folders for the waves and testdata
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/waves)
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/testdata)
# Bench parent directory
set(BENCH_DIR ${CMAKE_CURRENT_SOURCE_DIR}/benches/)
# C++ bench include directory
set(TEST_INCLUDE_DIRS ${ecap5_ecap5_dtestlib_SOURCE_DIR}/include)
# 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
LIB ecap5_dproc
)

# Testbenches
add_subdirectory(benches)
add_subdirectory(emulator)
add_subdirectory(riscv-tests)
Expand Down
Loading