From fc8e1b5a2e399e71a382ac30505237a987c8d786 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Thu, 10 Apr 2025 07:49:58 -0400 Subject: [PATCH] Fix several cmake issues, including TRACE_VCD --- docs/guide/verilating.rst | 13 +++-- examples/cmake_hello_c/Makefile | 2 + examples/cmake_hello_sc/Makefile | 2 + examples/cmake_protect_lib/Makefile | 2 + examples/cmake_tracing_c/CMakeLists.txt | 2 +- examples/cmake_tracing_c/Makefile | 4 +- examples/cmake_tracing_sc/CMakeLists.txt | 2 +- examples/cmake_tracing_sc/Makefile | 4 +- src/V3EmitCMake.cpp | 9 +-- src/V3EmitMk.cpp | 6 +- src/V3EmitMkJson.cpp | 8 +-- src/V3Options.h | 3 + verilator-config.cmake.in | 74 ++++++++++++------------ 13 files changed, 70 insertions(+), 61 deletions(-) diff --git a/docs/guide/verilating.rst b/docs/guide/verilating.rst index 30b9b003e..058caa52f 100644 --- a/docs/guide/verilating.rst +++ b/docs/guide/verilating.rst @@ -370,10 +370,11 @@ Verilate in CMake .. code-block:: CMake verilate(target SOURCES source ... [TOP_MODULE top] [PREFIX name] - [TRACE] [TRACE_FST] [SYSTEMC] [COVERAGE] + [COVERAGE] [SYSTEMC] + [TRACE_FST] [TRACE_SAIF] [TRACE_VCD] [TRACE_THREADS num] [INCLUDE_DIRS dir ...] [OPT_SLOW ...] [OPT_FAST ...] [OPT_GLOBAL ..] [DIRECTORY dir] [THREADS num] - [TRACE_THREADS num] [VERILATOR_ARGS ...]) + [VERILATOR_ARGS ...]) Lowercase and ... should be replaced with arguments; the uppercase parts delimit the arguments and can be passed in any order or left out entirely @@ -446,10 +447,6 @@ SystemC include directories and link to the SystemC libraries. Optional. Enable a multithreaded model; see :vlopt:`--threads`. -.. describe:: TRACE_THREADS - - Optional. Enable multithreaded FST trace; see :vlopt:`--trace-threads`. - .. describe:: TOP_MODULE Optional. Sets the name of the top module. Defaults to the name of the @@ -469,6 +466,10 @@ SystemC include directories and link to the SystemC libraries. Optional. Enables SAIF tracing if present, equivalent to "VERILATOR_ARGS --trace-saif". +.. describe:: TRACE_THREADS + + Optional. Enable multithreaded FST trace; see :vlopt:`--trace-threads`. + .. describe:: TRACE_VCD Optional. Enables VCD tracing if present, equivalent to "VERILATOR_ARGS diff --git a/examples/cmake_hello_c/Makefile b/examples/cmake_hello_c/Makefile index 940467662..584c55a03 100644 --- a/examples/cmake_hello_c/Makefile +++ b/examples/cmake_hello_c/Makefile @@ -20,9 +20,11 @@ # binary relative to $VERILATOR_ROOT (such as when inside the git sources). ifeq ($(VERILATOR_ROOT),) +VERILATOR = verilator VERILATOR_COVERAGE = verilator_coverage else export VERILATOR_ROOT +VERILATOR = $(VERILATOR_ROOT)/bin/verilator VERILATOR_COVERAGE = $(VERILATOR_ROOT)/bin/verilator_coverage endif ###################################################################### diff --git a/examples/cmake_hello_sc/Makefile b/examples/cmake_hello_sc/Makefile index d5a30694f..7a7e2b64d 100644 --- a/examples/cmake_hello_sc/Makefile +++ b/examples/cmake_hello_sc/Makefile @@ -20,9 +20,11 @@ # binary relative to $VERILATOR_ROOT (such as when inside the git sources). ifeq ($(VERILATOR_ROOT),) +VERILATOR = verilator VERILATOR_COVERAGE = verilator_coverage else export VERILATOR_ROOT +VERILATOR = $(VERILATOR_ROOT)/bin/verilator VERILATOR_COVERAGE = $(VERILATOR_ROOT)/bin/verilator_coverage endif ###################################################################### diff --git a/examples/cmake_protect_lib/Makefile b/examples/cmake_protect_lib/Makefile index 5b9c29738..6bec54bf3 100644 --- a/examples/cmake_protect_lib/Makefile +++ b/examples/cmake_protect_lib/Makefile @@ -20,9 +20,11 @@ # binary relative to $VERILATOR_ROOT (such as when inside the git sources). ifeq ($(VERILATOR_ROOT),) +VERILATOR = verilator VERILATOR_COVERAGE = verilator_coverage else export VERILATOR_ROOT +VERILATOR = $(VERILATOR_ROOT)/bin/verilator VERILATOR_COVERAGE = $(VERILATOR_ROOT)/bin/verilator_coverage endif ###################################################################### diff --git a/examples/cmake_tracing_c/CMakeLists.txt b/examples/cmake_tracing_c/CMakeLists.txt index 312c8d2b9..63c2a9668 100644 --- a/examples/cmake_tracing_c/CMakeLists.txt +++ b/examples/cmake_tracing_c/CMakeLists.txt @@ -36,7 +36,7 @@ add_executable(example ../make_tracing_c/sim_main.cpp) target_compile_features(example PUBLIC cxx_std_14) # Add the Verilated circuit to the target -verilate(example COVERAGE TRACE +verilate(example COVERAGE TRACE_VCD INCLUDE_DIRS "../make_tracing_c" VERILATOR_ARGS -f ../make_tracing_c/input.vc -x-assign fast SOURCES ../make_tracing_c/top.v diff --git a/examples/cmake_tracing_c/Makefile b/examples/cmake_tracing_c/Makefile index a4f052a98..220ec52fb 100644 --- a/examples/cmake_tracing_c/Makefile +++ b/examples/cmake_tracing_c/Makefile @@ -20,9 +20,11 @@ # binary relative to $VERILATOR_ROOT (such as when inside the git sources). ifeq ($(VERILATOR_ROOT),) +VERILATOR = verilator VERILATOR_COVERAGE = verilator_coverage else export VERILATOR_ROOT +VERILATOR = $(VERILATOR_ROOT)/bin/verilator VERILATOR_COVERAGE = $(VERILATOR_ROOT)/bin/verilator_coverage endif ###################################################################### @@ -59,7 +61,7 @@ run: @echo @echo "-- RUN ---------------------" @mkdir -p logs - build/example +trace + build/example +trace_vcd @echo @echo "-- COVERAGE ----------------" diff --git a/examples/cmake_tracing_sc/CMakeLists.txt b/examples/cmake_tracing_sc/CMakeLists.txt index 1ce7870d2..f1b0d203f 100644 --- a/examples/cmake_tracing_sc/CMakeLists.txt +++ b/examples/cmake_tracing_sc/CMakeLists.txt @@ -46,7 +46,7 @@ target_compile_features(example PUBLIC cxx_std_14) set_property(TARGET example PROPERTY CXX_STANDARD ${SystemC_CXX_STANDARD}) # Add the Verilated circuit to the target -verilate(example SYSTEMC COVERAGE TRACE +verilate(example COVERAGE SYSTEMC TRACE_VCD INCLUDE_DIRS "../make_tracing_sc" VERILATOR_ARGS -f ../make_tracing_sc/input.vc -x-assign fast SOURCES ../make_tracing_sc/top.v diff --git a/examples/cmake_tracing_sc/Makefile b/examples/cmake_tracing_sc/Makefile index 07f804d9a..b479eddf8 100644 --- a/examples/cmake_tracing_sc/Makefile +++ b/examples/cmake_tracing_sc/Makefile @@ -20,9 +20,11 @@ # binary relative to $VERILATOR_ROOT (such as when inside the git sources). ifeq ($(VERILATOR_ROOT),) +VERILATOR = verilator VERILATOR_COVERAGE = verilator_coverage else export VERILATOR_ROOT +VERILATOR = $(VERILATOR_ROOT)/bin/verilator VERILATOR_COVERAGE = $(VERILATOR_ROOT)/bin/verilator_coverage endif ###################################################################### @@ -77,7 +79,7 @@ run: @echo @echo "-- RUN ---------------------" @mkdir -p logs - build/example +trace + build/example +trace_vcd @echo @echo "-- COVERAGE ----------------" diff --git a/src/V3EmitCMake.cpp b/src/V3EmitCMake.cpp index c222202e9..a908c7038 100644 --- a/src/V3EmitCMake.cpp +++ b/src/V3EmitCMake.cpp @@ -111,14 +111,11 @@ class CMakeEmitter final { *of << "# Threaded output mode? 1/N threads (from --threads)\n"; cmake_set_raw(*of, name + "_THREADS", cvtToStr(v3Global.opt.threads())); *of << "# FST Tracing output mode? 0/1 (from --trace-fst)\n"; - cmake_set_raw(*of, name + "_TRACE_FST", - (v3Global.opt.trace() && v3Global.opt.traceFormat().fst()) ? "1" : "0"); + cmake_set_raw(*of, name + "_TRACE_FST", (v3Global.opt.traceEnabledFst()) ? "1" : "0"); *of << "# SAIF Tracing output mode? 0/1 (from --trace-saif)\n"; - cmake_set_raw(*of, name + "_TRACE_SAIF", - (v3Global.opt.trace() && v3Global.opt.traceFormat().saif()) ? "1" : "0"); + cmake_set_raw(*of, name + "_TRACE_SAIF", (v3Global.opt.traceEnabledSaif()) ? "1" : "0"); *of << "# VCD Tracing output mode? 0/1 (from --trace-vcd)\n"; - cmake_set_raw(*of, name + "_TRACE_VCD", - (v3Global.opt.trace() && v3Global.opt.traceFormat().vcd()) ? "1" : "0"); + cmake_set_raw(*of, name + "_TRACE_VCD", (v3Global.opt.traceEnabledVcd()) ? "1" : "0"); *of << "\n### Sources...\n"; std::vector classes_fast; diff --git a/src/V3EmitMk.cpp b/src/V3EmitMk.cpp index 7d2a4006a..19427db8b 100644 --- a/src/V3EmitMk.cpp +++ b/src/V3EmitMk.cpp @@ -557,15 +557,15 @@ public: of.puts("\n"); of.puts("# Tracing output mode in FST format? 0/1 (from --trace-fst)\n"); of.puts("VM_TRACE_FST = "); - of.puts(v3Global.opt.trace() && v3Global.opt.traceFormat().fst() ? "1" : "0"); + of.puts(v3Global.opt.traceEnabledFst() ? "1" : "0"); of.puts("\n"); of.puts("# Tracing output mode in SAIF format? 0/1 (from --trace-saif)\n"); of.puts("VM_TRACE_SAIF = "); - of.puts(v3Global.opt.trace() && v3Global.opt.traceFormat().saif() ? "1" : "0"); + of.puts(v3Global.opt.traceEnabledSaif() ? "1" : "0"); of.puts("\n"); of.puts("# Tracing output mode in VCD format? 0/1 (from --trace-vcd)\n"); of.puts("VM_TRACE_VCD = "); - of.puts(v3Global.opt.trace() && v3Global.opt.traceFormat().vcd() ? "1" : "0"); + of.puts(v3Global.opt.traceEnabledVcd() ? "1" : "0"); of.puts("\n"); of.puts("\n### Object file lists...\n"); diff --git a/src/V3EmitMkJson.cpp b/src/V3EmitMkJson.cpp index 9877a510a..91b9dcf9b 100644 --- a/src/V3EmitMkJson.cpp +++ b/src/V3EmitMkJson.cpp @@ -145,9 +145,6 @@ class V3EmitMkJsonEmitter final { const std::unique_ptr of{ V3File::new_ofstream(makeDir + "/" + v3Global.opt.prefix() + ".json")}; - const std::string trace - = v3Global.opt.trace() ? (v3Global.opt.traceFormat().vcd() ? "vcd" : "fst") : "off"; - std::vector classesFast; std::vector classesSlow; std::vector supportFast; @@ -206,7 +203,10 @@ class V3EmitMkJsonEmitter final { .put("coverage", v3Global.opt.coverage()) .put("use_timing", v3Global.usesTiming()) .put("threads", v3Global.opt.threads()) - .put("trace", trace) + .put("trace", v3Global.opt.trace()) + .put("trace_fst", v3Global.opt.traceEnabledFst()) + .put("trace_saif", v3Global.opt.traceEnabledSaif()) + .put("trace_vcd", v3Global.opt.traceEnabledVcd()) .end() .begin("sources") .putList("global", global) diff --git a/src/V3Options.h b/src/V3Options.h index 018099a25..75612db10 100644 --- a/src/V3Options.h +++ b/src/V3Options.h @@ -609,6 +609,9 @@ public: VTimescale timeComputeUnit(const VTimescale& flag) const; int traceDepth() const { return m_traceDepth; } TraceFormat traceFormat() const { return m_traceFormat; } + bool traceEnabledFst() const { return trace() && traceFormat().fst(); } + bool traceEnabledSaif() const { return trace() && traceFormat().saif(); } + bool traceEnabledVcd() const { return trace() && traceFormat().vcd(); } int traceMaxArray() const { return m_traceMaxArray; } int traceMaxWidth() const { return m_traceMaxWidth; } int traceThreads() const { return m_traceThreads; } diff --git a/verilator-config.cmake.in b/verilator-config.cmake.in index a1d2d515f..a3204044b 100644 --- a/verilator-config.cmake.in +++ b/verilator-config.cmake.in @@ -128,13 +128,6 @@ define_property( 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_FST @@ -149,6 +142,13 @@ define_property( FULL_DOCS "Verilator SAIF 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_SYSTEMC @@ -185,20 +185,6 @@ function(json_get_int RET JSON SECTION VARIABLE) set(${RET} ${JV} PARENT_SCOPE) endfunction() -function(json_get_trace RET_VCD RET_FST JSON SECTION VARIABLE) - string(JSON JV GET "${JSON}" ${SECTION} ${VARIABLE}) - if(JV STREQUAL "vcd") - set(${RET_VCD} 1 PARENT_SCOPE) - set(${RET_FST} 0 PARENT_SCOPE) - elseif(JV STREQUAL "fst") - set(${RET_VCD} 0 PARENT_SCOPE) - set(${RET_FST} 1 PARENT_SCOPE) - else() - set(${RET_VCD} 0 PARENT_SCOPE) - set(${RET_FST} 0 PARENT_SCOPE) - endif() -endfunction() - function(json_get_submodules SUBMODULES NSUBMODULES JSON) string(JSON JV ERROR_VARIABLE STATUS GET "${JSON}" submodules) @@ -241,7 +227,7 @@ endfunction() function(verilate TARGET) cmake_parse_arguments( VERILATE - "COVERAGE;TRACE;TRACE_FST;SYSTEMC;TRACE_STRUCTS" + "COVERAGE;SYSTEMC;TRACE_FST;TRACE_SAIF;TRACE_VCD;TRACE_STRUCTS" "PREFIX;TOP_MODULE;THREADS;TRACE_THREADS;DIRECTORY" "SOURCES;VERILATOR_ARGS;INCLUDE_DIRS;OPT_SLOW;OPT_FAST;OPT_GLOBAL" ${ARGN} @@ -276,10 +262,24 @@ function(verilate TARGET) list(APPEND VERILATOR_ARGS --coverage) endif() + if(VERILATE_SYSTEMC) + list(APPEND VERILATOR_ARGS --sc) + else() + list(APPEND VERILATOR_ARGS --cc) + endif() + if(VERILATE_TRACE AND VERILATE_TRACE_FST) message(FATAL_ERROR "Cannot have both TRACE and TRACE_FST") endif() + if(VERILATE_TRACE_FST AND VERILATE_TRACE_VCD) + message(FATAL_ERROR "Cannot have both TRACE_FST and TRACE_VCD") + endif() + + if(VERILATE_TRACE_SAIF AND VERILATE_TRACE_VCD) + message(FATAL_ERROR "Cannot have both TRACE_SAIF and TRACE_VCD") + endif() + if(VERILATE_TRACE) list(APPEND VERILATOR_ARGS --trace-vcd) endif() @@ -296,12 +296,6 @@ function(verilate TARGET) list(APPEND VERILATOR_ARGS --trace-vcd) 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() @@ -430,7 +424,9 @@ function(verilate TARGET) json_get_bool(JOPTIONS_COVERAGE "${MANIFEST}" options coverage) json_get_bool(JOPTIONS_USE_TIMING "${MANIFEST}" options use_timing) json_get_int(JOPTIONS_THREADS "${MANIFEST}" options threads) - json_get_trace(JOPTIONS_TRACE_VCD JOPTIONS_TRACE_FST "${MANIFEST}" options trace) + json_get_bool(JOPTIONS_TRACE_FST "${MANIFEST}" options trace_fst) + json_get_bool(JOPTIONS_TRACE_SAIF "${MANIFEST}" options trace_saif) + json_get_bool(JOPTIONS_TRACE_VCD "${MANIFEST}" options trace_vcd) json_get_list(JSOURCES_GLOBAL "${MANIFEST}" sources global) json_get_list(JSOURCES_CLASSES_SLOW "${MANIFEST}" sources classes_slow) @@ -465,10 +461,12 @@ function(verilate TARGET) "set(${VERILATE_PREFIX}_TIMING ${JOPTIONS_USE_TIMING})\n" "# Threaded output mode? 1/N threads (from --threads)\n" "set(${VERILATE_PREFIX}_THREADS ${JOPTIONS_THREADS})\n" - "# VCD Tracing output mode? 0/1 (from --trace)\n" - "set(${VERILATE_PREFIX}_TRACE_VCD ${JOPTIONS_TRACE_VCD})\n" "# FST Tracing output mode? 0/1 (from --trace-fst)\n" "set(${VERILATE_PREFIX}_TRACE_FST ${JOPTIONS_TRACE_FST})\n\n" + "# SAIF Tracing output mode? 0/1 (from --trace-saif)\n" + "set(${VERILATE_PREFIX}_TRACE_SAIF ${JOPTIONS_TRACE_SAIF})\n\n" + "# VCD Tracing output mode? 0/1 (from --trace-vcd)\n" + "set(${VERILATE_PREFIX}_TRACE_VCD ${JOPTIONS_TRACE_VCD})\n" "### Sources...\n" "# Global classes, need linked once per executable\n" "set(${VERILATE_PREFIX}_GLOBAL ${JSOURCES_GLOBAL})\n" @@ -576,10 +574,9 @@ function(verilate TARGET) 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) + 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_FST) @@ -594,9 +591,10 @@ function(verilate TARGET) set_property(TARGET ${TARGET} PROPERTY VERILATOR_TRACE_SAIF 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) + if(${VERILATE_PREFIX}_TRACE_VCD) + # If any verilate() call specifies TRACE, define VM_TRACE_VCD 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_STRUCTS)