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
77 changes: 43 additions & 34 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-DWBMMSC. If not, see <http://www.gnu.org/licenses/>.

cmake_minimum_required(VERSION 3.12)
cmake_minimum_required(VERSION 3.21)
include(FetchContent)

project(ECAP5_DWBMMSC VERSION 1.0.0)
project(ECAP5_DWBMMSC)

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,50 +40,60 @@ 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 release/v1.1.0)
TAG tags/v1.1.0)

add_dependency(sphinx-cmake
GIT ecap5/sphinx-cmake
TAG tags/v1.0.1)
# Define an interface library

add_dependency(verilator-cmake
GIT ecap5/verilator-cmake
TAG tags/v1.0.1)
add_library(ecap5_dwbmmsc INTERFACE)
target_sources(ecap5_dwbmmsc INTERFACE
${CMAKE_CURRENT_LIST_DIR}/src/ecap5_dwbmmsc.sv
)

add_dependency(oss-cad-suite-cmake
GIT ecap5/oss-cad-suite-cmake
TAG tags/v1.0.0)
# Only perform if the project will be tested

# Configure dependencies
if(PROJECT_IS_TOP_LEVEL)
# 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/testbench.cmake)
include(${ecap5_dtestlib_SOURCE_DIR}/cmake/lint.cmake)
list(APPEND CMAKE_MODULE_PATH "${ecap5_sphinx_cmake_SOURCE_DIR}/cmake")
include(${ecap5_verilator_cmake_SOURCE_DIR}/cmake/verilator-config.cmake)
include(${ecap5_ecap5_treq_SOURCE_DIR}/config.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 subdirectories

add_subdirectory(docs)
add_subdirectory(tests)
add_subdirectory(docs)
add_subdirectory(tests)

# Synthesis
# Synthesis

add_synthesis_target(
SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/*
TOP_MODULE ecap5_dwbmmsc
TARGET_FPGA ecp5
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/synth.json)
add_synthesis_target(
LIB ecap5_dwbmmsc
TOP_MODULE ecap5_dwbmmsc
TARGET_FPGA ecp5
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/synth.json)

add_custom_target(synth DEPENDS ${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 ${${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()
12 changes: 6 additions & 6 deletions config/traceability-matrix.csv
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
tb_wb_interface.reset.01;F_WISHBONE_RESET_01
tb_wb_interface.reset.02;F_WISHBONE_RESET_02
tb_wb_interface.read.01;F_WISHBONE_READ_CYCLE_01
tb_wb_interface.read.02;F_WISHBONE_TRANSFER_CYCLE_01;F_WISHBONE_HANDSHAKE_01;F_WISHBONE_READ_CYCLE_01
tb_wb_interface.write.01;F_WISHBONE_WRITE_CYCLE_01
tb_wb_interface.write.02;F_WISHBONE_WRITE_CYCLE_01
tb_ecap5_dwbmmsc.reset.01;F_WISHBONE_RESET_01
tb_ecap5_dwbmmsc.reset.02;F_WISHBONE_RESET_02
tb_ecap5_dwbmmsc.read.01;F_WISHBONE_READ_CYCLE_01
tb_ecap5_dwbmmsc.read.02;F_WISHBONE_TRANSFER_CYCLE_01;F_WISHBONE_HANDSHAKE_01;F_WISHBONE_READ_CYCLE_01
tb_ecap5_dwbmmsc.write.01;F_WISHBONE_WRITE_CYCLE_01
tb_ecap5_dwbmmsc.write.02;F_WISHBONE_WRITE_CYCLE_01
__UNTRACEABLE__;F_WISHBONE_DATASHEET_01;This requirement is covered by the hdl code.
__UNTRACEABLE__;F_WISHBONE_TIMING_01;This requirement is covered by the hdl code.
8 changes: 5 additions & 3 deletions src/ecap5_dwbmmsc.sv
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,12 @@ module ecap5_dwbmmsc
//=================================
// Output interface

output logic[7:0] addr_o,
output logic[31:0] addr_o,
output logic read_o,
input logic[31:0] read_data_i,
output logic write_o,
output logic[31:0] write_data_o
output logic[31:0] write_data_o,
output logic[3:0] sel_o
);
/*****************************************/
/* Internal signals */
Expand Down Expand Up @@ -97,9 +98,10 @@ assign wb_ack_o = wb_ack_q;
assign wb_dat_o = read_data_i;
assign wb_stall_o = 0;

assign addr_o = wb_adr_i[7:0];
assign addr_o = wb_adr_i;
assign read_o = wb_stb_i && wb_cyc_i && ~wb_we_i;
assign write_o = wb_stb_i && wb_cyc_i && wb_we_i;
assign write_data_o = wb_dat_i;
assign sel_o = wb_sel_i;

endmodule // ecap5_dwbmmsc
20 changes: 8 additions & 12 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,27 +22,23 @@
# 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/)
# 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}/testdata/)
set(TESTDATA_DIR ${CMAKE_CURRENT_BINARY_DIR}/)

# Lint
add_lint_target(
TARGET lint
SRC_DIRS ${SRC_DIRS}
LIB ecap5_dwbmmsc
)

# Add testbenches
add_testbench(
MODULE ecap5_dwbmmsc
BENCH_DIR ${BENCH_DIR}
LIBS_DIR ${LIBS_DIR}
TESTDATA_DIR ${TESTDATA_DIR}
SRC_DIRS ${SRC_DIRS}
MODULE ecap5_dwbmmsc
LIBS ecap5_dwbmmsc
BENCH_DIR ${BENCH_DIR}
TESTDATA_DIR ${TESTDATA_DIR}
TEST_INCLUDE_DIRS ${TEST_INCLUDE_DIRS}
)

# Main targets
Expand Down
4 changes: 2 additions & 2 deletions tests/benches/ecap5_dwbmmsc/tb_ecap5_dwbmmsc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ void tb_ecap5_dwbmmsc_read(TB_Ecap5_dwbmmsc * tb) {
// Checks

tb->check(COND_output, (core->read_o == 1) &&
(core->addr_o == (addr & 0xFF)) &&
(core->addr_o == addr) &&
(core->write_o == 0));

//=================================
Expand Down Expand Up @@ -251,7 +251,7 @@ void tb_ecap5_dwbmmsc_write(TB_Ecap5_dwbmmsc * tb) {
// Checks

tb->check(COND_output, (core->read_o == 0) &&
(core->addr_o == (addr & 0xFF)) &&
(core->addr_o == addr) &&
(core->write_o == 1) &&
(core->write_data_o == data));

Expand Down
8 changes: 5 additions & 3 deletions tests/benches/ecap5_dwbmmsc/tb_ecap5_dwbmmsc.sv
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,12 @@ module tb_ecap5_dwbmmsc
//=================================
// Output interface

output logic[7:0] addr_o,
output logic[31:0] addr_o,
output logic read_o,
input logic[31:0] read_data_i,
output logic write_o,
output logic[31:0] write_data_o
output logic[31:0] write_data_o,
output logic[3:0] sel_o
);

ecap5_dwbmmsc dut (
Expand All @@ -68,7 +69,8 @@ ecap5_dwbmmsc dut (
.read_o (read_o),
.read_data_i (read_data_i),
.write_o (write_o),
.write_data_o (write_data_o)
.write_data_o (write_data_o),
.sel_o (sel_o)
);

endmodule // tb_ecap5_dwbmmsc