aboutsummaryrefslogtreecommitdiff
path: root/rv64cpu/cmake/verilator.cmake
blob: 8c0a0062c1e04c3368dd0b5c4aed10dc5fb2f132 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# ─── Verilator CMake Helper ──────────────────────────────────────────────────────
#
# Provides the `add_verilator_target()` function to simplify creating
# Verilator simulation executables.
#
# Usage:
#   add_verilator_target(
#       NAME        tb_alu
#       TOP_MODULE  alu
#       SOURCES     ${RTL_CORE_DIR}/alu.sv
#       INCLUDE_DIRS ${RTL_INCLUDE_DIR}
#       TB_SOURCES  ${CMAKE_CURRENT_SOURCE_DIR}/unit/tb_alu.cpp
#       PREFIX      Valu
#   )

function(add_verilator_target)
    cmake_parse_arguments(VT
        ""                                          # Options
        "NAME;TOP_MODULE;PREFIX"                     # Single-value args
        "SOURCES;INCLUDE_DIRS;TB_SOURCES;EXTRA_FLAGS" # Multi-value args
        ${ARGN}
    )

    if(NOT VT_PREFIX)
        set(VT_PREFIX "V${VT_TOP_MODULE}")
    endif()

    # Create C++ executable for the testbench
    add_executable(${VT_NAME} ${VT_TB_SOURCES})

    target_include_directories(${VT_NAME} PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/common
    )

    # Build include dir flags
    set(_INCLUDE_FLAGS "")
    foreach(_dir ${VT_INCLUDE_DIRS})
        list(APPEND _INCLUDE_FLAGS "-I${_dir}")
    endforeach()

    # Verilate the RTL sources
    verilate(${VT_NAME}
        PREFIX      ${VT_PREFIX}
        SOURCES     ${VT_SOURCES}
        TOP_MODULE  ${VT_TOP_MODULE}
        VERILATOR_ARGS
            ${VERILATOR_COMMON_FLAGS}
            ${_INCLUDE_FLAGS}
            ${VT_EXTRA_FLAGS}
    )

    # Register as CTest
    add_test(
        NAME    ${VT_NAME}
        COMMAND ${VT_NAME}
    )

    # Set test timeout
    set_tests_properties(${VT_NAME} PROPERTIES TIMEOUT 60)
endfunction()