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
95 changes: 56 additions & 39 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-DWBUART. If not, see <http://www.gnu.org/licenses/>.

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

project(ECAP5_DWBUART VERSION 1.0.0)
project(ECAP5_DWBUART)

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,48 +40,66 @@ 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 tags/v1.0.0)

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
TAG tags/v1.1.0)

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 subdirectories

add_subdirectory(docs)
add_subdirectory(tests)

# Synthesis
add_dependency(
GIT ecap5/ecap5-treq
TAG tags/v3.0.0
BINARY ecap5-treq)

add_synthesis_target(
SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/*
TOP_MODULE ecap5_dwbuart
TARGET_FPGA ecp5
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/synth.json)
add_dependency(
GIT ecap5/oss-cad-suite-cmake
TAG tags/v2.0.0)

add_custom_target(synth DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/synth.json)
add_dependency(
GIT ecap5/ecap5-dtestlib
TAG tags/v1.1.0)

add_dependency(
GIT ecap5/ecap5-dwbmmsc
TAG tags/v1.0.0-beta1)

# Define an interface library
add_library(ecap5_dwbuart INTERFACE)
target_sources(ecap5_dwbuart INTERFACE
${CMAKE_CURRENT_LIST_DIR}/src/ecap5_dwbuart.sv
${CMAKE_CURRENT_LIST_DIR}/src/rx_frontend.sv
${CMAKE_CURRENT_LIST_DIR}/src/tx_frontend.sv
)
target_link_libraries(ecap5_dwbuart INTERFACE
ecap5_dwbmmsc
)

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_dwbuart
TOP_MODULE ecap5_dwbuart
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 ${${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()
35 changes: 17 additions & 18 deletions config/gtkwave/config/ecap5_dwbuart.gtkw
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
[*]
[*] GTKWave Analyzer v3.4.0 (w)1999-2022 BSI
[*] Wed May 8 07:33:08 2024
[*] Thu Dec 4 18:16:15 2025
[*]
[dumpfile] "/Users/cchaine/Desktop/Documents/projects/.ecap5.nosync/design/wbuart/build/tests/waves/ecap5_dwbuart.vcd"
[dumpfile_mtime] "Wed May 8 07:26:31 2024"
[dumpfile_size] 23128
[dumpfile_mtime] "Thu Dec 4 18:15:49 2025"
[dumpfile_size] 67035
[savefile] "/Users/cchaine/Desktop/Documents/projects/.ecap5.nosync/design/wbuart/config/gtkwave/config/ecap5_dwbuart.gtkw"
[timestart] 1
[size] 1440 783
[timestart] 2792
[size] 1900 935
[pos] -1 -1
*-6.069452 123 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*-4.971742 2889 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[markername] AA
[markername] BB
[markername] CC
Expand Down Expand Up @@ -39,13 +39,13 @@
[treeopen] TOP.
[treeopen] TOP.tb_ecap5_dwbuart.
[treeopen] TOP.tb_ecap5_dwbuart.dut.
[sst_width] 253
[sst_width] 255
[signals_width] 193
[sst_expanded] 1
[sst_vpaned_height] 386
[sst_vpaned_height] 682
@2024
[color] 1
^1 /Users/cchaine/Desktop/Documents/projects/.ecap5.nosync/design/wbuart/config/gtkwave/filters/ecap5_dwbuart_testcase_filter.gtkw
^1 /Users/cchaine/Desktop/Documents/projects/.ecap5.nosync/design/wbuart/config/gtkwave/filters/ecap5_wbuart_testcase_filter.gtkw
TOP.tb_ecap5_dwbuart.testcase[31:0]
@28
TOP.tb_ecap5_dwbuart.clk_i
Expand Down Expand Up @@ -78,30 +78,29 @@ TOP.tb_ecap5_dwbuart.wb_stall_o
-Wishbone
@28
[color] 7
TOP.tb_ecap5_dwbuart.uart_rx_i
TOP.tb_ecap5_dwbuart.dut.uart_rx_i
[color] 7
TOP.tb_ecap5_dwbuart.uart_tx_o
TOP.tb_ecap5_dwbuart.dut.uart_tx_o
@800200
-Registers
@c00201
-CR
@22
TOP.tb_ecap5_dwbuart.dut.cr_clk_div_q[15:0]
TOP.tb_ecap5_dwbuart.dut.cr_acc_incr_q[15:0]
@28
TOP.tb_ecap5_dwbuart.dut.cr_ds_q
TOP.tb_ecap5_dwbuart.dut.cr_p_q[1:0]
TOP.tb_ecap5_dwbuart.dut.cr_s_q
@1401201
@1000200
-CR
@c00200
@800200
-SR
@28
TOP.tb_ecap5_dwbuart.dut.sr_fe_q
TOP.tb_ecap5_dwbuart.dut.sr_pe_q
TOP.tb_ecap5_dwbuart.dut.sr_rxne_q
TOP.tb_ecap5_dwbuart.dut.sr_rxoe_q
TOP.tb_ecap5_dwbuart.dut.sr_txe_q
@1401200
@1000200
-SR
@22
TOP.tb_ecap5_dwbuart.dut.txdr_txd_q[7:0]
Expand All @@ -115,7 +114,7 @@ TOP.tb_ecap5_dwbuart.dut.tx_done
TOP.tb_ecap5_dwbuart.dut.rx_valid
@22
TOP.tb_ecap5_dwbuart.dut.rx_frame[10:0]
@28
TOP.tb_ecap5_dwbuart.dut.rx_parity
@29
TOP.tb_ecap5_dwbuart.inj_frame_error
[pattern_trace] 1
[pattern_trace] 0
67 changes: 0 additions & 67 deletions config/gtkwave/config/wb_interface.gtkw

This file was deleted.

5 changes: 4 additions & 1 deletion config/gtkwave/filters/ecap5_wbuart_testcase_filter.gtkw
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,7 @@
5 T_RXOE
6 T_FE
7 T_PE
8 T_FULL_DUPLEX
8 T_RACE_SR
9 T_RACE_TXDR
10 T_RACE_RXDR
11 T_ERROR_RETENTION
2 changes: 0 additions & 2 deletions config/gtkwave/filters/wb_interface_testcase_filter.gtkw

This file was deleted.

Loading