mirror of
https://github.com/verilator/verilator.git
synced 2025-04-04 19:52:39 +00:00
Internals: Standardize format of CMake files with gersemi. No functional change intended.
This commit is contained in:
parent
3ae18af8dd
commit
a4085f3a06
@ -14,14 +14,17 @@
|
||||
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
cmake_policy(SET CMP0091 NEW) # Use MSVC_RUNTIME_LIBRARY to select the runtime
|
||||
project(Verilator
|
||||
project(
|
||||
Verilator
|
||||
VERSION 5.029
|
||||
HOMEPAGE_URL https://verilator.org
|
||||
LANGUAGES CXX
|
||||
)
|
||||
|
||||
option(DEBUG_AND_RELEASE_AND_COVERAGE
|
||||
"Builds both the debug and release binaries, overriding CMAKE_BUILD_TYPE. Not supported under MSBuild.")
|
||||
option(
|
||||
DEBUG_AND_RELEASE_AND_COVERAGE
|
||||
"Builds both the debug and release binaries, overriding CMAKE_BUILD_TYPE. Not supported under MSBuild."
|
||||
)
|
||||
|
||||
find_package(Python3 COMPONENTS Interpreter)
|
||||
set(PYTHON3 ${Python3_EXECUTABLE})
|
||||
@ -32,19 +35,22 @@ include(CheckStructHasMember)
|
||||
include(ExternalProject)
|
||||
include(FindThreads)
|
||||
|
||||
if (NOT WIN32)
|
||||
if(NOT WIN32)
|
||||
message(WARNING "CMake support on Linux/OSX is experimental.")
|
||||
endif()
|
||||
|
||||
if (WIN32)
|
||||
if (DEFINED ENV{WIN_FLEX_BISON})
|
||||
if(WIN32)
|
||||
if(DEFINED ENV{WIN_FLEX_BISON})
|
||||
set(WIN_FLEX_BISON "$ENV{WIN_FLEX_BISON}")
|
||||
endif()
|
||||
if (EXISTS ${WIN_FLEX_BISON})
|
||||
if(EXISTS ${WIN_FLEX_BISON})
|
||||
list(APPEND CMAKE_PREFIX_PATH ${WIN_FLEX_BISON})
|
||||
endif()
|
||||
if (NOT WIN_FLEX_BISON)
|
||||
message(FATAL_ERROR "Please install https://github.com/lexxmark/winflexbison and set WIN_FLEX_BISON environment variable. Please use install cmake target after a successful build.")
|
||||
if(NOT WIN_FLEX_BISON)
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"Please install https://github.com/lexxmark/winflexbison and set WIN_FLEX_BISON environment variable. Please use install cmake target after a successful build."
|
||||
)
|
||||
endif()
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
endif()
|
||||
@ -52,20 +58,25 @@ endif()
|
||||
set(OBJCACHE "" CACHE STRING "Path for ccache, auto-detected if empty")
|
||||
option(OBJCACHE_ENABLED "Compile Verilator with ccache" ON)
|
||||
|
||||
if (OBJCACHE_ENABLED)
|
||||
if (OBJCACHE STREQUAL "")
|
||||
if(OBJCACHE_ENABLED)
|
||||
if(OBJCACHE STREQUAL "")
|
||||
find_program(OBJCACHE_PATH ccache)
|
||||
if (OBJCACHE_PATH STREQUAL "OBJCACHE_PATH-NOTFOUND")
|
||||
if(OBJCACHE_PATH STREQUAL "OBJCACHE_PATH-NOTFOUND")
|
||||
set(OBJCACHE_PATH "")
|
||||
endif()
|
||||
else()
|
||||
set(OBJCACHE_PATH "${OBJCACHE}")
|
||||
endif()
|
||||
if (NOT OBJCACHE_PATH STREQUAL "")
|
||||
execute_process(COMMAND "${OBJCACHE_PATH}" --version
|
||||
OUTPUT_VARIABLE objcache_version)
|
||||
if(NOT OBJCACHE_PATH STREQUAL "")
|
||||
execute_process(
|
||||
COMMAND "${OBJCACHE_PATH}" --version
|
||||
OUTPUT_VARIABLE objcache_version
|
||||
)
|
||||
string(REGEX MATCH "[^\n\r]+" objcache_version "${objcache_version}")
|
||||
message(STATUS "Found ccache: ${OBJCACHE_PATH} (\"${objcache_version}\")")
|
||||
message(
|
||||
STATUS
|
||||
"Found ccache: ${OBJCACHE_PATH} (\"${objcache_version}\")"
|
||||
)
|
||||
set(CMAKE_CXX_COMPILER_LAUNCHER "${OBJCACHE_PATH}")
|
||||
endif()
|
||||
endif()
|
||||
@ -76,8 +87,8 @@ find_package(FLEX)
|
||||
# Build
|
||||
#set_property(GLOBAL PROPERTY JOB_POOLS one_job=1)
|
||||
|
||||
if (DEBUG_AND_RELEASE_AND_COVERAGE)
|
||||
if (CMAKE_GENERATOR MATCHES "^Visual Studio ")
|
||||
if(DEBUG_AND_RELEASE_AND_COVERAGE)
|
||||
if(CMAKE_GENERATOR MATCHES "^Visual Studio ")
|
||||
error("%Error: The DEBUG_AND_RELEASE_AND_COVERAGE option is not supported in MSBuild-based builds.")
|
||||
endif()
|
||||
set(saved_build_type ${CMAKE_BUILD_TYPE})
|
||||
@ -102,22 +113,39 @@ set(AR ${CMAKE_AR})
|
||||
configure_file(include/verilated_config.h.in include/verilated_config.h @ONLY)
|
||||
configure_file(include/verilated.mk.in include/verilated.mk @ONLY)
|
||||
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/include/verilated_config.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/include/verilated.mk DESTINATION ${CMAKE_INSTALL_PREFIX}/include)
|
||||
install(
|
||||
FILES ${CMAKE_CURRENT_BINARY_DIR}/include/verilated_config.h
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/include
|
||||
)
|
||||
install(
|
||||
FILES ${CMAKE_CURRENT_BINARY_DIR}/include/verilated.mk
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/include
|
||||
)
|
||||
|
||||
configure_package_config_file(verilator-config.cmake.in verilator-config.cmake
|
||||
configure_package_config_file(
|
||||
verilator-config.cmake.in
|
||||
verilator-config.cmake
|
||||
INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}
|
||||
)
|
||||
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/verilator-config.cmake DESTINATION ${CMAKE_INSTALL_PREFIX})
|
||||
install(
|
||||
FILES ${CMAKE_CURRENT_BINARY_DIR}/verilator-config.cmake
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}
|
||||
)
|
||||
|
||||
configure_package_config_file(verilator-config-version.cmake.in verilator-config-version.cmake
|
||||
configure_package_config_file(
|
||||
verilator-config-version.cmake.in
|
||||
verilator-config-version.cmake
|
||||
INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}
|
||||
)
|
||||
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/verilator-config-version.cmake DESTINATION ${CMAKE_INSTALL_PREFIX})
|
||||
install(
|
||||
FILES ${CMAKE_CURRENT_BINARY_DIR}/verilator-config-version.cmake
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}
|
||||
)
|
||||
|
||||
foreach (program
|
||||
foreach(
|
||||
program
|
||||
verilator
|
||||
verilator_gantt
|
||||
verilator_ccache_report
|
||||
@ -128,13 +156,19 @@ foreach (program
|
||||
install(PROGRAMS bin/${program} TYPE BIN)
|
||||
endforeach()
|
||||
|
||||
install(DIRECTORY examples TYPE DATA FILES_MATCHING
|
||||
install(
|
||||
DIRECTORY examples
|
||||
TYPE DATA
|
||||
FILES_MATCHING
|
||||
PATTERN "examples/*/*.[chv]*"
|
||||
PATTERN "examples/*/Makefile*"
|
||||
PATTERN "examples/*/CMakeLists.txt"
|
||||
)
|
||||
|
||||
install(DIRECTORY include TYPE DATA FILES_MATCHING
|
||||
install(
|
||||
DIRECTORY include
|
||||
TYPE DATA
|
||||
FILES_MATCHING
|
||||
PATTERN "include/verilated_config.h"
|
||||
PATTERN "include/*.[chv]"
|
||||
PATTERN "include/*.cpp"
|
||||
|
14
Makefile.in
14
Makefile.in
@ -463,6 +463,14 @@ YAMLFIX = YAMLFIX_WHITELINES=1 YAMLFIX_LINE_LENGTH=130 YAMLFIX_preserve_quotes=t
|
||||
yamlfix:
|
||||
$(YAMLFIX) .
|
||||
|
||||
# CMake files
|
||||
CMAKE_FILES = \
|
||||
CMakeLists.txt \
|
||||
examples/*/CMakeLists.txt \
|
||||
src/CMakeLists.txt \
|
||||
test_regress/CMakeLists.txt \
|
||||
*.cmake.in \
|
||||
|
||||
# Python programs, subject to format and lint
|
||||
PY_PROGRAMS = \
|
||||
bin/verilator_ccache_report \
|
||||
@ -508,6 +516,12 @@ YAPF_FLAGS = -i --parallel
|
||||
yapf:
|
||||
$(YAPF) $(YAPF_FLAGS) $(PY_FILES)
|
||||
|
||||
GERSEMI = gersemi
|
||||
GERSEMI_FLAGS = -i
|
||||
|
||||
format-cmake:
|
||||
$(GERSEMI) $(GERSEMI_FLAGS) $(CMAKE_FILES)
|
||||
|
||||
PYLINT = pylint
|
||||
PYLINT_FLAGS = --recursive=n --score=n --disable=R0801
|
||||
PYLINT_TEST_FLAGS = $(PYLINT_FLAGS) --disable=C0103,C0114,C0116,C0209,C0411,C0413,C0301,R0801,R0912,R0915,R0916,R1702,W0511,W0621
|
||||
|
@ -24,8 +24,11 @@ cmake_policy(SET CMP0074 NEW)
|
||||
project(cmake_hello_c)
|
||||
|
||||
find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
|
||||
if (NOT verilator_FOUND)
|
||||
message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
|
||||
if(NOT verilator_FOUND)
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable"
|
||||
)
|
||||
endif()
|
||||
|
||||
# Create a new executable target that will contain all your sources
|
||||
@ -35,4 +38,5 @@ target_compile_features(example PUBLIC cxx_std_14)
|
||||
# Add the Verilated circuit to the target
|
||||
verilate(example
|
||||
INCLUDE_DIRS "../make_hello_c"
|
||||
SOURCES ../make_hello_c/top.v)
|
||||
SOURCES ../make_hello_c/top.v
|
||||
)
|
||||
|
@ -24,8 +24,11 @@ cmake_policy(SET CMP0074 NEW)
|
||||
project(cmake_hello_sc CXX)
|
||||
|
||||
find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
|
||||
if (NOT verilator_FOUND)
|
||||
message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
|
||||
if(NOT verilator_FOUND)
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable"
|
||||
)
|
||||
endif()
|
||||
|
||||
# SystemC dependencies
|
||||
@ -39,14 +42,12 @@ find_package(SystemCLanguage QUIET)
|
||||
add_executable(example ../make_hello_sc/sc_main.cpp)
|
||||
target_compile_features(example PUBLIC cxx_std_14)
|
||||
|
||||
set_property(
|
||||
TARGET example
|
||||
PROPERTY CXX_STANDARD ${SystemC_CXX_STANDARD}
|
||||
)
|
||||
set_property(TARGET example PROPERTY CXX_STANDARD ${SystemC_CXX_STANDARD})
|
||||
|
||||
# Add the Verilated circuit to the target
|
||||
verilate(example SYSTEMC
|
||||
INCLUDE_DIRS "../make_hello_sc"
|
||||
SOURCES ../make_hello_sc/top.v)
|
||||
SOURCES ../make_hello_sc/top.v
|
||||
)
|
||||
|
||||
verilator_link_systemc(example)
|
||||
|
@ -24,8 +24,11 @@ cmake_policy(SET CMP0074 NEW)
|
||||
project(cmake_protect_lib)
|
||||
|
||||
find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
|
||||
if (NOT verilator_FOUND)
|
||||
message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
|
||||
if(NOT verilator_FOUND)
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable"
|
||||
)
|
||||
endif()
|
||||
|
||||
# Create the main executable target
|
||||
@ -55,9 +58,11 @@ verilate(verilated_secret
|
||||
VERILATOR_ARGS --protect-lib verilated_secret
|
||||
--protect-key ${PROTECT_KEY}
|
||||
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/verilated_secret
|
||||
SOURCES ../make_protect_lib/secret_impl.v)
|
||||
SOURCES ../make_protect_lib/secret_impl.v
|
||||
)
|
||||
|
||||
# Include location of verilated_secret.sv wrapper
|
||||
verilate(example
|
||||
VERILATOR_ARGS "-I${CMAKE_CURRENT_BINARY_DIR}/verilated_secret"
|
||||
SOURCES ../make_protect_lib/top.v)
|
||||
SOURCES ../make_protect_lib/top.v
|
||||
)
|
||||
|
@ -24,8 +24,11 @@ cmake_policy(SET CMP0074 NEW)
|
||||
project(cmake_tracing_c)
|
||||
|
||||
find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
|
||||
if (NOT verilator_FOUND)
|
||||
message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
|
||||
if(NOT verilator_FOUND)
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable"
|
||||
)
|
||||
endif()
|
||||
|
||||
# Create a new executable target that will contain all your sources
|
||||
@ -36,4 +39,5 @@ target_compile_features(example PUBLIC cxx_std_14)
|
||||
verilate(example COVERAGE TRACE
|
||||
INCLUDE_DIRS "../make_tracing_c"
|
||||
VERILATOR_ARGS -f ../make_tracing_c/input.vc -x-assign fast
|
||||
SOURCES ../make_tracing_c/top.v)
|
||||
SOURCES ../make_tracing_c/top.v
|
||||
)
|
||||
|
@ -25,8 +25,11 @@ cmake_policy(SET CMP0074 NEW)
|
||||
project(cmake_tracing_sc_example CXX)
|
||||
|
||||
find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT})
|
||||
if (NOT verilator_FOUND)
|
||||
message(FATAL_ERROR "Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable")
|
||||
if(NOT verilator_FOUND)
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"Verilator was not found. Either install it, or set the VERILATOR_ROOT environment variable"
|
||||
)
|
||||
endif()
|
||||
|
||||
# SystemC dependencies
|
||||
@ -40,15 +43,13 @@ find_package(SystemCLanguage QUIET)
|
||||
add_executable(example ../make_tracing_sc/sc_main.cpp)
|
||||
target_compile_features(example PUBLIC cxx_std_14)
|
||||
|
||||
set_property(
|
||||
TARGET example
|
||||
PROPERTY CXX_STANDARD ${SystemC_CXX_STANDARD}
|
||||
)
|
||||
set_property(TARGET example PROPERTY CXX_STANDARD ${SystemC_CXX_STANDARD})
|
||||
|
||||
# Add the Verilated circuit to the target
|
||||
verilate(example SYSTEMC COVERAGE TRACE
|
||||
INCLUDE_DIRS "../make_tracing_sc"
|
||||
VERILATOR_ARGS -f ../make_tracing_sc/input.vc -x-assign fast
|
||||
SOURCES ../make_tracing_sc/top.v)
|
||||
SOURCES ../make_tracing_sc/top.v
|
||||
)
|
||||
|
||||
verilator_link_systemc(example)
|
||||
|
@ -14,14 +14,23 @@
|
||||
|
||||
#
|
||||
# Utilities
|
||||
macro (addBuildType sourceConfig newConfig)
|
||||
macro(addBuildType sourceConfig newConfig)
|
||||
get_cmake_property(variableNames VARIABLES)
|
||||
foreach (variableName ${variableNames})
|
||||
if (variableName MATCHES "^CMAKE_.*_${sourceConfig}(|_.*)$")
|
||||
string(REPLACE _${sourceConfig} _${newConfig} newVariableName ${variableName})
|
||||
foreach(variableName ${variableNames})
|
||||
if(variableName MATCHES "^CMAKE_.*_${sourceConfig}(|_.*)$")
|
||||
string(
|
||||
REPLACE
|
||||
_${sourceConfig}
|
||||
_${newConfig}
|
||||
newVariableName
|
||||
${variableName}
|
||||
)
|
||||
set(${newVariableName} ${${variableName}})
|
||||
mark_as_advanced(${newVariableName})
|
||||
message(DEBUG " Propagating ${variableName} to ${newVariableName} = ${${newVariableName}}")
|
||||
message(
|
||||
DEBUG
|
||||
" Propagating ${variableName} to ${newVariableName} = ${${newVariableName}}"
|
||||
)
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
@ -327,9 +336,7 @@ set(COMMON_SOURCES
|
||||
V3PreProc.cpp
|
||||
)
|
||||
|
||||
SET(COVERAGE_SOURCES
|
||||
VlcMain.cpp
|
||||
)
|
||||
set(COVERAGE_SOURCES VlcMain.cpp)
|
||||
|
||||
# Note about tests:
|
||||
# VlcMain.cpp #includes the following files:
|
||||
@ -352,34 +359,49 @@ configure_file(config_package.h.in config_package.h @ONLY)
|
||||
add_custom_command(
|
||||
OUTPUT V3Ast__gen_forward_class_decls.h V3Dfg__gen_forward_class_decls.h
|
||||
DEPENDS ./V3Ast.h ${ASTGEN}
|
||||
COMMAND ${PYTHON3} ARGS
|
||||
${ASTGEN} -I "${srcdir}" --astdef V3AstNodeDType.h --astdef V3AstNodeExpr.h --astdef V3AstNodeOther.h --dfgdef V3DfgVertices.h --classes
|
||||
COMMAND ${PYTHON3}
|
||||
ARGS
|
||||
${ASTGEN} -I "${srcdir}" --astdef V3AstNodeDType.h --astdef
|
||||
V3AstNodeExpr.h --astdef V3AstNodeOther.h --dfgdef V3DfgVertices.h
|
||||
--classes
|
||||
)
|
||||
list(
|
||||
APPEND
|
||||
GENERATED_FILES
|
||||
V3Ast__gen_forward_class_decls.h
|
||||
V3Dfg__gen_forward_class_decls.h
|
||||
)
|
||||
list(APPEND GENERATED_FILES V3Ast__gen_forward_class_decls.h V3Dfg__gen_forward_class_decls.h)
|
||||
# Output used directly by the `verilator` target
|
||||
|
||||
set(verilog_y "${srcdir}/verilog.y" )
|
||||
set(BISON_V3ParseBison_OUTPUT_HEADER "${CMAKE_CURRENT_BINARY_DIR}/V3ParseBison.h")
|
||||
set(BISON_V3ParseBison_OUTPUT_SOURCE "${CMAKE_CURRENT_BINARY_DIR}/V3ParseBison.c")
|
||||
set(verilog_y "${srcdir}/verilog.y")
|
||||
set(BISON_V3ParseBison_OUTPUT_HEADER
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/V3ParseBison.h"
|
||||
)
|
||||
set(BISON_V3ParseBison_OUTPUT_SOURCE
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/V3ParseBison.c"
|
||||
)
|
||||
add_custom_command(
|
||||
OUTPUT V3ParseBison.c V3ParseBison.h
|
||||
MAIN_DEPENDENCY ./verilog.y
|
||||
DEPENDS ${BISONPRE}
|
||||
COMMAND ${PYTHON3} ARGS
|
||||
${BISONPRE} --yacc "${BISON_EXECUTABLE}" -d -v
|
||||
-o "${BISON_V3ParseBison_OUTPUT_SOURCE}" "${verilog_y}"
|
||||
COMMAND ${PYTHON3}
|
||||
ARGS
|
||||
${BISONPRE} --yacc "${BISON_EXECUTABLE}" -d -v -o
|
||||
"${BISON_V3ParseBison_OUTPUT_SOURCE}" "${verilog_y}"
|
||||
)
|
||||
list(APPEND GENERATED_FILES V3ParseBison.c V3ParseBison.h)
|
||||
# Output used directly by the `verilator` target
|
||||
|
||||
set(verilog_l "${srcdir}/verilog.l")
|
||||
set(FLEX_V3Lexer_pregen_OUTPUTS "${CMAKE_CURRENT_BINARY_DIR}/V3Lexer_pregen.yy.cpp")
|
||||
set(FLEX_V3Lexer_pregen_OUTPUTS
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/V3Lexer_pregen.yy.cpp"
|
||||
)
|
||||
add_custom_command(
|
||||
OUTPUT V3Lexer_pregen.yy.cpp
|
||||
MAIN_DEPENDENCY ./verilog.l
|
||||
DEPENDS ${BISON_V3ParseBison_OUTPUT_HEADER} ${HEADERS}
|
||||
COMMAND ${FLEX_EXECUTABLE} ARGS
|
||||
${LFLAGS} -o "${FLEX_V3Lexer_pregen_OUTPUTS}" "${verilog_l}"
|
||||
COMMAND ${FLEX_EXECUTABLE}
|
||||
ARGS ${LFLAGS} -o "${FLEX_V3Lexer_pregen_OUTPUTS}" "${verilog_l}"
|
||||
)
|
||||
# Output used by another command
|
||||
|
||||
@ -388,19 +410,26 @@ add_custom_command(
|
||||
OUTPUT V3Lexer.yy.cpp
|
||||
MAIN_DEPENDENCY ${FLEX_V3Lexer_pregen_OUTPUTS}
|
||||
DEPENDS ${FLEXFIX}
|
||||
COMMAND ${PYTHON3} ARGS
|
||||
${FLEXFIX} V3Lexer < "$<SHELL_PATH:${FLEX_V3Lexer_pregen_OUTPUTS}>" > "$<SHELL_PATH:${FLEX_V3Lexer_OUTPUTS}>"
|
||||
COMMAND ${PYTHON3}
|
||||
ARGS
|
||||
${FLEXFIX} V3Lexer < "$<SHELL_PATH:${FLEX_V3Lexer_pregen_OUTPUTS}>" >
|
||||
"$<SHELL_PATH:${FLEX_V3Lexer_OUTPUTS}>"
|
||||
)
|
||||
add_custom_target(
|
||||
V3Lexer_yy_cpp${CMAKE_BUILD_TYPE}
|
||||
DEPENDS ${FLEX_V3Lexer_OUTPUTS}
|
||||
)
|
||||
add_custom_target(V3Lexer_yy_cpp${CMAKE_BUILD_TYPE} DEPENDS ${FLEX_V3Lexer_OUTPUTS})
|
||||
# Output included by another source file
|
||||
|
||||
set(FLEX_V3PreLex_pregen_OUTPUTS ${CMAKE_CURRENT_BINARY_DIR}/V3PreLex_pregen.yy.cpp)
|
||||
set(FLEX_V3PreLex_pregen_OUTPUTS
|
||||
${CMAKE_CURRENT_BINARY_DIR}/V3PreLex_pregen.yy.cpp
|
||||
)
|
||||
add_custom_command(
|
||||
OUTPUT V3PreLex_pregen.yy.cpp
|
||||
MAIN_DEPENDENCY ./V3PreLex.l
|
||||
DEPENDS ${HEADERS}
|
||||
COMMAND ${FLEX_EXECUTABLE} ARGS
|
||||
${LFLAGS} -o "${FLEX_V3PreLex_pregen_OUTPUTS}" "${srcdir}/V3PreLex.l"
|
||||
COMMAND ${FLEX_EXECUTABLE}
|
||||
ARGS ${LFLAGS} -o "${FLEX_V3PreLex_pregen_OUTPUTS}" "${srcdir}/V3PreLex.l"
|
||||
)
|
||||
# Output used by another command
|
||||
|
||||
@ -409,37 +438,45 @@ add_custom_command(
|
||||
OUTPUT V3PreLex.yy.cpp
|
||||
MAIN_DEPENDENCY ${FLEX_V3PreLex_pregen_OUTPUTS}
|
||||
DEPENDS ${FLEXFIX}
|
||||
COMMAND ${PYTHON3} ARGS
|
||||
${FLEXFIX} V3PreLex < "$<SHELL_PATH:${FLEX_V3PreLex_pregen_OUTPUTS}>" > "$<SHELL_PATH:${FLEX_V3PreLex_OUTPUTS}>"
|
||||
COMMAND ${PYTHON3}
|
||||
ARGS
|
||||
${FLEXFIX} V3PreLex < "$<SHELL_PATH:${FLEX_V3PreLex_pregen_OUTPUTS}>" >
|
||||
"$<SHELL_PATH:${FLEX_V3PreLex_OUTPUTS}>"
|
||||
)
|
||||
add_custom_target(
|
||||
V3PreLex_yy_cpp${CMAKE_BUILD_TYPE}
|
||||
DEPENDS ${FLEX_V3PreLex_OUTPUTS}
|
||||
)
|
||||
add_custom_target(V3PreLex_yy_cpp${CMAKE_BUILD_TYPE} DEPENDS ${FLEX_V3PreLex_OUTPUTS})
|
||||
# Output included by another source file
|
||||
|
||||
set(gitHead ${srcdir}/../.git/logs/HEAD)
|
||||
if (NOT EXISTS ${githead})
|
||||
if(NOT EXISTS ${githead})
|
||||
set(gitHead "")
|
||||
endif()
|
||||
add_custom_command(
|
||||
OUTPUT config_rev.h
|
||||
MAIN_DEPENDENCY ${gitHead}
|
||||
DEPENDS ${CONFIG_REV}
|
||||
COMMAND ${PYTHON3} ARGS
|
||||
${CONFIG_REV} "${srcdir}" > "$<SHELL_PATH:${CMAKE_CURRENT_BINARY_DIR}/config_rev.h>"
|
||||
COMMAND ${PYTHON3}
|
||||
ARGS
|
||||
${CONFIG_REV} "${srcdir}" >
|
||||
"$<SHELL_PATH:${CMAKE_CURRENT_BINARY_DIR}/config_rev.h>"
|
||||
)
|
||||
list(APPEND GENERATED_FILES config_rev.h)
|
||||
# Output used directly by the `verilator` target
|
||||
|
||||
set(ASTGENERATED_NAMES
|
||||
V3Const
|
||||
)
|
||||
set(ASTGENERATED_NAMES V3Const)
|
||||
|
||||
foreach(astgen_name ${ASTGENERATED_NAMES})
|
||||
add_custom_command(
|
||||
OUTPUT ${astgen_name}__gen.cpp
|
||||
MAIN_DEPENDENCY ${astgen_name}.cpp
|
||||
DEPENDS ${ASTGEN} V3Ast.h
|
||||
COMMAND ${PYTHON3} ARGS
|
||||
${ASTGEN} -I "${srcdir}" --astdef V3AstNodeDType.h --astdef V3AstNodeExpr.h --astdef V3AstNodeOther.h --dfgdef V3DfgVertices.h ${astgen_name}.cpp
|
||||
COMMAND ${PYTHON3}
|
||||
ARGS
|
||||
${ASTGEN} -I "${srcdir}" --astdef V3AstNodeDType.h --astdef
|
||||
V3AstNodeExpr.h --astdef V3AstNodeOther.h --dfgdef V3DfgVertices.h
|
||||
${astgen_name}.cpp
|
||||
)
|
||||
list(APPEND GENERATED_FILES ${astgen_name}__gen.cpp)
|
||||
endforeach()
|
||||
@ -447,7 +484,7 @@ endforeach()
|
||||
#
|
||||
# Set up the Coverage build type
|
||||
|
||||
addBuildType(DEBUG COVERAGE)
|
||||
addbuildtype(DEBUG COVERAGE)
|
||||
|
||||
# This regenerates include/verilated_cov_key.h in the source tree.
|
||||
# It is a custom_target, not custom_command, because vlcovgen.d is
|
||||
@ -456,8 +493,7 @@ add_custom_target(
|
||||
vlcovgen.d${CMAKE_BUILD_TYPE}
|
||||
DEPENDS ../include/verilated_cov_key.h ${VLCOVGEN}
|
||||
COMMENT "Updating include/verilated_cov_key.h"
|
||||
COMMAND ${PYTHON3}
|
||||
${VLCOVGEN} --srcdir ${srcdir}
|
||||
COMMAND ${PYTHON3} ${VLCOVGEN} --srcdir ${srcdir}
|
||||
)
|
||||
|
||||
#
|
||||
@ -465,24 +501,29 @@ add_custom_target(
|
||||
|
||||
set(verilator verilator${CMAKE_BUILD_TYPE})
|
||||
|
||||
add_executable(${verilator}
|
||||
add_executable(
|
||||
${verilator}
|
||||
$<$<NOT:$<CONFIG:COVERAGE>>:${COMMON_SOURCES}>
|
||||
$<$<NOT:$<CONFIG:COVERAGE>>:${GENERATED_FILES}>
|
||||
$<$<CONFIG:COVERAGE>:${COVERAGE_SOURCES} config_rev.h>
|
||||
$<$<CONFIG:COVERAGE>:${COVERAGE_SOURCES}
|
||||
config_rev.h>
|
||||
)
|
||||
|
||||
set_target_properties(${verilator} PROPERTIES
|
||||
OUTPUT_NAME_RELEASE verilator_bin
|
||||
OUTPUT_NAME_DEBUG verilator_bin_dbg
|
||||
OUTPUT_NAME_COVERAGE verilator_coverage_bin_dbg
|
||||
#UNITY_BUILD $<IF:$<CONFIG:DEBUG>,FALSE,${CMAKE_UNITY_BUILD}>
|
||||
MSVC_RUNTIME_LIBRARY MultiThreaded$<IF:$<CONFIG:Release>,,DebugDLL>
|
||||
#JOB_POOL_LINK one_job # Linking takes lots of resources
|
||||
INTERPROCEDURAL_OPTIMIZATION_RELEASE $<IF:MINGW,FALSE,TRUE>
|
||||
INCLUDE_DIRECTORIES ${FLEX_INCLUDE_DIR}
|
||||
set_target_properties(
|
||||
${verilator}
|
||||
PROPERTIES
|
||||
OUTPUT_NAME_RELEASE verilator_bin
|
||||
OUTPUT_NAME_DEBUG verilator_bin_dbg
|
||||
OUTPUT_NAME_COVERAGE verilator_coverage_bin_dbg
|
||||
#UNITY_BUILD $<IF:$<CONFIG:DEBUG>,FALSE,${CMAKE_UNITY_BUILD}>
|
||||
MSVC_RUNTIME_LIBRARY MultiThreaded$<IF:$<CONFIG:Release>,,DebugDLL>
|
||||
#JOB_POOL_LINK one_job # Linking takes lots of resources
|
||||
INTERPROCEDURAL_OPTIMIZATION_RELEASE $<IF:MINGW,FALSE,TRUE>
|
||||
INCLUDE_DIRECTORIES ${FLEX_INCLUDE_DIR}
|
||||
)
|
||||
|
||||
add_dependencies(${verilator}
|
||||
add_dependencies(
|
||||
${verilator}
|
||||
V3Lexer_yy_cpp${CMAKE_BUILD_TYPE}
|
||||
V3PreLex_yy_cpp${CMAKE_BUILD_TYPE}
|
||||
)
|
||||
@ -492,41 +533,49 @@ target_link_libraries(${verilator} PRIVATE Threads::Threads)
|
||||
# verilated_cov_key.h is only regenerated in a single-configuration environment.
|
||||
# This limitation can be lifted when `add_dependencies` will support generator
|
||||
# expressions. See https://gitlab.kitware.com/cmake/cmake/issues/19467
|
||||
if (CMAKE_BUILD_TYPE STREQUAL Coverage)
|
||||
if(CMAKE_BUILD_TYPE STREQUAL Coverage)
|
||||
add_dependencies(${verilator} vlcovgen.d${CMAKE_BUILD_TYPE})
|
||||
endif()
|
||||
|
||||
if (NOT MSVC)
|
||||
if(NOT MSVC)
|
||||
target_compile_features(${verilator} PRIVATE cxx_std_11)
|
||||
endif()
|
||||
|
||||
target_compile_definitions(${verilator} PRIVATE
|
||||
YYDEBUG # Required to get nice error messages
|
||||
$<$<CONFIG:DEBUG>:VL_DEBUG>
|
||||
$<$<CONFIG:DEBUG>:_GLIBCXX_DEBUG>
|
||||
)
|
||||
|
||||
target_include_directories(${verilator}
|
||||
target_compile_definitions(
|
||||
${verilator}
|
||||
PRIVATE
|
||||
../include
|
||||
${WIN_FLEX_BISON}
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/../include
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
YYDEBUG # Required to get nice error messages
|
||||
$<$<CONFIG:DEBUG>:VL_DEBUG>
|
||||
$<$<CONFIG:DEBUG>:_GLIBCXX_DEBUG>
|
||||
)
|
||||
|
||||
if (WIN32)
|
||||
target_include_directories(
|
||||
${verilator}
|
||||
PRIVATE
|
||||
../include
|
||||
${WIN_FLEX_BISON}
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/../include
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
)
|
||||
|
||||
if(WIN32)
|
||||
if(MINGW)
|
||||
target_compile_options(${verilator} PRIVATE -Wa,-mbig-obj)
|
||||
target_link_options(${verilator} PRIVATE -Wl,--stack,10000000 -mconsole -lcomctl32 -DWIN_32_LEAN_AND_MEAN)
|
||||
target_link_options(
|
||||
${verilator}
|
||||
PRIVATE
|
||||
-Wl,--stack,10000000
|
||||
-mconsole
|
||||
-lcomctl32
|
||||
-DWIN_32_LEAN_AND_MEAN
|
||||
)
|
||||
else()
|
||||
target_compile_options(${verilator} PRIVATE /bigobj)
|
||||
target_link_options(${verilator} PRIVATE /STACK:10000000)
|
||||
endif()
|
||||
|
||||
target_compile_definitions(${verilator} PRIVATE
|
||||
YY_NO_UNISTD_H
|
||||
)
|
||||
target_compile_definitions(${verilator} PRIVATE YY_NO_UNISTD_H)
|
||||
target_include_directories(${verilator} PRIVATE ../platform/win32)
|
||||
target_link_libraries(${verilator} PRIVATE bcrypt psapi)
|
||||
endif()
|
||||
|
@ -14,19 +14,31 @@
|
||||
|
||||
cmake_minimum_required(VERSION 3.12)
|
||||
cmake_policy(SET CMP0074 NEW)
|
||||
set(TEST_REQUIRED_VARS NAME CSOURCES OPT_FAST OPT_GLOBAL
|
||||
VERILATOR_ROOT VERILATOR_ARGS
|
||||
VERILATOR_SOURCES SYSTEMC VERBOSE VERILATION)
|
||||
set(TEST_REQUIRED_VARS
|
||||
NAME
|
||||
CSOURCES
|
||||
OPT_FAST
|
||||
OPT_GLOBAL
|
||||
VERILATOR_ROOT
|
||||
VERILATOR_ARGS
|
||||
VERILATOR_SOURCES
|
||||
SYSTEMC
|
||||
VERBOSE
|
||||
VERILATION
|
||||
)
|
||||
foreach(var ${TEST_REQUIRED_VARS})
|
||||
if (NOT DEFINED TEST_${var})
|
||||
message(FATAL_ERROR "TEST_${var} not defined. This CMakeLists.txt file is meant to be run by driver.py.")
|
||||
endif()
|
||||
if(NOT DEFINED TEST_${var})
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"TEST_${var} not defined. This CMakeLists.txt file is meant to be run by driver.py."
|
||||
)
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
project("${TEST_NAME}")
|
||||
|
||||
if(TEST_VERBOSE)
|
||||
add_definitions(-DTEST_VERBOSE=1)
|
||||
add_definitions(-DTEST_VERBOSE=1)
|
||||
endif()
|
||||
|
||||
separate_arguments(TEST_VERILATOR_ARGS UNIX_COMMAND "${TEST_VERILATOR_ARGS}")
|
||||
@ -38,33 +50,49 @@ set(TEST_PREFIX ${TEST_NAME})
|
||||
|
||||
# If --ARG <val> is present, set OUT = <val>
|
||||
function(getarg LST ARG OUT)
|
||||
list(FIND ${LST} ${ARG} _INDEX)
|
||||
if(NOT _INDEX EQUAL -1)
|
||||
list(REMOVE_AT ${LST} ${_INDEX})
|
||||
list(GET ${LST} ${_INDEX} VAL)
|
||||
set(${OUT} ${VAL} PARENT_SCOPE)
|
||||
endif()
|
||||
list(FIND ${LST} ${ARG} _INDEX)
|
||||
if(NOT _INDEX EQUAL -1)
|
||||
list(REMOVE_AT ${LST} ${_INDEX})
|
||||
list(GET ${LST} ${_INDEX} VAL)
|
||||
set(${OUT} ${VAL} PARENT_SCOPE)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# Normalise -- to -
|
||||
string(REGEX REPLACE "(^|;)--" "\\1-"
|
||||
TEST_VERILATOR_ARGS_NORM
|
||||
"${TEST_VERILATOR_ARGS}")
|
||||
string(
|
||||
REGEX REPLACE
|
||||
"(^|;)--"
|
||||
"\\1-"
|
||||
TEST_VERILATOR_ARGS_NORM
|
||||
"${TEST_VERILATOR_ARGS}"
|
||||
)
|
||||
|
||||
getarg(TEST_VERILATOR_ARGS_NORM "-prefix" TEST_PREFIX)
|
||||
getarg(TEST_VERILATOR_ARGS_NORM "-threads" TEST_THREADS)
|
||||
getarg(TEST_VERILATOR_ARGS_NORM "-trace-threads" TEST_TRACE_THREADS)
|
||||
|
||||
# Strip unwanted args with 1 parameter
|
||||
string(REGEX REPLACE "(^|;)--?(Mdir|make|prefix|threads|trace-threads);[^;]*" ""
|
||||
TEST_VERILATOR_ARGS
|
||||
"${TEST_VERILATOR_ARGS}")
|
||||
string(
|
||||
REGEX REPLACE
|
||||
"(^|;)--?(Mdir|make|prefix|threads|trace-threads);[^;]*"
|
||||
""
|
||||
TEST_VERILATOR_ARGS
|
||||
"${TEST_VERILATOR_ARGS}"
|
||||
)
|
||||
# Strip unwanted args
|
||||
string(REGEX REPLACE "(^|;)--?(sc|cc)" ""
|
||||
TEST_VERILATOR_ARGS
|
||||
"${TEST_VERILATOR_ARGS}")
|
||||
string(
|
||||
REGEX REPLACE
|
||||
"(^|;)--?(sc|cc)"
|
||||
""
|
||||
TEST_VERILATOR_ARGS
|
||||
"${TEST_VERILATOR_ARGS}"
|
||||
)
|
||||
|
||||
separate_arguments(TEST_VERILATOR_SOURCES UNIX_COMMAND "${TEST_VERILATOR_SOURCES}")
|
||||
separate_arguments(
|
||||
TEST_VERILATOR_SOURCES
|
||||
UNIX_COMMAND
|
||||
"${TEST_VERILATOR_SOURCES}"
|
||||
)
|
||||
# filter out empty sources
|
||||
list(FILTER TEST_VERILATOR_SOURCES EXCLUDE REGEX "$^")
|
||||
|
||||
@ -72,22 +100,22 @@ find_package(verilator REQUIRED HINTS ${TEST_VERILATOR_ROOT})
|
||||
|
||||
set(verilate_ARGS MAIN)
|
||||
if(TEST_PREFIX)
|
||||
list(APPEND verilate_ARGS PREFIX ${TEST_PREFIX})
|
||||
list(APPEND verilate_ARGS PREFIX ${TEST_PREFIX})
|
||||
endif()
|
||||
if(TEST_OPT_FAST)
|
||||
list(APPEND verilate_ARGS OPT_FAST ${TEST_OPT_FAST})
|
||||
list(APPEND verilate_ARGS OPT_FAST ${TEST_OPT_FAST})
|
||||
endif()
|
||||
if(TEST_OPT_GLOBAL)
|
||||
list(APPEND verilate_ARGS OPT_GLOBAL ${TEST_OPT_GLOBAL})
|
||||
list(APPEND verilate_ARGS OPT_GLOBAL ${TEST_OPT_GLOBAL})
|
||||
endif()
|
||||
if(TEST_THREADS)
|
||||
list(APPEND verilate_ARGS THREADS ${TEST_THREADS})
|
||||
list(APPEND verilate_ARGS THREADS ${TEST_THREADS})
|
||||
endif()
|
||||
if(TEST_TRACE_THREADS)
|
||||
list(APPEND verilate_ARGS TRACE_THREADS ${TEST_TRACE_THREADS})
|
||||
list(APPEND verilate_ARGS TRACE_THREADS ${TEST_TRACE_THREADS})
|
||||
endif()
|
||||
if(TEST_SYSTEMC)
|
||||
list(APPEND verilate_ARGS SYSTEMC)
|
||||
list(APPEND verilate_ARGS SYSTEMC)
|
||||
endif()
|
||||
|
||||
set(TARGET_NAME "V${TEST_NAME}")
|
||||
@ -95,21 +123,24 @@ set(TARGET_NAME "V${TEST_NAME}")
|
||||
add_executable(${TARGET_NAME} ${TEST_CSOURCES})
|
||||
|
||||
if(TEST_VERILATION)
|
||||
verilate(${TARGET_NAME} ${verilate_ARGS}
|
||||
VERILATOR_ARGS ${TEST_VERILATOR_ARGS}
|
||||
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
SOURCES ${TEST_VERILATOR_SOURCES})
|
||||
verilate(${TARGET_NAME} ${verilate_ARGS}
|
||||
VERILATOR_ARGS ${TEST_VERILATOR_ARGS}
|
||||
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
SOURCES ${TEST_VERILATOR_SOURCES}
|
||||
)
|
||||
endif()
|
||||
|
||||
if(TEST_SYSTEMC)
|
||||
verilator_link_systemc("${TARGET_NAME}")
|
||||
verilator_link_systemc("${TARGET_NAME}")
|
||||
endif()
|
||||
|
||||
string(TOUPPER "${TEST_NAME}" TEST_NAME_UC)
|
||||
|
||||
target_compile_definitions(${TARGET_NAME} PRIVATE
|
||||
"TEST_OBJ_DIR=${CMAKE_CURRENT_BINARY_DIR}"
|
||||
"VM_PREFIX=${TEST_PREFIX}"
|
||||
"VM_PREFIX_INCLUDE=<${TEST_PREFIX}.h>"
|
||||
"${TEST_NAME_UC}"
|
||||
target_compile_definitions(
|
||||
${TARGET_NAME}
|
||||
PRIVATE
|
||||
"TEST_OBJ_DIR=${CMAKE_CURRENT_BINARY_DIR}"
|
||||
"VM_PREFIX=${TEST_PREFIX}"
|
||||
"VM_PREFIX_INCLUDE=<${TEST_PREFIX}.h>"
|
||||
"${TEST_NAME_UC}"
|
||||
)
|
||||
|
@ -18,10 +18,10 @@
|
||||
set(PACKAGE_VERSION "@PACKAGE_VERSION_NUMBER@")
|
||||
|
||||
if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)
|
||||
set(PACKAGE_VERSION_COMPATIBLE FALSE)
|
||||
set(PACKAGE_VERSION_COMPATIBLE FALSE)
|
||||
else()
|
||||
set(PACKAGE_VERSION_COMPATIBLE TRUE)
|
||||
if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)
|
||||
set(PACKAGE_VERSION_EXACT TRUE)
|
||||
endif()
|
||||
set(PACKAGE_VERSION_COMPATIBLE TRUE)
|
||||
if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)
|
||||
set(PACKAGE_VERSION_EXACT TRUE)
|
||||
endif()
|
||||
endif()
|
||||
|
@ -22,410 +22,539 @@
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
|
||||
# Prefer VERILATOR_ROOT from environment
|
||||
if (DEFINED ENV{VERILATOR_ROOT})
|
||||
set(VERILATOR_ROOT "$ENV{VERILATOR_ROOT}" CACHE PATH "VERILATOR_ROOT")
|
||||
if(DEFINED ENV{VERILATOR_ROOT})
|
||||
set(VERILATOR_ROOT "$ENV{VERILATOR_ROOT}" CACHE PATH "VERILATOR_ROOT")
|
||||
endif()
|
||||
|
||||
set(VERILATOR_ROOT "${CMAKE_CURRENT_LIST_DIR}" CACHE PATH "VERILATOR_ROOT")
|
||||
|
||||
find_program(VERILATOR_BIN NAMES verilator_bin verilator_bin.exe
|
||||
HINTS ${VERILATOR_ROOT}/bin ENV VERILATOR_ROOT
|
||||
NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH)
|
||||
find_program(
|
||||
VERILATOR_BIN
|
||||
NAMES verilator_bin verilator_bin.exe
|
||||
HINTS ${VERILATOR_ROOT}/bin
|
||||
ENV VERILATOR_ROOT
|
||||
NO_CMAKE_PATH
|
||||
NO_CMAKE_ENVIRONMENT_PATH
|
||||
NO_CMAKE_SYSTEM_PATH
|
||||
)
|
||||
|
||||
if (NOT VERILATOR_ROOT)
|
||||
message(FATAL_ERROR "VERILATOR_ROOT cannot be detected. Set it to the appropriate directory (e.g. /usr/share/verilator) as an environment variable or CMake define.")
|
||||
if(NOT VERILATOR_ROOT)
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"VERILATOR_ROOT cannot be detected. Set it to the appropriate directory (e.g. /usr/share/verilator) as an environment variable or CMake define."
|
||||
)
|
||||
endif()
|
||||
|
||||
if (NOT VERILATOR_BIN)
|
||||
message(FATAL_ERROR "Cannot find verilator_bin excecutable.")
|
||||
if(NOT VERILATOR_BIN)
|
||||
message(FATAL_ERROR "Cannot find verilator_bin excecutable.")
|
||||
endif()
|
||||
|
||||
set(verilator_FOUND 1)
|
||||
|
||||
include(CheckCXXSourceCompiles)
|
||||
function(_verilator_check_cxx_libraries LIBRARIES RESVAR)
|
||||
# Check whether a particular link option creates a valid executable
|
||||
set(_VERILATOR_CHECK_CXX_LINK_OPTIONS_SRC "int main() {return 0;}\n")
|
||||
set(CMAKE_REQUIRED_FLAGS)
|
||||
set(CMAKE_REQUIRED_DEFINITIONS)
|
||||
set(CMAKE_REQUIRED_INCLUDES)
|
||||
set(CMAKE_REQUIRED_LINK_OPTIONS)
|
||||
set(CMAKE_REQUIRED_LIBRARIES ${LIBRARIES})
|
||||
set(CMAKE_REQUIRED_QUIET)
|
||||
check_cxx_source_compiles("${_VERILATOR_CHECK_CXX_LINK_OPTIONS_SRC}" "${RESVAR}")
|
||||
set("${RESVAR}" "${${RESVAR}}" PARENT_SCOPE)
|
||||
# Check whether a particular link option creates a valid executable
|
||||
set(_VERILATOR_CHECK_CXX_LINK_OPTIONS_SRC "int main() {return 0;}\n")
|
||||
set(CMAKE_REQUIRED_FLAGS)
|
||||
set(CMAKE_REQUIRED_DEFINITIONS)
|
||||
set(CMAKE_REQUIRED_INCLUDES)
|
||||
set(CMAKE_REQUIRED_LINK_OPTIONS)
|
||||
set(CMAKE_REQUIRED_LIBRARIES ${LIBRARIES})
|
||||
set(CMAKE_REQUIRED_QUIET)
|
||||
check_cxx_source_compiles(
|
||||
"${_VERILATOR_CHECK_CXX_LINK_OPTIONS_SRC}"
|
||||
"${RESVAR}"
|
||||
)
|
||||
set("${RESVAR}" "${${RESVAR}}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
# Check compiler flag support. Skip on MSVC, these are all GCC flags.
|
||||
if (NOT CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
||||
if (NOT DEFINED VERILATOR_CFLAGS OR NOT DEFINED VERILATOR_MT_CFLAGS)
|
||||
include(CheckCXXCompilerFlag)
|
||||
foreach (FLAG @CFG_CXX_FLAGS_CMAKE@)
|
||||
string(MAKE_C_IDENTIFIER ${FLAG} FLAGNAME)
|
||||
check_cxx_compiler_flag(${FLAG} ${FLAGNAME})
|
||||
if (${FLAGNAME})
|
||||
list(APPEND VERILATOR_CFLAGS ${FLAG})
|
||||
endif()
|
||||
endforeach()
|
||||
foreach (FLAG @CFG_LDFLAGS_THREADS_CMAKE@)
|
||||
string(MAKE_C_IDENTIFIER ${FLAG} FLAGNAME)
|
||||
_verilator_check_cxx_libraries("${FLAG}" ${FLAGNAME})
|
||||
if (${FLAGNAME})
|
||||
list(APPEND VERILATOR_MT_CFLAGS ${FLAG})
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
if(NOT CMAKE_CXX_COMPILER_ID MATCHES MSVC)
|
||||
if(NOT DEFINED VERILATOR_CFLAGS OR NOT DEFINED VERILATOR_MT_CFLAGS)
|
||||
include(CheckCXXCompilerFlag)
|
||||
foreach(FLAG @CFG_CXX_FLAGS_CMAKE@)
|
||||
string(MAKE_C_IDENTIFIER ${FLAG} FLAGNAME)
|
||||
check_cxx_compiler_flag(${FLAG} ${FLAGNAME})
|
||||
if(${FLAGNAME})
|
||||
list(APPEND VERILATOR_CFLAGS ${FLAG})
|
||||
endif()
|
||||
endforeach()
|
||||
foreach(FLAG @CFG_LDFLAGS_THREADS_CMAKE@)
|
||||
string(MAKE_C_IDENTIFIER ${FLAG} FLAGNAME)
|
||||
_verilator_check_cxx_libraries("${FLAG}" ${FLAGNAME})
|
||||
if(${FLAGNAME})
|
||||
list(APPEND VERILATOR_MT_CFLAGS ${FLAG})
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "AppleClang")
|
||||
add_link_options(-Wl,-U,__Z15vl_time_stamp64v,-U,__Z13sc_time_stampv)
|
||||
if(${CMAKE_CXX_COMPILER_ID} STREQUAL "AppleClang")
|
||||
add_link_options(-Wl,-U,__Z15vl_time_stamp64v,-U,__Z13sc_time_stampv)
|
||||
endif()
|
||||
|
||||
define_property(TARGET
|
||||
PROPERTY VERILATOR_THREADED
|
||||
BRIEF_DOCS "Deprecated and has no effect (ignored)"
|
||||
FULL_DOCS "Deprecated and has no effect (ignored)"
|
||||
define_property(
|
||||
TARGET
|
||||
PROPERTY VERILATOR_THREADED
|
||||
BRIEF_DOCS "Deprecated and has no effect (ignored)"
|
||||
FULL_DOCS "Deprecated and has no effect (ignored)"
|
||||
)
|
||||
|
||||
define_property(TARGET
|
||||
PROPERTY VERILATOR_TRACE_THREADED
|
||||
BRIEF_DOCS "Verilator multithread tracing enabled"
|
||||
FULL_DOCS "Verilator multithread tracing enabled"
|
||||
define_property(
|
||||
TARGET
|
||||
PROPERTY VERILATOR_TRACE_THREADED
|
||||
BRIEF_DOCS "Verilator multithread tracing enabled"
|
||||
FULL_DOCS "Verilator multithread tracing enabled"
|
||||
)
|
||||
|
||||
define_property(TARGET
|
||||
PROPERTY VERILATOR_TIMING
|
||||
BRIEF_DOCS "Verilator timing enabled"
|
||||
FULL_DOCS "Verilator timing enabled"
|
||||
define_property(
|
||||
TARGET
|
||||
PROPERTY VERILATOR_TIMING
|
||||
BRIEF_DOCS "Verilator timing enabled"
|
||||
FULL_DOCS "Verilator timing enabled"
|
||||
)
|
||||
|
||||
define_property(TARGET
|
||||
PROPERTY VERILATOR_COVERAGE
|
||||
BRIEF_DOCS "Verilator coverage enabled"
|
||||
FULL_DOCS "Verilator coverage enabled"
|
||||
define_property(
|
||||
TARGET
|
||||
PROPERTY VERILATOR_COVERAGE
|
||||
BRIEF_DOCS "Verilator coverage enabled"
|
||||
FULL_DOCS "Verilator coverage enabled"
|
||||
)
|
||||
|
||||
define_property(TARGET
|
||||
PROPERTY VERILATOR_TRACE
|
||||
BRIEF_DOCS "Verilator trace enabled"
|
||||
FULL_DOCS "Verilator trace enabled"
|
||||
define_property(
|
||||
TARGET
|
||||
PROPERTY VERILATOR_TRACE
|
||||
BRIEF_DOCS "Verilator trace enabled"
|
||||
FULL_DOCS "Verilator trace enabled"
|
||||
)
|
||||
|
||||
define_property(TARGET
|
||||
PROPERTY VERILATOR_TRACE_VCD
|
||||
BRIEF_DOCS "Verilator VCD trace enabled"
|
||||
FULL_DOCS "Verilator VCD trace enabled"
|
||||
define_property(
|
||||
TARGET
|
||||
PROPERTY VERILATOR_TRACE_VCD
|
||||
BRIEF_DOCS "Verilator VCD trace enabled"
|
||||
FULL_DOCS "Verilator VCD trace enabled"
|
||||
)
|
||||
|
||||
define_property(TARGET
|
||||
PROPERTY VERILATOR_TRACE_FST
|
||||
BRIEF_DOCS "Verilator FST trace enabled"
|
||||
FULL_DOCS "Verilator FST trace enabled"
|
||||
define_property(
|
||||
TARGET
|
||||
PROPERTY VERILATOR_TRACE_FST
|
||||
BRIEF_DOCS "Verilator FST trace enabled"
|
||||
FULL_DOCS "Verilator FST trace enabled"
|
||||
)
|
||||
|
||||
define_property(TARGET
|
||||
PROPERTY VERILATOR_SYSTEMC
|
||||
BRIEF_DOCS "Verilator SystemC enabled"
|
||||
FULL_DOCS "Verilator SystemC enabled"
|
||||
define_property(
|
||||
TARGET
|
||||
PROPERTY VERILATOR_SYSTEMC
|
||||
BRIEF_DOCS "Verilator SystemC enabled"
|
||||
FULL_DOCS "Verilator SystemC enabled"
|
||||
)
|
||||
|
||||
define_property(TARGET
|
||||
define_property(
|
||||
TARGET
|
||||
PROPERTY VERILATOR_TRACE_STRUCTS
|
||||
BRIEF_DOCS "Verilator trace structs enabled"
|
||||
FULL_DOCS "Verilator trace structs enabled"
|
||||
)
|
||||
|
||||
|
||||
function(verilate TARGET)
|
||||
cmake_parse_arguments(VERILATE "COVERAGE;TRACE;TRACE_FST;SYSTEMC;TRACE_STRUCTS"
|
||||
"PREFIX;TOP_MODULE;THREADS;TRACE_THREADS;DIRECTORY"
|
||||
"SOURCES;VERILATOR_ARGS;INCLUDE_DIRS;OPT_SLOW;OPT_FAST;OPT_GLOBAL"
|
||||
${ARGN})
|
||||
if (NOT VERILATE_SOURCES)
|
||||
message(FATAL_ERROR "Need at least one source")
|
||||
endif()
|
||||
|
||||
if (NOT VERILATE_PREFIX)
|
||||
list(LENGTH VERILATE_SOURCES NUM_SOURCES)
|
||||
if (${NUM_SOURCES} GREATER 1)
|
||||
message(WARNING "Specify PREFIX if there are multiple SOURCES")
|
||||
cmake_parse_arguments(
|
||||
VERILATE
|
||||
"COVERAGE;TRACE;TRACE_FST;SYSTEMC;TRACE_STRUCTS"
|
||||
"PREFIX;TOP_MODULE;THREADS;TRACE_THREADS;DIRECTORY"
|
||||
"SOURCES;VERILATOR_ARGS;INCLUDE_DIRS;OPT_SLOW;OPT_FAST;OPT_GLOBAL"
|
||||
${ARGN}
|
||||
)
|
||||
if(NOT VERILATE_SOURCES)
|
||||
message(FATAL_ERROR "Need at least one source")
|
||||
endif()
|
||||
list(GET VERILATE_SOURCES 0 TOPSRC)
|
||||
get_filename_component(_SRC_NAME ${TOPSRC} NAME_WE)
|
||||
string(MAKE_C_IDENTIFIER V${_SRC_NAME} VERILATE_PREFIX)
|
||||
endif()
|
||||
|
||||
if (VERILATE_TOP_MODULE)
|
||||
list(APPEND VERILATOR_ARGS --top ${VERILATE_TOP_MODULE})
|
||||
endif()
|
||||
|
||||
if (VERILATE_THREADS)
|
||||
list(APPEND VERILATOR_ARGS --threads ${VERILATE_THREADS})
|
||||
endif()
|
||||
|
||||
if (VERILATE_TRACE_THREADS)
|
||||
list(APPEND VERILATOR_ARGS --trace-threads ${VERILATE_TRACE_THREADS})
|
||||
endif()
|
||||
|
||||
if (VERILATE_COVERAGE)
|
||||
list(APPEND VERILATOR_ARGS --coverage)
|
||||
endif()
|
||||
|
||||
if (VERILATE_TRACE AND VERILATE_TRACE_FST)
|
||||
message(FATAL_ERROR "Cannot have both TRACE and TRACE_FST")
|
||||
endif()
|
||||
|
||||
if (VERILATE_TRACE)
|
||||
list(APPEND VERILATOR_ARGS --trace)
|
||||
endif()
|
||||
|
||||
if (VERILATE_TRACE_FST)
|
||||
list(APPEND VERILATOR_ARGS --trace-fst)
|
||||
endif()
|
||||
|
||||
if (VERILATE_SYSTEMC)
|
||||
list(APPEND VERILATOR_ARGS --sc)
|
||||
else()
|
||||
list(APPEND VERILATOR_ARGS --cc)
|
||||
endif()
|
||||
|
||||
if (VERILATE_TRACE_STRUCTS)
|
||||
list(APPEND VERILATOR_ARGS --trace-structs)
|
||||
endif()
|
||||
|
||||
foreach(INC ${VERILATE_INCLUDE_DIRS})
|
||||
list(APPEND VERILATOR_ARGS -y "${INC}")
|
||||
endforeach()
|
||||
|
||||
string(TOLOWER ${CMAKE_CXX_COMPILER_ID} COMPILER)
|
||||
if (COMPILER STREQUAL "appleclang")
|
||||
set(COMPILER clang)
|
||||
elseif (NOT COMPILER MATCHES "^msvc$|^clang$")
|
||||
set(COMPILER gcc)
|
||||
endif()
|
||||
|
||||
get_target_property(BINARY_DIR "${TARGET}" BINARY_DIR)
|
||||
get_target_property(TARGET_NAME "${TARGET}" NAME)
|
||||
set(VDIR "${BINARY_DIR}/CMakeFiles/${TARGET_NAME}.dir/${VERILATE_PREFIX}.dir")
|
||||
|
||||
if (VERILATE_DIRECTORY)
|
||||
set(VDIR "${VERILATE_DIRECTORY}")
|
||||
endif()
|
||||
|
||||
file(MAKE_DIRECTORY ${VDIR})
|
||||
|
||||
set(VERILATOR_COMMAND "${CMAKE_COMMAND}" -E env "VERILATOR_ROOT=${VERILATOR_ROOT}"
|
||||
"${VERILATOR_BIN}" --compiler ${COMPILER}
|
||||
--prefix ${VERILATE_PREFIX} --Mdir ${VDIR} --make cmake
|
||||
${VERILATOR_ARGS} ${VERILATE_VERILATOR_ARGS}
|
||||
${VERILATE_SOURCES})
|
||||
|
||||
set(VARGS_FILE "${VDIR}/verilator_args.txt")
|
||||
set(VCMAKE "${VDIR}/${VERILATE_PREFIX}.cmake")
|
||||
set(VCMAKE_COPY "${VDIR}/${VERILATE_PREFIX}_copy.cmake")
|
||||
|
||||
if (NOT EXISTS "${VARGS_FILE}" OR NOT EXISTS "${VCMAKE_COPY}")
|
||||
set(VERILATOR_OUTDATED ON)
|
||||
else()
|
||||
file(READ "${VARGS_FILE}" PREVIOUS_VERILATOR_COMMAND)
|
||||
if(NOT VERILATOR_COMMAND STREQUAL PREVIOUS_VERILATOR_COMMAND)
|
||||
set(VERILATOR_OUTDATED ON)
|
||||
if(NOT VERILATE_PREFIX)
|
||||
list(LENGTH VERILATE_SOURCES NUM_SOURCES)
|
||||
if(${NUM_SOURCES} GREATER 1)
|
||||
message(WARNING "Specify PREFIX if there are multiple SOURCES")
|
||||
endif()
|
||||
list(GET VERILATE_SOURCES 0 TOPSRC)
|
||||
get_filename_component(_SRC_NAME ${TOPSRC} NAME_WE)
|
||||
string(MAKE_C_IDENTIFIER V${_SRC_NAME} VERILATE_PREFIX)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (VERILATOR_OUTDATED)
|
||||
message(STATUS "Executing Verilator...")
|
||||
execute_process(
|
||||
COMMAND ${VERILATOR_COMMAND}
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
RESULT_VARIABLE _VERILATOR_RC
|
||||
OUTPUT_VARIABLE _VERILATOR_OUTPUT
|
||||
ERROR_VARIABLE _VERILATOR_OUTPUT)
|
||||
if (_VERILATOR_RC)
|
||||
string(REPLACE ";" " " VERILATOR_COMMAND_READABLE "${VERILATOR_COMMAND}")
|
||||
message("Verilator command: \"${VERILATOR_COMMAND_READABLE}\"")
|
||||
message("Output:\n${_VERILATOR_OUTPUT}")
|
||||
message(FATAL_ERROR "Verilator command failed (return code=${_VERILATOR_RC})")
|
||||
if(VERILATE_TOP_MODULE)
|
||||
list(APPEND VERILATOR_ARGS --top ${VERILATE_TOP_MODULE})
|
||||
endif()
|
||||
execute_process(COMMAND "${CMAKE_COMMAND}" -E copy "${VCMAKE}" "${VCMAKE_COPY}")
|
||||
endif()
|
||||
file(WRITE "${VARGS_FILE}" "${VERILATOR_COMMAND}")
|
||||
|
||||
include("${VCMAKE_COPY}")
|
||||
if(VERILATE_THREADS)
|
||||
list(APPEND VERILATOR_ARGS --threads ${VERILATE_THREADS})
|
||||
endif()
|
||||
|
||||
set(GENERATED_C_SOURCES ${${VERILATE_PREFIX}_CLASSES_FAST}
|
||||
${${VERILATE_PREFIX}_CLASSES_SLOW}
|
||||
${${VERILATE_PREFIX}_SUPPORT_FAST}
|
||||
${${VERILATE_PREFIX}_SUPPORT_SLOW})
|
||||
# No need for .h's as the .cpp will get written same time
|
||||
set(GENERATED_SOURCES ${GENERATED_C_SOURCES})
|
||||
if(VERILATE_TRACE_THREADS)
|
||||
list(APPEND VERILATOR_ARGS --trace-threads ${VERILATE_TRACE_THREADS})
|
||||
endif()
|
||||
|
||||
add_custom_command(OUTPUT ${GENERATED_SOURCES} "${VCMAKE}"
|
||||
COMMAND ${VERILATOR_COMMAND}
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
DEPENDS "${VERILATOR_BIN}" ${${VERILATE_PREFIX}_DEPS} VERBATIM)
|
||||
# Reconfigure if file list has changed
|
||||
# (check contents rather than modified time to avoid unnecessary reconfiguration)
|
||||
add_custom_command(OUTPUT "${VCMAKE_COPY}"
|
||||
COMMAND "${CMAKE_COMMAND}" -E copy_if_different
|
||||
"${VCMAKE}" "${VCMAKE_COPY}"
|
||||
DEPENDS "${VCMAKE}" VERBATIM)
|
||||
if(VERILATE_COVERAGE)
|
||||
list(APPEND VERILATOR_ARGS --coverage)
|
||||
endif()
|
||||
|
||||
if (${VERILATE_PREFIX}_COVERAGE)
|
||||
# If any verilate() call specifies COVERAGE, define VM_COVERAGE in the final build
|
||||
set_property(TARGET ${TARGET} PROPERTY VERILATOR_COVERAGE ON)
|
||||
endif()
|
||||
if(VERILATE_TRACE AND VERILATE_TRACE_FST)
|
||||
message(FATAL_ERROR "Cannot have both TRACE and TRACE_FST")
|
||||
endif()
|
||||
|
||||
if (${VERILATE_PREFIX}_TRACE_VCD)
|
||||
# If any verilate() call specifies TRACE, define VM_TRACE in the final build
|
||||
set_property(TARGET ${TARGET} PROPERTY VERILATOR_TRACE ON)
|
||||
set_property(TARGET ${TARGET} PROPERTY VERILATOR_TRACE_VCD ON)
|
||||
endif()
|
||||
if(VERILATE_TRACE)
|
||||
list(APPEND VERILATOR_ARGS --trace)
|
||||
endif()
|
||||
|
||||
if (${VERILATE_PREFIX}_TRACE_FST)
|
||||
# If any verilate() call specifies TRACE_FST, define VM_TRACE_FST in the final build
|
||||
set_property(TARGET ${TARGET} PROPERTY VERILATOR_TRACE ON)
|
||||
set_property(TARGET ${TARGET} PROPERTY VERILATOR_TRACE_FST ON)
|
||||
endif()
|
||||
if(VERILATE_TRACE_FST)
|
||||
list(APPEND VERILATOR_ARGS --trace-fst)
|
||||
endif()
|
||||
|
||||
if (${VERILATE_PREFIX}_SC)
|
||||
# If any verilate() call specifies SYSTEMC, define VM_SC in the final build
|
||||
set_property(TARGET ${TARGET} PROPERTY VERILATOR_SYSTEMC ON)
|
||||
endif()
|
||||
if(VERILATE_SYSTEMC)
|
||||
list(APPEND VERILATOR_ARGS --sc)
|
||||
else()
|
||||
list(APPEND VERILATOR_ARGS --cc)
|
||||
endif()
|
||||
|
||||
if (${VERILATE_PREFIX}_TRACE_STRUCTS)
|
||||
set_property(TARGET ${TARGET} PROPERTY VERILATOR_TRACE_STRUCTS ON)
|
||||
endif()
|
||||
if(VERILATE_TRACE_STRUCTS)
|
||||
list(APPEND VERILATOR_ARGS --trace-structs)
|
||||
endif()
|
||||
|
||||
foreach(INC ${VERILATE_INCLUDE_DIRS})
|
||||
list(APPEND VERILATOR_ARGS -y "${INC}")
|
||||
endforeach()
|
||||
|
||||
string(TOLOWER ${CMAKE_CXX_COMPILER_ID} COMPILER)
|
||||
if(COMPILER STREQUAL "appleclang")
|
||||
set(COMPILER clang)
|
||||
elseif(NOT COMPILER MATCHES "^msvc$|^clang$")
|
||||
set(COMPILER gcc)
|
||||
endif()
|
||||
|
||||
get_target_property(BINARY_DIR "${TARGET}" BINARY_DIR)
|
||||
get_target_property(TARGET_NAME "${TARGET}" NAME)
|
||||
set(VDIR
|
||||
"${BINARY_DIR}/CMakeFiles/${TARGET_NAME}.dir/${VERILATE_PREFIX}.dir"
|
||||
)
|
||||
|
||||
if(VERILATE_DIRECTORY)
|
||||
set(VDIR "${VERILATE_DIRECTORY}")
|
||||
endif()
|
||||
|
||||
file(MAKE_DIRECTORY ${VDIR})
|
||||
|
||||
set(VERILATOR_COMMAND
|
||||
"${CMAKE_COMMAND}"
|
||||
-E
|
||||
env
|
||||
"VERILATOR_ROOT=${VERILATOR_ROOT}"
|
||||
"${VERILATOR_BIN}"
|
||||
--compiler
|
||||
${COMPILER}
|
||||
--prefix
|
||||
${VERILATE_PREFIX}
|
||||
--Mdir
|
||||
${VDIR}
|
||||
--make
|
||||
cmake
|
||||
${VERILATOR_ARGS}
|
||||
${VERILATE_VERILATOR_ARGS}
|
||||
${VERILATE_SOURCES}
|
||||
)
|
||||
|
||||
set(VARGS_FILE "${VDIR}/verilator_args.txt")
|
||||
set(VCMAKE "${VDIR}/${VERILATE_PREFIX}.cmake")
|
||||
set(VCMAKE_COPY "${VDIR}/${VERILATE_PREFIX}_copy.cmake")
|
||||
|
||||
if(NOT EXISTS "${VARGS_FILE}" OR NOT EXISTS "${VCMAKE_COPY}")
|
||||
set(VERILATOR_OUTDATED ON)
|
||||
else()
|
||||
file(READ "${VARGS_FILE}" PREVIOUS_VERILATOR_COMMAND)
|
||||
if(NOT VERILATOR_COMMAND STREQUAL PREVIOUS_VERILATOR_COMMAND)
|
||||
set(VERILATOR_OUTDATED ON)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(VERILATOR_OUTDATED)
|
||||
message(STATUS "Executing Verilator...")
|
||||
execute_process(
|
||||
COMMAND ${VERILATOR_COMMAND}
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
RESULT_VARIABLE _VERILATOR_RC
|
||||
OUTPUT_VARIABLE _VERILATOR_OUTPUT
|
||||
ERROR_VARIABLE _VERILATOR_OUTPUT
|
||||
)
|
||||
if(_VERILATOR_RC)
|
||||
string(
|
||||
REPLACE
|
||||
";"
|
||||
" "
|
||||
VERILATOR_COMMAND_READABLE
|
||||
"${VERILATOR_COMMAND}"
|
||||
)
|
||||
message("Verilator command: \"${VERILATOR_COMMAND_READABLE}\"")
|
||||
message("Output:\n${_VERILATOR_OUTPUT}")
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"Verilator command failed (return code=${_VERILATOR_RC})"
|
||||
)
|
||||
endif()
|
||||
execute_process(
|
||||
COMMAND "${CMAKE_COMMAND}" -E copy "${VCMAKE}" "${VCMAKE_COPY}"
|
||||
)
|
||||
endif()
|
||||
file(WRITE "${VARGS_FILE}" "${VERILATOR_COMMAND}")
|
||||
|
||||
include("${VCMAKE_COPY}")
|
||||
|
||||
set(GENERATED_C_SOURCES
|
||||
${${VERILATE_PREFIX}_CLASSES_FAST}
|
||||
${${VERILATE_PREFIX}_CLASSES_SLOW}
|
||||
${${VERILATE_PREFIX}_SUPPORT_FAST}
|
||||
${${VERILATE_PREFIX}_SUPPORT_SLOW}
|
||||
)
|
||||
# No need for .h's as the .cpp will get written same time
|
||||
set(GENERATED_SOURCES ${GENERATED_C_SOURCES})
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${GENERATED_SOURCES} "${VCMAKE}"
|
||||
COMMAND ${VERILATOR_COMMAND}
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
DEPENDS "${VERILATOR_BIN}" ${${VERILATE_PREFIX}_DEPS}
|
||||
VERBATIM
|
||||
)
|
||||
# Reconfigure if file list has changed
|
||||
# (check contents rather than modified time to avoid unnecessary reconfiguration)
|
||||
add_custom_command(
|
||||
OUTPUT "${VCMAKE_COPY}"
|
||||
COMMAND
|
||||
"${CMAKE_COMMAND}" -E copy_if_different "${VCMAKE}" "${VCMAKE_COPY}"
|
||||
DEPENDS "${VCMAKE}"
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
if(${VERILATE_PREFIX}_COVERAGE)
|
||||
# If any verilate() call specifies COVERAGE, define VM_COVERAGE in the final build
|
||||
set_property(TARGET ${TARGET} PROPERTY VERILATOR_COVERAGE ON)
|
||||
endif()
|
||||
|
||||
if(${VERILATE_PREFIX}_TRACE_VCD)
|
||||
# If any verilate() call specifies TRACE, define VM_TRACE in the final build
|
||||
set_property(TARGET ${TARGET} PROPERTY VERILATOR_TRACE ON)
|
||||
set_property(TARGET ${TARGET} PROPERTY VERILATOR_TRACE_VCD ON)
|
||||
endif()
|
||||
|
||||
if(${VERILATE_PREFIX}_TRACE_FST)
|
||||
# If any verilate() call specifies TRACE_FST, define VM_TRACE_FST in the final build
|
||||
set_property(TARGET ${TARGET} PROPERTY VERILATOR_TRACE ON)
|
||||
set_property(TARGET ${TARGET} PROPERTY VERILATOR_TRACE_FST ON)
|
||||
endif()
|
||||
|
||||
if(${VERILATE_PREFIX}_SC)
|
||||
# If any verilate() call specifies SYSTEMC, define VM_SC in the final build
|
||||
set_property(TARGET ${TARGET} PROPERTY VERILATOR_SYSTEMC ON)
|
||||
endif()
|
||||
|
||||
if(${VERILATE_PREFIX}_TRACE_STRUCTS)
|
||||
set_property(TARGET ${TARGET} PROPERTY VERILATOR_TRACE_STRUCTS ON)
|
||||
endif()
|
||||
|
||||
# Add the compile flags only on Verilated sources
|
||||
target_include_directories(${TARGET} PUBLIC ${VDIR})
|
||||
target_sources(${TARGET} PRIVATE ${GENERATED_SOURCES} "${VCMAKE_COPY}"
|
||||
${${VERILATE_PREFIX}_GLOBAL}
|
||||
${${VERILATE_PREFIX}_USER_CLASSES})
|
||||
foreach(_VSOURCE ${VERILATE_SOURCES} ${${VERILATE_PREFIX}_DEPS})
|
||||
get_filename_component(_VSOURCE "${_VSOURCE}" ABSOLUTE BASE_DIR)
|
||||
list(APPEND VHD_SOURCES "${_VSOURCE}")
|
||||
endforeach()
|
||||
target_sources(${TARGET} PRIVATE ${VHD_SOURCES})
|
||||
|
||||
# Add the compile flags only on Verilated sources
|
||||
foreach(VSLOW ${${VERILATE_PREFIX}_CLASSES_SLOW} ${${VERILATE_PREFIX}_SUPPORT_SLOW})
|
||||
foreach(OPT_SLOW ${VERILATE_OPT_SLOW} ${${VERILATE_PREFIX}_USER_CFLAGS})
|
||||
set_property(SOURCE "${VSLOW}" APPEND_STRING PROPERTY COMPILE_FLAGS " ${OPT_SLOW}")
|
||||
target_include_directories(${TARGET} PUBLIC ${VDIR})
|
||||
target_sources(
|
||||
${TARGET}
|
||||
PRIVATE
|
||||
${GENERATED_SOURCES}
|
||||
"${VCMAKE_COPY}"
|
||||
${${VERILATE_PREFIX}_GLOBAL}
|
||||
${${VERILATE_PREFIX}_USER_CLASSES}
|
||||
)
|
||||
foreach(_VSOURCE ${VERILATE_SOURCES} ${${VERILATE_PREFIX}_DEPS})
|
||||
get_filename_component(_VSOURCE "${_VSOURCE}" ABSOLUTE BASE_DIR)
|
||||
list(APPEND VHD_SOURCES "${_VSOURCE}")
|
||||
endforeach()
|
||||
endforeach()
|
||||
foreach(VFAST ${${VERILATE_PREFIX}_CLASSES_FAST} ${${VERILATE_PREFIX}_SUPPORT_FAST})
|
||||
foreach(OPT_FAST ${VERILATE_OPT_FAST} ${${VERILATE_PREFIX}_USER_CFLAGS})
|
||||
set_property(SOURCE "${VFAST}" APPEND_STRING PROPERTY COMPILE_FLAGS " ${OPT_FAST}")
|
||||
target_sources(${TARGET} PRIVATE ${VHD_SOURCES})
|
||||
|
||||
# Add the compile flags only on Verilated sources
|
||||
foreach(
|
||||
VSLOW
|
||||
${${VERILATE_PREFIX}_CLASSES_SLOW}
|
||||
${${VERILATE_PREFIX}_SUPPORT_SLOW}
|
||||
)
|
||||
foreach(OPT_SLOW ${VERILATE_OPT_SLOW} ${${VERILATE_PREFIX}_USER_CFLAGS})
|
||||
set_property(
|
||||
SOURCE "${VSLOW}"
|
||||
APPEND_STRING
|
||||
PROPERTY COMPILE_FLAGS " ${OPT_SLOW}"
|
||||
)
|
||||
endforeach()
|
||||
endforeach()
|
||||
endforeach()
|
||||
foreach(VGLOBAL ${${VERILATE_PREFIX}_GLOBAL})
|
||||
foreach(OPT_GLOBAL ${VERILATE_OPT_GLOBAL} ${${VERILATE_PREFIX}_USER_CFLAGS})
|
||||
set_property(SOURCE "${VGLOBAL}" APPEND_STRING PROPERTY COMPILE_FLAGS " ${OPT_GLOBAL}")
|
||||
foreach(
|
||||
VFAST
|
||||
${${VERILATE_PREFIX}_CLASSES_FAST}
|
||||
${${VERILATE_PREFIX}_SUPPORT_FAST}
|
||||
)
|
||||
foreach(OPT_FAST ${VERILATE_OPT_FAST} ${${VERILATE_PREFIX}_USER_CFLAGS})
|
||||
set_property(
|
||||
SOURCE "${VFAST}"
|
||||
APPEND_STRING
|
||||
PROPERTY COMPILE_FLAGS " ${OPT_FAST}"
|
||||
)
|
||||
endforeach()
|
||||
endforeach()
|
||||
foreach(VGLOBAL ${${VERILATE_PREFIX}_GLOBAL})
|
||||
foreach(
|
||||
OPT_GLOBAL
|
||||
${VERILATE_OPT_GLOBAL}
|
||||
${${VERILATE_PREFIX}_USER_CFLAGS}
|
||||
)
|
||||
set_property(
|
||||
SOURCE "${VGLOBAL}"
|
||||
APPEND_STRING
|
||||
PROPERTY COMPILE_FLAGS " ${OPT_GLOBAL}"
|
||||
)
|
||||
endforeach()
|
||||
endforeach()
|
||||
endforeach()
|
||||
|
||||
target_include_directories(${TARGET} PUBLIC "${VERILATOR_ROOT}/include"
|
||||
"${VERILATOR_ROOT}/include/vltstd")
|
||||
target_compile_definitions(${TARGET} PRIVATE
|
||||
VM_COVERAGE=$<BOOL:$<TARGET_PROPERTY:VERILATOR_COVERAGE>>
|
||||
VM_SC=$<BOOL:$<TARGET_PROPERTY:VERILATOR_SYSTEMC>>
|
||||
VM_TRACE=$<BOOL:$<TARGET_PROPERTY:VERILATOR_TRACE>>
|
||||
VM_TRACE_VCD=$<BOOL:$<TARGET_PROPERTY:VERILATOR_TRACE_VCD>>
|
||||
VM_TRACE_FST=$<BOOL:$<TARGET_PROPERTY:VERILATOR_TRACE_FST>>
|
||||
)
|
||||
target_include_directories(
|
||||
${TARGET}
|
||||
PUBLIC "${VERILATOR_ROOT}/include" "${VERILATOR_ROOT}/include/vltstd"
|
||||
)
|
||||
target_compile_definitions(
|
||||
${TARGET}
|
||||
PRIVATE
|
||||
VM_COVERAGE=$<BOOL:$<TARGET_PROPERTY:VERILATOR_COVERAGE>>
|
||||
VM_SC=$<BOOL:$<TARGET_PROPERTY:VERILATOR_SYSTEMC>>
|
||||
VM_TRACE=$<BOOL:$<TARGET_PROPERTY:VERILATOR_TRACE>>
|
||||
VM_TRACE_VCD=$<BOOL:$<TARGET_PROPERTY:VERILATOR_TRACE_VCD>>
|
||||
VM_TRACE_FST=$<BOOL:$<TARGET_PROPERTY:VERILATOR_TRACE_FST>>
|
||||
)
|
||||
|
||||
target_link_libraries(${TARGET} PUBLIC
|
||||
${${VERILATE_PREFIX}_USER_LDLIBS}
|
||||
)
|
||||
target_link_libraries(${TARGET} PUBLIC ${${VERILATE_PREFIX}_USER_LDLIBS})
|
||||
|
||||
target_link_libraries(${TARGET} PUBLIC
|
||||
${VERILATOR_MT_CFLAGS}
|
||||
)
|
||||
target_link_libraries(${TARGET} PUBLIC ${VERILATOR_MT_CFLAGS})
|
||||
|
||||
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
||||
target_compile_features(${TARGET} PRIVATE cxx_std_11)
|
||||
|
||||
if (${VERILATE_PREFIX}_TIMING)
|
||||
check_cxx_compiler_flag(-fcoroutines-ts COROUTINES_TS_FLAG)
|
||||
target_compile_options(${TARGET} PRIVATE $<IF:$<BOOL:${COROUTINES_TS_FLAG}>,-fcoroutines-ts,-fcoroutines>)
|
||||
endif()
|
||||
if(${VERILATE_PREFIX}_TIMING)
|
||||
check_cxx_compiler_flag(-fcoroutines-ts COROUTINES_TS_FLAG)
|
||||
target_compile_options(
|
||||
${TARGET}
|
||||
PRIVATE
|
||||
$<IF:$<BOOL:${COROUTINES_TS_FLAG}>,-fcoroutines-ts,-fcoroutines>
|
||||
)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(_verilator_find_systemc)
|
||||
if (NOT TARGET Verilator::systemc)
|
||||
# Find SystemC include file "systemc.h" in the following order:
|
||||
# 1. SYSTEMC_INCLUDE (environment) variable
|
||||
# 2. SYSTEMC_ROOT (environment) variable
|
||||
# 3. SYSTEMC (environment) variable
|
||||
# 4. Use CMake module provided by SystemC installation
|
||||
# (eventually requires CMAKE_PREFIX_PATH set)
|
||||
if(NOT TARGET Verilator::systemc)
|
||||
# Find SystemC include file "systemc.h" in the following order:
|
||||
# 1. SYSTEMC_INCLUDE (environment) variable
|
||||
# 2. SYSTEMC_ROOT (environment) variable
|
||||
# 3. SYSTEMC (environment) variable
|
||||
# 4. Use CMake module provided by SystemC installation
|
||||
# (eventually requires CMAKE_PREFIX_PATH set)
|
||||
|
||||
find_path(SYSTEMC_INCLUDEDIR NAMES systemc.h
|
||||
HINTS "${SYSTEMC_INCLUDE} " ENV SYSTEMC_INCLUDE)
|
||||
find_path(SYSTEMC_INCLUDEDIR NAMES systemc.h
|
||||
HINTS "${SYSTEMC_ROOT}" ENV SYSTEMC_ROOT
|
||||
PATH_SUFFIXES include)
|
||||
find_path(SYSTEMC_INCLUDEDIR NAMES systemc.h
|
||||
HINTS "${SYSTEMC}" ENV SYSTEMC
|
||||
PATH_SUFFIXES include)
|
||||
find_path(
|
||||
SYSTEMC_INCLUDEDIR
|
||||
NAMES systemc.h
|
||||
HINTS "${SYSTEMC_INCLUDE} "
|
||||
ENV SYSTEMC_INCLUDE
|
||||
)
|
||||
find_path(
|
||||
SYSTEMC_INCLUDEDIR
|
||||
NAMES systemc.h
|
||||
HINTS "${SYSTEMC_ROOT}"
|
||||
ENV SYSTEMC_ROOT
|
||||
PATH_SUFFIXES include
|
||||
)
|
||||
find_path(
|
||||
SYSTEMC_INCLUDEDIR
|
||||
NAMES systemc.h
|
||||
HINTS "${SYSTEMC}"
|
||||
ENV SYSTEMC
|
||||
PATH_SUFFIXES include
|
||||
)
|
||||
|
||||
# Find SystemC library in the following order:
|
||||
# 1. SYSTEMC_LIBDIR (environment) variable
|
||||
# 2. SYSTEMC_ROOT (environment) variable
|
||||
# 3. SYSTEMC (environment) variable
|
||||
# 4. Use CMake module provided by SystemC installation
|
||||
# (eventually requires CMAKE_PREFIX_PATH set)
|
||||
# Find SystemC library in the following order:
|
||||
# 1. SYSTEMC_LIBDIR (environment) variable
|
||||
# 2. SYSTEMC_ROOT (environment) variable
|
||||
# 3. SYSTEMC (environment) variable
|
||||
# 4. Use CMake module provided by SystemC installation
|
||||
# (eventually requires CMAKE_PREFIX_PATH set)
|
||||
|
||||
# Find SystemC using include and library paths
|
||||
find_library(SYSTEMC_LIBRARY NAMES systemc
|
||||
HINTS "${SYSTEMC_LIBDIR}" ENV SYSTEMC_LIBDIR)
|
||||
find_library(SYSTEMC_LIBRARY NAMES systemc
|
||||
HINTS "${SYSTEMC_ROOT}" ENV SYSTEMC_ROOT
|
||||
PATH_SUFFIXES lib)
|
||||
find_library(SYSTEMC_LIBRARY NAMES systemc
|
||||
HINTS "${SYSTEMC}" ENV SYSTEMC
|
||||
PATH_SUFFIXES lib)
|
||||
# Find SystemC using include and library paths
|
||||
find_library(
|
||||
SYSTEMC_LIBRARY
|
||||
NAMES systemc
|
||||
HINTS "${SYSTEMC_LIBDIR}"
|
||||
ENV SYSTEMC_LIBDIR
|
||||
)
|
||||
find_library(
|
||||
SYSTEMC_LIBRARY
|
||||
NAMES systemc
|
||||
HINTS "${SYSTEMC_ROOT}"
|
||||
ENV SYSTEMC_ROOT
|
||||
PATH_SUFFIXES lib
|
||||
)
|
||||
find_library(
|
||||
SYSTEMC_LIBRARY
|
||||
NAMES systemc
|
||||
HINTS "${SYSTEMC}"
|
||||
ENV SYSTEMC
|
||||
PATH_SUFFIXES lib
|
||||
)
|
||||
|
||||
if (SYSTEMC_INCLUDEDIR AND SYSTEMC_LIBRARY)
|
||||
add_library(Verilator::systemc INTERFACE IMPORTED)
|
||||
set_target_properties(Verilator::systemc
|
||||
PROPERTIES
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${SYSTEMC_INCLUDEDIR}"
|
||||
INTERFACE_LINK_LIBRARIES "${SYSTEMC_LIBRARY}")
|
||||
return()
|
||||
if(SYSTEMC_INCLUDEDIR AND SYSTEMC_LIBRARY)
|
||||
add_library(Verilator::systemc INTERFACE IMPORTED)
|
||||
set_target_properties(
|
||||
Verilator::systemc
|
||||
PROPERTIES
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${SYSTEMC_INCLUDEDIR}"
|
||||
INTERFACE_LINK_LIBRARIES "${SYSTEMC_LIBRARY}"
|
||||
)
|
||||
return()
|
||||
endif()
|
||||
|
||||
find_package(SystemCLanguage QUIET)
|
||||
if(SystemCLanguage_FOUND)
|
||||
add_library(Verilator::systemc INTERFACE IMPORTED)
|
||||
set_target_properties(
|
||||
Verilator::systemc
|
||||
PROPERTIES INTERFACE_LINK_LIBRARIES "SystemC::systemc"
|
||||
)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(
|
||||
"SystemC not found. This can be fixed by doing either of the following steps:"
|
||||
)
|
||||
message(
|
||||
"- set the SYSTEMC_INCLUDE and SYSTEMC_LIBDIR (environment) variables; or"
|
||||
)
|
||||
message("- set SYSTEMC_ROOT (environment) variable; or")
|
||||
message("- set SYSTEMC (environment) variable; or")
|
||||
message(
|
||||
"- use the CMake module of your SystemC installation (may require CMAKE_PREFIX_PATH)"
|
||||
)
|
||||
message(FATAL_ERROR "SystemC not found")
|
||||
endif()
|
||||
|
||||
find_package(SystemCLanguage QUIET)
|
||||
if (SystemCLanguage_FOUND)
|
||||
add_library(Verilator::systemc INTERFACE IMPORTED)
|
||||
set_target_properties(Verilator::systemc
|
||||
PROPERTIES
|
||||
INTERFACE_LINK_LIBRARIES "SystemC::systemc")
|
||||
return()
|
||||
endif()
|
||||
|
||||
message("SystemC not found. This can be fixed by doing either of the following steps:")
|
||||
message("- set the SYSTEMC_INCLUDE and SYSTEMC_LIBDIR (environment) variables; or")
|
||||
message("- set SYSTEMC_ROOT (environment) variable; or")
|
||||
message("- set SYSTEMC (environment) variable; or")
|
||||
message("- use the CMake module of your SystemC installation (may require CMAKE_PREFIX_PATH)")
|
||||
message(FATAL_ERROR "SystemC not found")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(verilator_link_systemc TARGET)
|
||||
_verilator_find_systemc()
|
||||
target_link_libraries("${TARGET}" PUBLIC Verilator::systemc)
|
||||
target_compile_options(${TARGET} PRIVATE $ENV{SYSTEMC_CXX_FLAGS} ${SYSTEMC_CXX_FLAGS})
|
||||
_verilator_find_systemc()
|
||||
target_link_libraries("${TARGET}" PUBLIC Verilator::systemc)
|
||||
target_compile_options(
|
||||
${TARGET}
|
||||
PRIVATE $ENV{SYSTEMC_CXX_FLAGS} ${SYSTEMC_CXX_FLAGS}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
function(verilator_generate_key OUTPUT_VARIABLE)
|
||||
execute_process(COMMAND ${VERILATOR_BIN} --generate-key
|
||||
OUTPUT_VARIABLE KEY_VAL
|
||||
RESULT_VARIABLE KEY_RET)
|
||||
if (KEY_RET)
|
||||
message(FATAL_ERROR "verilator --generate-key failed")
|
||||
endif()
|
||||
string(STRIP ${KEY_VAL} KEY_VAL)
|
||||
set(${OUTPUT_VARIABLE} ${KEY_VAL} PARENT_SCOPE)
|
||||
execute_process(
|
||||
COMMAND ${VERILATOR_BIN} --generate-key
|
||||
OUTPUT_VARIABLE KEY_VAL
|
||||
RESULT_VARIABLE KEY_RET
|
||||
)
|
||||
if(KEY_RET)
|
||||
message(FATAL_ERROR "verilator --generate-key failed")
|
||||
endif()
|
||||
string(STRIP ${KEY_VAL} KEY_VAL)
|
||||
set(${OUTPUT_VARIABLE} ${KEY_VAL} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
Loading…
Reference in New Issue
Block a user