From 5a5f4813ceb5f875d237eb4b0ce6f8e5b2f3f1c2 Mon Sep 17 00:00:00 2001 From: Morten Borup Petersen Date: Sat, 4 Nov 2023 15:03:34 +0100 Subject: [PATCH] Add VSRTL VCD tracing enable setting --- external/VSRTL | 2 +- src/processorhandler.cpp | 17 +++++++++++++++++ src/processors/interface/ripesprocessor.h | 6 ++++++ src/processors/ripesvsrtlprocessor.h | 4 ++++ src/ripessettings.cpp | 2 ++ src/ripessettings.h | 2 ++ src/settingsdialog.cpp | 10 ++++++++++ 7 files changed, 42 insertions(+), 1 deletion(-) diff --git a/external/VSRTL b/external/VSRTL index 8cb60adf6..cbc7cf6d4 160000 --- a/external/VSRTL +++ b/external/VSRTL @@ -1 +1 @@ -Subproject commit 8cb60adf6f197638fe598ba232619c68aa601a38 +Subproject commit cbc7cf6d4795ee0cce4ac43e6383e56ac7d42ff5 diff --git a/src/processorhandler.cpp b/src/processorhandler.cpp index 0caa9e19c..bf15b31b5 100644 --- a/src/processorhandler.cpp +++ b/src/processorhandler.cpp @@ -88,6 +88,23 @@ ProcessorHandler::ProcessorHandler() { m_currentProcessor->setMaxReverseCycles( RipesSettings::value(RIPES_SETTING_REWINDSTACKSIZE).toInt()); + connect(RipesSettings::getObserver(RIPES_SETTING_VCD_TRACE), + &SettingObserver::modified, this, [=](const auto &enabled) { + m_currentProcessor->vcdTrace( + enabled.toBool(), + RipesSettings::value(RIPES_SETTING_VCD_TRACE_FILE).toString()); + }); + + connect(RipesSettings::getObserver(RIPES_SETTING_VCD_TRACE_FILE), + &SettingObserver::modified, this, [=](const auto &file) { + m_currentProcessor->vcdTrace( + RipesSettings::value(RIPES_SETTING_VCD_TRACE).toBool(), + file.toString()); + }); + + // Reset VCD trace status. + RipesSettings::getObserver(RIPES_SETTING_VCD_TRACE_FILE)->trigger(); + // Reset request handling connect(RipesSettings::getObserver(RIPES_GLOBALSIGNAL_REQRESET), &SettingObserver::modified, this, &ProcessorHandler::_reset); diff --git a/src/processors/interface/ripesprocessor.h b/src/processors/interface/ripesprocessor.h index c1aa3fbbc..81a8c032a 100644 --- a/src/processors/interface/ripesprocessor.h +++ b/src/processors/interface/ripesprocessor.h @@ -262,6 +262,12 @@ class RipesProcessor { */ virtual void resetProcessor() = 0; + /* + * @brief vcdTrace + * Enables VCD tracing of the processor model, if supported by the simulator. + */ + virtual void vcdTrace(bool enable, const QString &filename){}; + /** * @brief clock * Clocks the processor. diff --git a/src/processors/ripesvsrtlprocessor.h b/src/processors/ripesvsrtlprocessor.h index b6c07ca55..3274127d1 100644 --- a/src/processors/ripesvsrtlprocessor.h +++ b/src/processors/ripesvsrtlprocessor.h @@ -30,6 +30,10 @@ class RipesVSRTLProcessor : public RipesProcessor, public vsrtl::core::Design { virtual void reverseProcessor() override { reverse(); } + virtual void vcdTrace(bool enable, const QString &filename) override { + vsrtl::core::Design::vcdTrace(enable, filename.toStdString()); + } + long long getInstructionsRetired() const override { return m_instructionsRetired; } diff --git a/src/ripessettings.cpp b/src/ripessettings.cpp index 36ad11830..993a04302 100644 --- a/src/ripessettings.cpp +++ b/src/ripessettings.cpp @@ -35,6 +35,8 @@ const std::map s_defaultSettings = { {RIPES_SETTING_EDITORREGS, true}, {RIPES_SETTING_EDITORCONSOLE, true}, {RIPES_SETTING_EDITORSTAGEHIGHLIGHTING, true}, + {RIPES_SETTING_VCD_TRACE_FILE, "ripes.vcd"}, + {RIPES_SETTING_VCD_TRACE, false}, {RIPES_SETTING_PIPEDIAGRAM_MAXCYCLES, 100}, {RIPES_SETTING_CACHE_MAXCYCLES, 10000}, diff --git a/src/ripessettings.h b/src/ripessettings.h index 70939d3c2..264e89a92 100644 --- a/src/ripessettings.h +++ b/src/ripessettings.h @@ -32,6 +32,8 @@ namespace Ripes { #define RIPES_SETTING_CACHE_MAXPOINTS ("cacheplot_maxpoints") #define RIPES_SETTING_CACHE_PRESETS ("cache_presets") #define RIPES_SETTING_PERIPHERAL_SETTINGS ("peripheral_settings") +#define RIPES_SETTING_VCD_TRACE ("enable_vcd_trace") +#define RIPES_SETTING_VCD_TRACE_FILE ("vcd_trace_file") // This is not really a setting, but instead a method to leverage the static // observer objects that are generated for a setting. Used for other objects to diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index 441e2978b..678f34d5b 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -311,12 +311,22 @@ QWidget *SettingsDialog::createSimulatorPage() { appendToLayout({rewindLabel, rewindSpinbox}, pageLayout, "Maximum cycles that the simulator is able to undo."); + // Setting: RIPES_SETTING_PERIPHERALS_START appendToLayout(createSettingsWidgets( RIPES_SETTING_PERIPHERALS_START, "I/O start address:"), pageLayout, "Start address in the address space where peripherals will be " "allocated from, growing upwards"); + // Setting: RIPES_SETTING_VCD_TRACE + auto [vcdEnableLabel, vcdEnable] = createSettingsWidgets( + RIPES_SETTING_VCD_TRACE, "Enable simulation VCD traces."); + auto [vcdTraceFileLabel, vcdTraceFile] = createSettingsWidgets( + RIPES_SETTING_VCD_TRACE_FILE, "VCD trace file:"); + + appendToLayout({vcdEnableLabel, vcdEnable}, pageLayout); + appendToLayout({vcdTraceFileLabel, vcdTraceFile}, pageLayout); + return pageWidget; }