diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..65300b8
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,97 @@
+---
+Language: Cpp
+# BasedOnStyle: LLVM
+# should be in line with IndentWidth
+AccessModifierOffset: -4
+AlignAfterOpenBracket: Align
+AlignConsecutiveAssignments: false
+AlignConsecutiveDeclarations: false
+AlignEscapedNewlinesLeft: false
+AlignOperands: true
+AlignTrailingComments: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortBlocksOnASingleLine: false
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: All
+AllowShortIfStatementsOnASingleLine: true
+AllowShortLoopsOnASingleLine: true
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: false
+AlwaysBreakTemplateDeclarations: false
+BinPackArguments: true
+BinPackParameters: true
+BraceWrapping:
+ AfterClass: false
+ AfterControlStatement: false
+ AfterEnum: false
+ AfterFunction: false
+ AfterNamespace: false
+ AfterObjCDeclaration: false
+ AfterStruct: false
+ AfterUnion: false
+ BeforeCatch: false
+ BeforeElse: false
+ IndentBraces: false
+BreakBeforeBinaryOperators: None
+BreakBeforeBraces: Attach
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializersBeforeComma: false
+BreakAfterJavaFieldAnnotations: false
+BreakStringLiterals: true
+ColumnLimit: 120
+CommentPragmas: '^ IWYU pragma:'
+ConstructorInitializerAllOnOneLineOrOnePerLine: false
+ConstructorInitializerIndentWidth: 4
+ContinuationIndentWidth: 4
+Cpp11BracedListStyle: true
+DerivePointerAlignment: false
+DisableFormat: false
+ExperimentalAutoDetectBinPacking: false
+ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
+IncludeCategories:
+ - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
+ Priority: 2
+ - Regex: '^(<|"(gtest|isl|json)/)'
+ Priority: 3
+ - Regex: '.*'
+ Priority: 1
+IncludeIsMainRegex: '$'
+IndentCaseLabels: false
+IndentWidth: 4
+IndentWrappedFunctionNames: false
+JavaScriptQuotes: Leave
+JavaScriptWrapImports: true
+KeepEmptyLinesAtTheStartOfBlocks: true
+MacroBlockBegin: ''
+MacroBlockEnd: ''
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: None
+ObjCBlockIndentWidth: 2
+ObjCSpaceAfterProperty: false
+ObjCSpaceBeforeProtocolList: true
+PenaltyBreakBeforeFirstCallParameter: 19
+PenaltyBreakComment: 300
+PenaltyBreakFirstLessLess: 120
+PenaltyBreakString: 1000
+PenaltyExcessCharacter: 1000000
+PenaltyReturnTypeOnItsOwnLine: 60
+PointerAlignment: Right
+ReflowComments: true
+SortIncludes: true
+SpaceAfterCStyleCast: false
+SpaceAfterTemplateKeyword: true
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeParens: ControlStatements
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles: false
+SpacesInContainerLiterals: true
+SpacesInCStyleCastParentheses: false
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+Standard: Cpp11
+TabWidth: 4
+UseTab: Never
+...
+
diff --git a/.cproject b/.cproject
index 2021fe9..0f174bb 100644
--- a/.cproject
+++ b/.cproject
@@ -516,7 +516,6 @@
make
-
all VERBOSE=1
true
true
@@ -524,7 +523,6 @@
make
-
clean
true
true
@@ -532,12 +530,35 @@
make
-
all
true
true
true
+
+ make
+
+ clangformat
+ true
+ true
+ true
+
+
+ make
+
+ riscv
+ true
+ true
+ true
+
+
+ make
+
+ riscv.sc
+ true
+ true
+ true
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cecbbeb..916d87b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -27,6 +27,9 @@ endif()
FIND_PACKAGE(Threads)
+set(PROJECT_3PARTY_DIRS external sr_report sr_signal)
+include(sc-components/cmake/clang-format.cmake)
+
add_subdirectory(external)
add_subdirectory(dbt-core)
add_subdirectory(sc-components)
diff --git a/dbt-core b/dbt-core
index f23a45a..7902b61 160000
--- a/dbt-core
+++ b/dbt-core
@@ -1 +1 @@
-Subproject commit f23a45ab77d25ac42fd8df3e3f7206baad122c67
+Subproject commit 7902b61b2cb504defdbb48baf74c7facfa7c249c
diff --git a/riscv.sc/incl/cli_options.h b/riscv.sc/incl/cli_options.h
index 413d572..10090e3 100644
--- a/riscv.sc/incl/cli_options.h
+++ b/riscv.sc/incl/cli_options.h
@@ -1,21 +1,21 @@
/*******************************************************************************
* Copyright (C) 2017, MINRES Technologies GmbH
* All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
- *
+ *
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
- *
+ *
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
- *
+ *
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -27,7 +27,7 @@
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
- *
+ *
* Contributors:
* eyck@minres.com - initial API and implementation
******************************************************************************/
@@ -35,137 +35,139 @@
#ifndef _CLI_OPTIONS_H_
#define _CLI_OPTIONS_H_
#include
-#include
-#include
#include
+#include
+#include
namespace {
const size_t ERROR_IN_COMMAND_LINE = 1;
const size_t SUCCESS = 0;
const size_t ERROR_UNHANDLED_EXCEPTION = 2;
-
-inline void enable_log_level(int level){
- switch(level){
- case 0:
- logging::Logger::reporting_level()= logging::FATAL;
- /* no break */
- case 1:
- logging::Logger::reporting_level()= logging::ERROR;
- /* no break */
- case 2:
- logging::Logger::reporting_level()= logging::WARNING;
- /* no break */
- case 3:
- logging::Logger::reporting_level()= logging::INFO;
- /* no break */
- case 4:
- logging::Logger::reporting_level()= logging::DEBUG;
- /* no break */
- case 5:
- logging::Logger::reporting_level()= logging::TRACE;
- /* no break */
- }
+inline void enable_log_level(int level) {
+ switch (level) {
+ case 0:
+ logging::Logger::reporting_level() = logging::FATAL;
+ /* no break */
+ case 1:
+ logging::Logger::reporting_level() = logging::ERROR;
+ /* no break */
+ case 2:
+ logging::Logger::reporting_level() = logging::WARNING;
+ /* no break */
+ case 3:
+ logging::Logger::reporting_level() = logging::INFO;
+ /* no break */
+ case 4:
+ logging::Logger::reporting_level() = logging::DEBUG;
+ /* no break */
+ case 5:
+ logging::Logger::reporting_level() = logging::TRACE;
+ /* no break */
+ }
}
-inline void configure_default_logger(boost::program_options::variables_map& vm){
-// el::Configurations defaultConf;
-// defaultConf.setToDefault();
-// defaultConf.set(el::Level::Error, el::ConfigurationType::Format, "%datetime{%H:%m:%s.%g} %level %msg");
-// defaultConf.set(el::Level::Warning, el::ConfigurationType::Format, "%datetime{%H:%m:%s.%g} %level %msg");
-// defaultConf.set(el::Level::Info, el::ConfigurationType::Format, "%datetime{%H:%m:%s.%g} %level %msg");
-// defaultConf.set(el::Level::Debug, el::ConfigurationType::Format, "%datetime{%H:%m:%s.%g} %level %msg");
-// defaultConf.set(el::Level::Trace, el::ConfigurationType::Format, "%datetime{%H:%m:%s.%g} %level %msg");
- if(vm.count("verbose"))
- enable_log_level(vm["verbose"].as());
- if(vm.count("log-file"))
- logging::Output2FILE::stream() = fopen(vm["log-file"].as().c_str(), "w");
- // default logger uses default configurations
-// el::Loggers::reconfigureLogger("default", defaultConf);
+inline void configure_default_logger(boost::program_options::variables_map &vm) {
+ // el::Configurations defaultConf;
+ // defaultConf.setToDefault();
+ // defaultConf.set(el::Level::Error, el::ConfigurationType::Format,
+ //"%datetime{%H:%m:%s.%g} %level %msg");
+ // defaultConf.set(el::Level::Warning, el::ConfigurationType::Format,
+ //"%datetime{%H:%m:%s.%g} %level %msg");
+ // defaultConf.set(el::Level::Info, el::ConfigurationType::Format,
+ //"%datetime{%H:%m:%s.%g} %level %msg");
+ // defaultConf.set(el::Level::Debug, el::ConfigurationType::Format,
+ //"%datetime{%H:%m:%s.%g} %level %msg");
+ // defaultConf.set(el::Level::Trace, el::ConfigurationType::Format,
+ //"%datetime{%H:%m:%s.%g} %level %msg");
+ if (vm.count("verbose")) enable_log_level(vm["verbose"].as());
+ if (vm.count("log-file")) logging::Output2FILE::stream() = fopen(vm["log-file"].as().c_str(), "w");
+ // default logger uses default configurations
+ // el::Loggers::reconfigureLogger("default", defaultConf);
}
inline void configure_debugger_logger() {
- // configure the connection logger
-// el::Logger* gdbServerLogger = el::Loggers::getLogger(connection);
-// el::Configurations gdbServerConf;
-// gdbServerConf.setToDefault();
-// gdbServerConf.set(el::Level::Error, el::ConfigurationType::Format,
-// "%datetime{%H:%m:%s.%g} %level [%logger] %msg");
-// gdbServerConf.set(el::Level::Warning, el::ConfigurationType::Format,
-// "%datetime{%H:%m:%s.%g} %level [%logger] %msg");
-// gdbServerConf.set(el::Level::Info, el::ConfigurationType::Format,
-// "%datetime{%H:%m:%s.%g} %level [%logger] %msg");
-// gdbServerConf.set(el::Level::Debug, el::ConfigurationType::Format,
-// "%datetime{%H:%m:%s.%g} %level [%logger] %msg");
-// gdbServerConf.set(el::Level::Trace, el::ConfigurationType::Format,
-// "%datetime{%H:%m:%s.%g} %level [%logger] %msg");
-// enable_log_level(gdbServerConf, 5);
-// gdbServerLogger->configure(gdbServerConf);
+ // configure the connection logger
+ // el::Logger* gdbServerLogger = el::Loggers::getLogger(connection);
+ // el::Configurations gdbServerConf;
+ // gdbServerConf.setToDefault();
+ // gdbServerConf.set(el::Level::Error, el::ConfigurationType::Format,
+ // "%datetime{%H:%m:%s.%g} %level [%logger] %msg");
+ // gdbServerConf.set(el::Level::Warning, el::ConfigurationType::Format,
+ // "%datetime{%H:%m:%s.%g} %level [%logger] %msg");
+ // gdbServerConf.set(el::Level::Info, el::ConfigurationType::Format,
+ // "%datetime{%H:%m:%s.%g} %level [%logger] %msg");
+ // gdbServerConf.set(el::Level::Debug, el::ConfigurationType::Format,
+ // "%datetime{%H:%m:%s.%g} %level [%logger] %msg");
+ // gdbServerConf.set(el::Level::Trace, el::ConfigurationType::Format,
+ // "%datetime{%H:%m:%s.%g} %level [%logger] %msg");
+ // enable_log_level(gdbServerConf, 5);
+ // gdbServerLogger->configure(gdbServerConf);
}
-inline void configure_disass_logger(boost::program_options::variables_map& vm) {
-// el::Logger* disassLogger = el::Loggers::getLogger(disass);
-// el::Configurations disassConf;
-// if(vm.count(disass)){
-// auto file_name=vm[disass].as();
-// disassConf.setToDefault();
-// if (file_name.length() > 0) {
-// disassConf.set(el::Level::Global, el::ConfigurationType::ToFile,
-// std::string("true"));
-// disassConf.set(el::Level::Global,
-// el::ConfigurationType::ToStandardOutput, std::string("false"));
-// disassConf.set(el::Level::Global, el::ConfigurationType::Format,
-// std::string("%msg"));
-// disassConf.set(el::Level::Global, el::ConfigurationType::Filename,
-// file_name);
-// std::ofstream str(file_name); // just to clear the file
-// } else {
-// disassConf.set(el::Level::Global, el::ConfigurationType::Format,
-// "%datetime{%H:%m:%s.%g} [%logger] %msg");
-// }
-// } else {
-// enable_log_level(disassConf, 0);
-// }
-// disassLogger->configure(disassConf);
+inline void configure_disass_logger(boost::program_options::variables_map &vm) {
+ // el::Logger* disassLogger = el::Loggers::getLogger(disass);
+ // el::Configurations disassConf;
+ // if(vm.count(disass)){
+ // auto file_name=vm[disass].as();
+ // disassConf.setToDefault();
+ // if (file_name.length() > 0) {
+ // disassConf.set(el::Level::Global, el::ConfigurationType::ToFile,
+ // std::string("true"));
+ // disassConf.set(el::Level::Global,
+ // el::ConfigurationType::ToStandardOutput,
+ // std::string("false"));
+ // disassConf.set(el::Level::Global, el::ConfigurationType::Format,
+ // std::string("%msg"));
+ // disassConf.set(el::Level::Global,
+ // el::ConfigurationType::Filename,
+ // file_name);
+ // std::ofstream str(file_name); // just to clear the file
+ // } else {
+ // disassConf.set(el::Level::Global, el::ConfigurationType::Format,
+ // "%datetime{%H:%m:%s.%g} [%logger] %msg");
+ // }
+ // } else {
+ // enable_log_level(disassConf, 0);
+ // }
+ // disassLogger->configure(disassConf);
}
} // namespace
-inline int parse_cli_options(boost::program_options::variables_map& vm, int argc, char *argv[]){
+inline int parse_cli_options(boost::program_options::variables_map &vm, int argc, char *argv[]) {
namespace po = boost::program_options;
po::options_description desc("Options");
- desc.add_options()
- ("help,h", "Print help message")
- ("verbose,v", po::value()->implicit_value(0), "Sets logging verbosity")
- ("vmodule", po::value(),"Defines the module(s) to be logged")
- ("logging-flags", po::value(),"Sets logging flag(s).")
- ("log-file", po::value(),"Sets default log file.")
- ("disass,d", po::value()->implicit_value(""),"Enables disassembly")
- ("elf,l", po::value< std::vector >(), "ELF file(s) to load")
- ("gdb-port,g", po::value(), "enable gdb server and specify port to use")
- ("input,i", po::value(), "the elf file to load (instead of hex files)")
- ("dump-ir", "dump the intermediate representation")
- ("cycles,c", po::value()->default_value(-1), "number of cycles to run")
- ("systemc,s", "Run as SystemC simulation")
- ("time", po::value(), "SystemC siimulation time in ms")
- ("reset,r", po::value(), "reset address")
- ("trace", po::value(), "enable tracing, or cmbintation of 1=signals and 2=TX text, 4=TX compressed text, 6=TX in SQLite")\
- ("mem,m", po::value(), "the memory input file")
- ("rv64", "run RV64");
+ desc.add_options()("help,h", "Print help message")("verbose,v", po::value()->implicit_value(0),
+ "Sets logging verbosity")("vmodule", po::value(),
+ "Defines the module(s) to be logged")(
+ "logging-flags", po::value(), "Sets logging flag(s).")("log-file", po::value(),
+ "Sets default log file.")(
+ "disass,d", po::value()->implicit_value(""),
+ "Enables disassembly")("elf,l", po::value>(), "ELF file(s) to load")(
+ "gdb-port,g", po::value(), "enable gdb server and specify port to use")(
+ "input,i", po::value(), "the elf file to load (instead of hex files)")(
+ "dump-ir", "dump the intermediate representation")("cycles,c", po::value()->default_value(-1),
+ "number of cycles to run")(
+ "systemc,s", "Run as SystemC simulation")("time", po::value(), "SystemC siimulation time in ms")(
+ "reset,r", po::value(), "reset address")(
+ "trace", po::value(), "enable tracing, or cmbintation of 1=signals and 2=TX text, 4=TX "
+ "compressed text, 6=TX in SQLite")("mem,m", po::value(),
+ "the memory input file")("rv64", "run RV64");
try {
po::store(po::parse_command_line(argc, argv, desc), vm); // can throw
// --help option
- if ( vm.count("help") ){
+ if (vm.count("help")) {
std::cout << "DBT-RISE-RiscV" << std::endl << desc << std::endl;
return SUCCESS;
}
po::notify(vm); // throws on error, so do after help in case
- } catch(po::error& e){
- // there are problems
- std::cerr << "ERROR: " << e.what() << std::endl << std::endl;
+ } catch (po::error &e) {
+ // there are problems
+ std::cerr << "ERROR: " << e.what() << std::endl << std::endl;
std::cerr << desc << std::endl;
return ERROR_IN_COMMAND_LINE;
}
- return SUCCESS;
+ return SUCCESS;
}
#endif /* _CLI_OPTIONS_H_ */
diff --git a/riscv.sc/incl/sysc/SiFive/core_complex.h b/riscv.sc/incl/sysc/SiFive/core_complex.h
index 8e6ef28..3d47de5 100644
--- a/riscv.sc/incl/sysc/SiFive/core_complex.h
+++ b/riscv.sc/incl/sysc/SiFive/core_complex.h
@@ -1,4 +1,4 @@
- ////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2017, MINRES Technologies GmbH
// All rights reserved.
//
@@ -37,25 +37,21 @@
#ifndef _SYSC_SIFIVE_FE310_H_
#define _SYSC_SIFIVE_FE310_H_
-#include
#include
-#include
+#include
#include
+#include
namespace sysc {
namespace SiFive {
-class core_complex:
- public iss::arch::riscv_hart_msu_vp,
- public sc_core::sc_module {
+class core_complex : public iss::arch::riscv_hart_msu_vp, public sc_core::sc_module {
public:
-
tlm::tlm_initiator_socket<32> initiator;
sc_core::sc_in rst_i;
core_complex(sc_core::sc_module_name name);
virtual ~core_complex();
-
};
} /* namespace SiFive */
diff --git a/riscv.sc/incl/sysc/SiFive/gen/e300_plat_t.h b/riscv.sc/incl/sysc/SiFive/gen/e300_plat_t.h
index cfb8984..402a1c3 100644
--- a/riscv.sc/incl/sysc/SiFive/gen/e300_plat_t.h
+++ b/riscv.sc/incl/sysc/SiFive/gen/e300_plat_t.h
@@ -1,6 +1,7 @@
#ifndef _E300_PLAT_MAP_H_
#define _E300_PLAT_MAP_H_
-// need double braces, see https://stackoverflow.com/questions/6893700/how-to-construct-stdarray-object-with-initializer-list#6894191
+// need double braces, see
+// https://stackoverflow.com/questions/6893700/how-to-construct-stdarray-object-with-initializer-list#6894191
const std::array, 4> e300_plat_map = {{
{&i_plic, 0xc000000, 0x1000},
{&i_gpio, 0x10012000, 0x1000},
diff --git a/riscv.sc/incl/sysc/SiFive/gen/gpio_regs.h b/riscv.sc/incl/sysc/SiFive/gen/gpio_regs.h
index 5e39a83..b036908 100644
--- a/riscv.sc/incl/sysc/SiFive/gen/gpio_regs.h
+++ b/riscv.sc/incl/sysc/SiFive/gen/gpio_regs.h
@@ -36,53 +36,50 @@
#ifndef _GPIO_REGS_H_
#define _GPIO_REGS_H_
-#include
-#include
#include
#include
+#include
+#include
namespace sysc {
-class gpio_regs :
- public sc_core::sc_module,
- public sysc::resetable
-{
+class gpio_regs : public sc_core::sc_module, public sysc::resetable {
protected:
// storage declarations
uint32_t r_value;
-
+
uint32_t r_input_en;
-
+
uint32_t r_output_en;
-
+
uint32_t r_port;
-
+
uint32_t r_pue;
-
+
uint32_t r_ds;
-
+
uint32_t r_rise_ie;
-
+
uint32_t r_rise_ip;
-
+
uint32_t r_fall_ie;
-
+
uint32_t r_fall_ip;
-
+
uint32_t r_high_ie;
-
+
uint32_t r_high_ip;
-
+
uint32_t r_low_ie;
-
+
uint32_t r_low_ip;
-
+
uint32_t r_iof_en;
-
+
uint32_t r_iof_sel;
-
+
uint32_t r_out_xor;
-
+
// register declarations
sysc::sc_register value;
sysc::sc_register input_en;
@@ -101,12 +98,11 @@ protected:
sysc::sc_register iof_en;
sysc::sc_register iof_sel;
sysc::sc_register out_xor;
-
+
public:
gpio_regs(sc_core::sc_module_name nm);
- template
- void registerResources(sysc::tlm_target& target);
+ template void registerResources(sysc::tlm_target &target);
};
}
//////////////////////////////////////////////////////////////////////////////
@@ -114,29 +110,14 @@ public:
//////////////////////////////////////////////////////////////////////////////
inline sysc::gpio_regs::gpio_regs(sc_core::sc_module_name nm)
-: sc_core::sc_module(nm)
-, NAMED(value, r_value, 0, *this)
-, NAMED(input_en, r_input_en, 0, *this)
-, NAMED(output_en, r_output_en, 0, *this)
-, NAMED(port, r_port, 0, *this)
-, NAMED(pue, r_pue, 0, *this)
-, NAMED(ds, r_ds, 0, *this)
-, NAMED(rise_ie, r_rise_ie, 0, *this)
-, NAMED(rise_ip, r_rise_ip, 0, *this)
-, NAMED(fall_ie, r_fall_ie, 0, *this)
-, NAMED(fall_ip, r_fall_ip, 0, *this)
-, NAMED(high_ie, r_high_ie, 0, *this)
-, NAMED(high_ip, r_high_ip, 0, *this)
-, NAMED(low_ie, r_low_ie, 0, *this)
-, NAMED(low_ip, r_low_ip, 0, *this)
-, NAMED(iof_en, r_iof_en, 0, *this)
-, NAMED(iof_sel, r_iof_sel, 0, *this)
-, NAMED(out_xor, r_out_xor, 0, *this)
-{
-}
+ : sc_core::sc_module(nm), NAMED(value, r_value, 0, *this), NAMED(input_en, r_input_en, 0, *this),
+ NAMED(output_en, r_output_en, 0, *this), NAMED(port, r_port, 0, *this), NAMED(pue, r_pue, 0, *this),
+ NAMED(ds, r_ds, 0, *this), NAMED(rise_ie, r_rise_ie, 0, *this), NAMED(rise_ip, r_rise_ip, 0, *this),
+ NAMED(fall_ie, r_fall_ie, 0, *this), NAMED(fall_ip, r_fall_ip, 0, *this), NAMED(high_ie, r_high_ie, 0, *this),
+ NAMED(high_ip, r_high_ip, 0, *this), NAMED(low_ie, r_low_ie, 0, *this), NAMED(low_ip, r_low_ip, 0, *this),
+ NAMED(iof_en, r_iof_en, 0, *this), NAMED(iof_sel, r_iof_sel, 0, *this), NAMED(out_xor, r_out_xor, 0, *this) {}
-template
-inline void sysc::gpio_regs::registerResources(sysc::tlm_target& target) {
+template inline void sysc::gpio_regs::registerResources(sysc::tlm_target &target) {
target.addResource(value, 0x0UL);
target.addResource(input_en, 0x4UL);
target.addResource(output_en, 0x8UL);
diff --git a/riscv.sc/incl/sysc/SiFive/gen/plic_regs.h b/riscv.sc/incl/sysc/SiFive/gen/plic_regs.h
index 936873c..c61d503 100644
--- a/riscv.sc/incl/sysc/SiFive/gen/plic_regs.h
+++ b/riscv.sc/incl/sysc/SiFive/gen/plic_regs.h
@@ -36,46 +36,42 @@
#ifndef _PLIC_REGS_H_
#define _PLIC_REGS_H_
-#include
-#include
#include
#include
+#include
+#include
namespace sysc {
-class plic_regs :
- public sc_core::sc_module,
- public sysc::resetable
-{
+class plic_regs : public sc_core::sc_module, public sysc::resetable {
protected:
// storage declarations
BEGIN_BF_DECL(priority_t, uint32_t);
- BF_FIELD(priority, 0, 3);
- END_BF_DECL() ;
+ BF_FIELD(priority, 0, 3);
+ END_BF_DECL();
std::array r_priority;
-
+
uint32_t r_pending;
-
+
uint32_t r_enabled;
-
+
BEGIN_BF_DECL(threshold_t, uint32_t);
- BF_FIELD(threshold, 0, 3);
+ BF_FIELD(threshold, 0, 3);
END_BF_DECL() r_threshold;
-
+
uint32_t r_claim_complete;
-
+
// register declarations
sysc::sc_register_indexed priority;
sysc::sc_register pending;
sysc::sc_register enabled;
sysc::sc_register threshold;
sysc::sc_register claim_complete;
-
+
public:
plic_regs(sc_core::sc_module_name nm);
- template
- void registerResources(sysc::tlm_target& target);
+ template void registerResources(sysc::tlm_target &target);
};
}
//////////////////////////////////////////////////////////////////////////////
@@ -83,17 +79,11 @@ public:
//////////////////////////////////////////////////////////////////////////////
inline sysc::plic_regs::plic_regs(sc_core::sc_module_name nm)
-: sc_core::sc_module(nm)
-, NAMED(priority, r_priority, 0, *this)
-, NAMED(pending, r_pending, 0, *this)
-, NAMED(enabled, r_enabled, 0, *this)
-, NAMED(threshold, r_threshold, 0, *this)
-, NAMED(claim_complete, r_claim_complete, 0, *this)
-{
-}
+ : sc_core::sc_module(nm), NAMED(priority, r_priority, 0, *this), NAMED(pending, r_pending, 0, *this),
+ NAMED(enabled, r_enabled, 0, *this), NAMED(threshold, r_threshold, 0, *this),
+ NAMED(claim_complete, r_claim_complete, 0, *this) {}
-template
-inline void sysc::plic_regs::registerResources(sysc::tlm_target& target) {
+template inline void sysc::plic_regs::registerResources(sysc::tlm_target &target) {
target.addResource(priority, 0x4UL);
target.addResource(pending, 0x1000UL);
target.addResource(enabled, 0x2000UL);
diff --git a/riscv.sc/incl/sysc/SiFive/gen/spi_regs.h b/riscv.sc/incl/sysc/SiFive/gen/spi_regs.h
index 4eb38ef..945fe78 100644
--- a/riscv.sc/incl/sysc/SiFive/gen/spi_regs.h
+++ b/riscv.sc/incl/sysc/SiFive/gen/spi_regs.h
@@ -36,96 +36,93 @@
#ifndef _SPI_REGS_H_
#define _SPI_REGS_H_
-#include
-#include
#include
#include
+#include
+#include
namespace sysc {
-class spi_regs :
- public sc_core::sc_module,
- public sysc::resetable
-{
+class spi_regs : public sc_core::sc_module, public sysc::resetable {
protected:
// storage declarations
BEGIN_BF_DECL(sckdiv_t, uint32_t);
- BF_FIELD(div, 0, 12);
+ BF_FIELD(div, 0, 12);
END_BF_DECL() r_sckdiv;
-
+
BEGIN_BF_DECL(sckmode_t, uint32_t);
- BF_FIELD(pha, 0, 1);
- BF_FIELD(pol, 1, 1);
+ BF_FIELD(pha, 0, 1);
+ BF_FIELD(pol, 1, 1);
END_BF_DECL() r_sckmode;
-
+
uint32_t r_csid;
-
+
uint32_t r_csdef;
-
+
BEGIN_BF_DECL(csmode_t, uint32_t);
- BF_FIELD(mode, 0, 2);
+ BF_FIELD(mode, 0, 2);
END_BF_DECL() r_csmode;
-
+
BEGIN_BF_DECL(delay0_t, uint32_t);
- BF_FIELD(cssck, 0, 8);
- BF_FIELD(sckcs, 16, 8);
+ BF_FIELD(cssck, 0, 8);
+ BF_FIELD(sckcs, 16, 8);
END_BF_DECL() r_delay0;
-
+
BEGIN_BF_DECL(delay1_t, uint32_t);
- BF_FIELD(intercs, 0, 16);
- BF_FIELD(interxfr, 16, 8);
+ BF_FIELD(intercs, 0, 16);
+ BF_FIELD(interxfr, 16, 8);
END_BF_DECL() r_delay1;
-
+
BEGIN_BF_DECL(fmt_t, uint32_t);
- BF_FIELD(proto, 0, 2);
- BF_FIELD(endian, 2, 1);
- BF_FIELD(dir, 3, 1);
- BF_FIELD(len, 16, 4);
+ BF_FIELD(proto, 0, 2);
+ BF_FIELD(endian, 2, 1);
+ BF_FIELD(dir, 3, 1);
+ BF_FIELD(len, 16, 4);
END_BF_DECL() r_fmt;
-
+
BEGIN_BF_DECL(txdata_t, uint32_t);
- BF_FIELD(data, 0, 8);
- BF_FIELD(full, 31, 1);
+ BF_FIELD(data, 0, 8);
+ BF_FIELD(full, 31, 1);
END_BF_DECL() r_txdata;
-
+
BEGIN_BF_DECL(rxdata_t, uint32_t);
- BF_FIELD(data, 0, 8);
- BF_FIELD(empty, 31, 1);
+ BF_FIELD(data, 0, 8);
+ BF_FIELD(empty, 31, 1);
END_BF_DECL() r_rxdata;
-
+
BEGIN_BF_DECL(txmark_t, uint32_t);
- BF_FIELD(txmark, 0, 3);
+ BF_FIELD(txmark, 0, 3);
END_BF_DECL() r_txmark;
-
+
BEGIN_BF_DECL(rxmark_t, uint32_t);
- BF_FIELD(rxmark, 0, 3);
+ BF_FIELD(rxmark, 0, 3);
END_BF_DECL() r_rxmark;
-
+
BEGIN_BF_DECL(fctrl_t, uint32_t);
- BF_FIELD(en, 0, 1);
+ BF_FIELD(en, 0, 1);
END_BF_DECL() r_fctrl;
-
+
BEGIN_BF_DECL(ffmt_t, uint32_t);
- BF_FIELD(cmd_en, 0, 1);
- BF_FIELD(addr_len, 1, 2);
- BF_FIELD(pad_cnt, 3, 4);
- BF_FIELD(cmd_proto, 7, 2);
- BF_FIELD(addr_proto, 9, 2);
- BF_FIELD(data_proto, 11, 2);
- BF_FIELD(cmd_code, 16, 8);
- BF_FIELD(pad_code, 24, 8);
+ BF_FIELD(cmd_en, 0, 1);
+ BF_FIELD(addr_len, 1, 2);
+ BF_FIELD(pad_cnt, 3, 4);
+ BF_FIELD(cmd_proto, 7, 2);
+ BF_FIELD(addr_proto, 9, 2);
+ BF_FIELD(data_proto, 11, 2);
+ BF_FIELD(cmd_code, 16, 8);
+ BF_FIELD(pad_code, 24, 8);
END_BF_DECL() r_ffmt;
-
+
BEGIN_BF_DECL(ie_t, uint32_t);
- BF_FIELD(txwm, 0, 1);
- BF_FIELD(rxwm, 1, 1);
+ BF_FIELD(txwm, 0, 1);
+ BF_FIELD(rxwm, 1, 1);
END_BF_DECL() r_ie;
-
+
BEGIN_BF_DECL(ip_t, uint32_t);
- BF_FIELD(txwm, 0, 1);
- BF_FIELD(rxwm, 1, 1);
+ BF_FIELD(txwm, 0, 1);
+ BF_FIELD(rxwm, 1, 1);
END_BF_DECL() r_ip;
-
+
// register declarations
sysc::sc_register sckdiv;
sysc::sc_register sckmode;
@@ -143,12 +140,11 @@ protected:
sysc::sc_register ffmt;
sysc::sc_register ie;
sysc::sc_register ip;
-
+
public:
spi_regs(sc_core::sc_module_name nm);
- template
- void registerResources(sysc::tlm_target& target);
+ template void registerResources(sysc::tlm_target &target);
};
}
//////////////////////////////////////////////////////////////////////////////
@@ -156,28 +152,14 @@ public:
//////////////////////////////////////////////////////////////////////////////
inline sysc::spi_regs::spi_regs(sc_core::sc_module_name nm)
-: sc_core::sc_module(nm)
-, NAMED(sckdiv, r_sckdiv, 0, *this)
-, NAMED(sckmode, r_sckmode, 0, *this)
-, NAMED(csid, r_csid, 0, *this)
-, NAMED(csdef, r_csdef, 0, *this)
-, NAMED(csmode, r_csmode, 0, *this)
-, NAMED(delay0, r_delay0, 0, *this)
-, NAMED(delay1, r_delay1, 0, *this)
-, NAMED(fmt, r_fmt, 0, *this)
-, NAMED(txdata, r_txdata, 0, *this)
-, NAMED(rxdata, r_rxdata, 0, *this)
-, NAMED(txmark, r_txmark, 0, *this)
-, NAMED(rxmark, r_rxmark, 0, *this)
-, NAMED(fctrl, r_fctrl, 0, *this)
-, NAMED(ffmt, r_ffmt, 0, *this)
-, NAMED(ie, r_ie, 0, *this)
-, NAMED(ip, r_ip, 0, *this)
-{
-}
+ : sc_core::sc_module(nm), NAMED(sckdiv, r_sckdiv, 0, *this), NAMED(sckmode, r_sckmode, 0, *this),
+ NAMED(csid, r_csid, 0, *this), NAMED(csdef, r_csdef, 0, *this), NAMED(csmode, r_csmode, 0, *this),
+ NAMED(delay0, r_delay0, 0, *this), NAMED(delay1, r_delay1, 0, *this), NAMED(fmt, r_fmt, 0, *this),
+ NAMED(txdata, r_txdata, 0, *this), NAMED(rxdata, r_rxdata, 0, *this), NAMED(txmark, r_txmark, 0, *this),
+ NAMED(rxmark, r_rxmark, 0, *this), NAMED(fctrl, r_fctrl, 0, *this), NAMED(ffmt, r_ffmt, 0, *this),
+ NAMED(ie, r_ie, 0, *this), NAMED(ip, r_ip, 0, *this) {}
-template
-inline void sysc::spi_regs::registerResources(sysc::tlm_target& target) {
+template inline void sysc::spi_regs::registerResources(sysc::tlm_target &target) {
target.addResource(sckdiv, 0x0UL);
target.addResource(sckmode, 0x4UL);
target.addResource(csid, 0x10UL);
diff --git a/riscv.sc/incl/sysc/SiFive/gen/uart_regs.h b/riscv.sc/incl/sysc/SiFive/gen/uart_regs.h
index 87382b4..9726e1e 100644
--- a/riscv.sc/incl/sysc/SiFive/gen/uart_regs.h
+++ b/riscv.sc/incl/sysc/SiFive/gen/uart_regs.h
@@ -36,56 +36,53 @@
#ifndef _UART_REGS_H_
#define _UART_REGS_H_
-#include
-#include
#include
#include
+#include
+#include
namespace sysc {
-class uart_regs :
- public sc_core::sc_module,
- public sysc::resetable
-{
+class uart_regs : public sc_core::sc_module, public sysc::resetable {
protected:
// storage declarations
BEGIN_BF_DECL(txdata_t, uint32_t);
- BF_FIELD(data, 0, 8);
- BF_FIELD(full, 31, 1);
+ BF_FIELD(data, 0, 8);
+ BF_FIELD(full, 31, 1);
END_BF_DECL() r_txdata;
-
+
BEGIN_BF_DECL(rxdata_t, uint32_t);
- BF_FIELD(data, 0, 8);
- BF_FIELD(empty, 31, 1);
+ BF_FIELD(data, 0, 8);
+ BF_FIELD(empty, 31, 1);
END_BF_DECL() r_rxdata;
-
+
BEGIN_BF_DECL(txctrl_t, uint32_t);
- BF_FIELD(txen, 0, 1);
- BF_FIELD(nstop, 1, 1);
- BF_FIELD(reserved, 2, 14);
- BF_FIELD(txcnt, 16, 3);
+ BF_FIELD(txen, 0, 1);
+ BF_FIELD(nstop, 1, 1);
+ BF_FIELD(reserved, 2, 14);
+ BF_FIELD(txcnt, 16, 3);
END_BF_DECL() r_txctrl;
-
+
BEGIN_BF_DECL(rxctrl_t, uint32_t);
- BF_FIELD(rxen, 0, 1);
- BF_FIELD(reserved, 1, 15);
- BF_FIELD(rxcnt, 16, 3);
+ BF_FIELD(rxen, 0, 1);
+ BF_FIELD(reserved, 1, 15);
+ BF_FIELD(rxcnt, 16, 3);
END_BF_DECL() r_rxctrl;
-
+
BEGIN_BF_DECL(ie_t, uint32_t);
- BF_FIELD(txwm, 0, 1);
- BF_FIELD(rxwm, 1, 1);
+ BF_FIELD(txwm, 0, 1);
+ BF_FIELD(rxwm, 1, 1);
END_BF_DECL() r_ie;
-
+
BEGIN_BF_DECL(ip_t, uint32_t);
- BF_FIELD(txwm, 0, 1);
- BF_FIELD(rxwm, 1, 1);
+ BF_FIELD(txwm, 0, 1);
+ BF_FIELD(rxwm, 1, 1);
END_BF_DECL() r_ip;
-
+
BEGIN_BF_DECL(div_t, uint32_t);
- BF_FIELD(div, 0, 16);
+ BF_FIELD(div, 0, 16);
END_BF_DECL() r_div;
-
+
// register declarations
sysc::sc_register txdata;
sysc::sc_register rxdata;
@@ -94,12 +91,11 @@ protected:
sysc::sc_register ie;
sysc::sc_register ip;
sysc::sc_register div;
-
+
public:
uart_regs(sc_core::sc_module_name nm);
- template
- void registerResources(sysc::tlm_target& target);
+ template void registerResources(sysc::tlm_target &target);
};
}
//////////////////////////////////////////////////////////////////////////////
@@ -107,19 +103,11 @@ public:
//////////////////////////////////////////////////////////////////////////////
inline sysc::uart_regs::uart_regs(sc_core::sc_module_name nm)
-: sc_core::sc_module(nm)
-, NAMED(txdata, r_txdata, 0, *this)
-, NAMED(rxdata, r_rxdata, 0, *this)
-, NAMED(txctrl, r_txctrl, 0, *this)
-, NAMED(rxctrl, r_rxctrl, 0, *this)
-, NAMED(ie, r_ie, 0, *this)
-, NAMED(ip, r_ip, 0, *this)
-, NAMED(div, r_div, 0, *this)
-{
-}
+ : sc_core::sc_module(nm), NAMED(txdata, r_txdata, 0, *this), NAMED(rxdata, r_rxdata, 0, *this),
+ NAMED(txctrl, r_txctrl, 0, *this), NAMED(rxctrl, r_rxctrl, 0, *this), NAMED(ie, r_ie, 0, *this),
+ NAMED(ip, r_ip, 0, *this), NAMED(div, r_div, 0, *this) {}
-template
-inline void sysc::uart_regs::registerResources(sysc::tlm_target& target) {
+template inline void sysc::uart_regs::registerResources(sysc::tlm_target &target) {
target.addResource(txdata, 0x0UL);
target.addResource(rxdata, 0x4UL);
target.addResource(txctrl, 0x8UL);
diff --git a/riscv.sc/incl/sysc/SiFive/gpio.h b/riscv.sc/incl/sysc/SiFive/gpio.h
index 47e4644..04e1f07 100644
--- a/riscv.sc/incl/sysc/SiFive/gpio.h
+++ b/riscv.sc/incl/sysc/SiFive/gpio.h
@@ -1,12 +1,12 @@
/*******************************************************************************
* Copyright 2017 eyck@minres.com
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -23,13 +23,14 @@ namespace sysc {
class gpio_regs;
-class gpio: public sc_core::sc_module, public tlm_target<> {
+class gpio : public sc_core::sc_module, public tlm_target<> {
public:
SC_HAS_PROCESS(gpio);
sc_core::sc_in clk_i;
- sc_core::sc_in rst_i;
+ sc_core::sc_in rst_i;
gpio(sc_core::sc_module_name nm);
virtual ~gpio();
+
protected:
void clock_cb();
void reset_cb();
diff --git a/riscv.sc/incl/sysc/SiFive/platform.h b/riscv.sc/incl/sysc/SiFive/platform.h
index 5bf3d46..31fa95f 100644
--- a/riscv.sc/incl/sysc/SiFive/platform.h
+++ b/riscv.sc/incl/sysc/SiFive/platform.h
@@ -1,12 +1,12 @@
/*******************************************************************************
* Copyright 2017 eyck@minres.com
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -23,21 +23,20 @@
#ifndef SIMPLESYSTEM_H_
#define SIMPLESYSTEM_H_
-#include "uart.h"
-#include "spi.h"
#include "gpio.h"
#include "plic.h"
+#include "spi.h"
+#include "uart.h"
-#include
-#include
#include
+#include
+#include
#include "core_complex.h"
-
namespace sysc {
-class platform: public sc_core::sc_module {
+class platform : public sc_core::sc_module {
public:
SC_HAS_PROCESS(platform);
@@ -51,6 +50,7 @@ public:
sc_core::sc_signal s_rst;
platform(sc_core::sc_module_name nm);
+
protected:
void gen_reset();
diff --git a/riscv.sc/incl/sysc/SiFive/plic.h b/riscv.sc/incl/sysc/SiFive/plic.h
index 3ad1e5b..5ae5f25 100644
--- a/riscv.sc/incl/sysc/SiFive/plic.h
+++ b/riscv.sc/incl/sysc/SiFive/plic.h
@@ -1,12 +1,12 @@
/*******************************************************************************
* Copyright 2017 eyck@minres.com
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -23,13 +23,14 @@ namespace sysc {
class plic_regs;
-class plic: public sc_core::sc_module, public tlm_target<> {
+class plic : public sc_core::sc_module, public tlm_target<> {
public:
SC_HAS_PROCESS(plic);
sc_core::sc_in clk_i;
- sc_core::sc_in rst_i;
+ sc_core::sc_in rst_i;
plic(sc_core::sc_module_name nm);
virtual ~plic();
+
protected:
void clock_cb();
void reset_cb();
diff --git a/riscv.sc/incl/sysc/SiFive/spi.h b/riscv.sc/incl/sysc/SiFive/spi.h
index 9fcea1a..cdf5aee 100644
--- a/riscv.sc/incl/sysc/SiFive/spi.h
+++ b/riscv.sc/incl/sysc/SiFive/spi.h
@@ -1,12 +1,12 @@
/*******************************************************************************
* Copyright 2017 eyck@minres.com
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -23,13 +23,14 @@ namespace sysc {
class spi_regs;
-class spi: public sc_core::sc_module, public tlm_target<> {
+class spi : public sc_core::sc_module, public tlm_target<> {
public:
SC_HAS_PROCESS(spi);
sc_core::sc_in clk_i;
- sc_core::sc_in rst_i;
+ sc_core::sc_in rst_i;
spi(sc_core::sc_module_name nm);
virtual ~spi();
+
protected:
void clock_cb();
void reset_cb();
diff --git a/riscv.sc/incl/sysc/SiFive/uart.h b/riscv.sc/incl/sysc/SiFive/uart.h
index 4dc733e..6c80fc0 100644
--- a/riscv.sc/incl/sysc/SiFive/uart.h
+++ b/riscv.sc/incl/sysc/SiFive/uart.h
@@ -1,12 +1,12 @@
/*******************************************************************************
* Copyright 2017 eyck@minres.com
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -23,13 +23,14 @@ namespace sysc {
class uart_regs;
-class uart: public sc_core::sc_module, public tlm_target<> {
+class uart : public sc_core::sc_module, public tlm_target<> {
public:
SC_HAS_PROCESS(uart);
sc_core::sc_in clk_i;
- sc_core::sc_in rst_i;
+ sc_core::sc_in rst_i;
uart(sc_core::sc_module_name nm);
virtual ~uart();
+
protected:
void clock_cb();
void reset_cb();
diff --git a/riscv.sc/src/sc_main.cpp b/riscv.sc/src/sc_main.cpp
index bad3bf4..8a35081 100644
--- a/riscv.sc/src/sc_main.cpp
+++ b/riscv.sc/src/sc_main.cpp
@@ -1,12 +1,12 @@
////////////////////////////////////////////////////////////////////////////////
// Copyright 2017 eyck@minres.com
-//
+//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -20,13 +20,13 @@
* Author: eyck@minres.com
*/
-#include
-#include
-#include
#include
-#include
+#include
#include
#include
+#include
+#include
+#include
using namespace sysc;
namespace po = boost::program_options;
@@ -37,28 +37,26 @@ const size_t SUCCESS = 0;
const size_t ERROR_UNHANDLED_EXCEPTION = 2;
} // namespace
-int sc_main(int argc, char* argv[]){
-// sc_report_handler::set_handler(my_report_handler);
- sysc::Logger::reporting_level()=log::DEBUG;
+int sc_main(int argc, char *argv[]) {
+ // sc_report_handler::set_handler(my_report_handler);
+ sysc::Logger::reporting_level() = log::DEBUG;
///////////////////////////////////////////////////////////////////////////
// CLI argument parsing
///////////////////////////////////////////////////////////////////////////
- po::options_description desc("Options");\
- desc.add_options()\
- ("help,h", "Print help message")\
- ("debug,d", po::value(), "set debug level")\
- ("trace,t", "trace SystemC signals");
+ po::options_description desc("Options");
+ desc.add_options()("help,h", "Print help message")("debug,d", po::value(),
+ "set debug level")("trace,t", "trace SystemC signals");
po::variables_map vm;
try {
po::store(po::parse_command_line(argc, argv, desc), vm); // can throw
// --help option
- if ( vm.count("help") ){
+ if (vm.count("help")) {
std::cout << "JIT-ISS simulator for AVR" << std::endl << desc << std::endl;
return SUCCESS;
}
po::notify(vm); // throws on error, so do after help in case
- // there are any problems
- } catch(po::error& e){
+ // there are any problems
+ } catch (po::error &e) {
std::cerr << "ERROR: " << e.what() << std::endl << std::endl;
std::cerr << desc << std::endl;
return ERROR_IN_COMMAND_LINE;
@@ -71,13 +69,13 @@ int sc_main(int argc, char* argv[]){
// instantiate top level
///////////////////////////////////////////////////////////////////////////
platform i_simple_system("i_simple_system");
- //sr_report_handler::add_sc_object_to_filter(&i_simple_system.i_master, sc_core::SC_WARNING, sc_core::SC_MEDIUM);
+ // sr_report_handler::add_sc_object_to_filter(&i_simple_system.i_master,
+ // sc_core::SC_WARNING, sc_core::SC_MEDIUM);
///////////////////////////////////////////////////////////////////////////
// run simulation
///////////////////////////////////////////////////////////////////////////
sc_start(sc_core::sc_time(100, sc_core::SC_NS));
- if(!sc_end_of_simulation_invoked()) sc_stop();
+ if (!sc_end_of_simulation_invoked()) sc_stop();
return 0;
}
-
diff --git a/riscv.sc/src/sysc/core_complex.cpp b/riscv.sc/src/sysc/core_complex.cpp
index c1acf0d..de360b0 100644
--- a/riscv.sc/src/sysc/core_complex.cpp
+++ b/riscv.sc/src/sysc/core_complex.cpp
@@ -39,12 +39,8 @@
namespace sysc {
namespace SiFive {
-core_complex::core_complex(sc_core::sc_module_name name)
-:sc_core::sc_module(name)
-, NAMED(initiator)
-, NAMED(rst_i){
+core_complex::core_complex(sc_core::sc_module_name name) : sc_core::sc_module(name), NAMED(initiator), NAMED(rst_i) {
// TODO Auto-generated constructor stub
-
}
core_complex::~core_complex() {
diff --git a/riscv.sc/src/sysc/gpio.cpp b/riscv.sc/src/sysc/gpio.cpp
index 970e69c..c449ef2 100644
--- a/riscv.sc/src/sysc/gpio.cpp
+++ b/riscv.sc/src/sysc/gpio.cpp
@@ -1,12 +1,12 @@
////////////////////////////////////////////////////////////////////////////////
// Copyright 2017 eyck@minres.com
-//
+//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,27 +21,20 @@
namespace sysc {
gpio::gpio(sc_core::sc_module_name nm)
-: sc_core::sc_module(nm)
-, tlm_target<>(clk)
-, NAMED(clk_i)
-, NAMED(rst_i)
-, NAMEDD(gpio_regs, regs)
-{
+ : sc_core::sc_module(nm), tlm_target<>(clk), NAMED(clk_i), NAMED(rst_i), NAMEDD(gpio_regs, regs) {
regs->registerResources(*this);
SC_METHOD(clock_cb);
- sensitive<reset_start();
else
regs->reset_stop();
diff --git a/riscv.sc/src/sysc/platform.cpp b/riscv.sc/src/sysc/platform.cpp
index a18145c..26d6875 100644
--- a/riscv.sc/src/sysc/platform.cpp
+++ b/riscv.sc/src/sysc/platform.cpp
@@ -1,12 +1,12 @@
////////////////////////////////////////////////////////////////////////////////
// Copyright 2017 eyck@minres.com
-//
+//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -25,19 +25,11 @@
namespace sysc {
platform::platform(sc_core::sc_module_name nm)
-: sc_core::sc_module(nm)
-, NAMED(i_master)
-, NAMED(i_router, 4, 1)
-, NAMED(i_uart)
-, NAMED(i_spi)
-, NAMED(i_gpio)
-, NAMED(i_plic)
-, NAMED(s_clk)
-, NAMED(s_rst)
-{
+ : sc_core::sc_module(nm), NAMED(i_master), NAMED(i_router, 4, 1), NAMED(i_uart), NAMED(i_spi), NAMED(i_gpio),
+ NAMED(i_plic), NAMED(s_clk), NAMED(s_rst) {
i_master.initiator(i_router.target[0]);
- size_t i=0;
- for(const auto& e: e300_plat_map){
+ size_t i = 0;
+ for (const auto &e : e300_plat_map) {
i_router.initiator.at(i)(e.target->socket);
i_router.add_target_range(i, e.start, e.size);
i++;
@@ -58,9 +50,9 @@ platform::platform(sc_core::sc_module_name nm)
}
void platform::gen_reset() {
- s_rst=true;
+ s_rst = true;
wait(10_ns);
- s_rst=false;
+ s_rst = false;
}
} /* namespace sysc */
diff --git a/riscv.sc/src/sysc/plic.cpp b/riscv.sc/src/sysc/plic.cpp
index 41f980f..9b0153a 100644
--- a/riscv.sc/src/sysc/plic.cpp
+++ b/riscv.sc/src/sysc/plic.cpp
@@ -1,12 +1,12 @@
////////////////////////////////////////////////////////////////////////////////
// Copyright 2017 eyck@minres.com
-//
+//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,28 +21,20 @@
namespace sysc {
plic::plic(sc_core::sc_module_name nm)
-: sc_core::sc_module(nm)
-, tlm_target<>(clk)
-, NAMED(clk_i)
-, NAMED(rst_i)
-, NAMEDD(plic_regs, regs)
-{
+ : sc_core::sc_module(nm), tlm_target<>(clk), NAMED(clk_i), NAMED(rst_i), NAMEDD(plic_regs, regs) {
regs->registerResources(*this);
SC_METHOD(clock_cb);
- sensitive<clk=clk_i.read();
-}
+void plic::clock_cb() { this->clk = clk_i.read(); }
void plic::reset_cb() {
- if(rst_i.read())
+ if (rst_i.read())
regs->reset_start();
else
regs->reset_stop();
diff --git a/riscv.sc/src/sysc/spi.cpp b/riscv.sc/src/sysc/spi.cpp
index d5445ac..134cc48 100644
--- a/riscv.sc/src/sysc/spi.cpp
+++ b/riscv.sc/src/sysc/spi.cpp
@@ -1,12 +1,12 @@
////////////////////////////////////////////////////////////////////////////////
// Copyright 2017 eyck@minres.com
-//
+//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,28 +21,20 @@
namespace sysc {
spi::spi(sc_core::sc_module_name nm)
-: sc_core::sc_module(nm)
-, tlm_target<>(clk)
-, NAMED(clk_i)
-, NAMED(rst_i)
-, NAMEDD(spi_regs, regs)
-{
+ : sc_core::sc_module(nm), tlm_target<>(clk), NAMED(clk_i), NAMED(rst_i), NAMEDD(spi_regs, regs) {
regs->registerResources(*this);
SC_METHOD(clock_cb);
- sensitive<clk=clk_i.read();
-}
+void spi::clock_cb() { this->clk = clk_i.read(); }
void spi::reset_cb() {
- if(rst_i.read())
+ if (rst_i.read())
regs->reset_start();
else
regs->reset_stop();
diff --git a/riscv.sc/src/sysc/uart.cpp b/riscv.sc/src/sysc/uart.cpp
index 0e5df18..b68a712 100644
--- a/riscv.sc/src/sysc/uart.cpp
+++ b/riscv.sc/src/sysc/uart.cpp
@@ -1,12 +1,12 @@
////////////////////////////////////////////////////////////////////////////////
// Copyright 2017 eyck@minres.com
-//
+//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,28 +21,20 @@
namespace sysc {
uart::uart(sc_core::sc_module_name nm)
-: sc_core::sc_module(nm)
-, tlm_target<>(clk)
-, NAMED(clk_i)
-, NAMED(rst_i)
-, NAMEDD(uart_regs, regs)
-{
+ : sc_core::sc_module(nm), tlm_target<>(clk), NAMED(clk_i), NAMED(rst_i), NAMEDD(uart_regs, regs) {
regs->registerResources(*this);
SC_METHOD(clock_cb);
- sensitive<clk=clk_i.read();
-}
+void uart::clock_cb() { this->clk = clk_i.read(); }
void uart::reset_cb() {
- if(rst_i.read())
+ if (rst_i.read())
regs->reset_start();
else
regs->reset_stop();
diff --git a/riscv/incl/cli_options.h b/riscv/incl/cli_options.h
index 76da009..cb32c73 100644
--- a/riscv/incl/cli_options.h
+++ b/riscv/incl/cli_options.h
@@ -1,21 +1,21 @@
/*******************************************************************************
* Copyright (C) 2017, MINRES Technologies GmbH
* All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
- *
+ *
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
- *
+ *
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
- *
+ *
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -27,7 +27,7 @@
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
- *
+ *
* Contributors:
* eyck@minres.com - initial API and implementation
******************************************************************************/
@@ -35,49 +35,47 @@
#ifndef _CLI_OPTIONS_H_
#define _CLI_OPTIONS_H_
#include
-#include
-#include
#include
+#include
+#include
const size_t ERROR_IN_COMMAND_LINE = 1;
const size_t SUCCESS = 0;
const size_t ERROR_UNHANDLED_EXCEPTION = 2;
-inline int parse_cli_options(boost::program_options::variables_map& vm, int argc, char *argv[]){
+inline int parse_cli_options(boost::program_options::variables_map &vm, int argc, char *argv[]) {
namespace po = boost::program_options;
po::options_description desc("Options");
- desc.add_options()
- ("help,h", "Print help message")
- ("verbose,v", po::value()->implicit_value(0), "Sets logging verbosity")
- ("vmodule", po::value(),"Defines the module(s) to be logged")
- ("logging-flags", po::value(),"Sets logging flag(s).")
- ("log-file", po::value(),"Sets default log file.")
- ("disass,d", po::value()->implicit_value(""),"Enables disassembly")
- ("elf,l", po::value< std::vector >(), "ELF file(s) to load")
- ("gdb-port,g", po::value(), "enable gdb server and specify port to use")
- ("input,i", po::value(), "the elf file to load (instead of hex files)")
- ("dump-ir", "dump the intermediate representation")
- ("cycles,c", po::value()->default_value(-1), "number of cycles to run")
- ("systemc,s", "Run as SystemC simulation")
- ("time", po::value(), "SystemC siimulation time in ms")
- ("reset,r", po::value(), "reset address")
- ("trace", po::value(), "enable tracing, or cmbintation of 1=signals and 2=TX text, 4=TX compressed text, 6=TX in SQLite")\
- ("mem,m", po::value(), "the memory input file")
- ("rv64", "run RV64");
+ desc.add_options()("help,h", "Print help message")("verbose,v", po::value()->implicit_value(0),
+ "Sets logging verbosity")("vmodule", po::value(),
+ "Defines the module(s) to be logged")(
+ "logging-flags", po::value(), "Sets logging flag(s).")("log-file", po::value(),
+ "Sets default log file.")(
+ "disass,d", po::value()->implicit_value(""),
+ "Enables disassembly")("elf,l", po::value>(), "ELF file(s) to load")(
+ "gdb-port,g", po::value(), "enable gdb server and specify port to use")(
+ "input,i", po::value(), "the elf file to load (instead of hex files)")(
+ "dump-ir", "dump the intermediate representation")("cycles,c", po::value()->default_value(-1),
+ "number of cycles to run")(
+ "systemc,s", "Run as SystemC simulation")("time", po::value(), "SystemC siimulation time in ms")(
+ "reset,r", po::value(), "reset address")(
+ "trace", po::value(), "enable tracing, or cmbintation of 1=signals and 2=TX text, 4=TX "
+ "compressed text, 6=TX in SQLite")("mem,m", po::value(),
+ "the memory input file")("rv64", "run RV64");
try {
po::store(po::parse_command_line(argc, argv, desc), vm); // can throw
// --help option
- if ( vm.count("help") ){
+ if (vm.count("help")) {
std::cout << "DBT-RISE-RiscV" << std::endl << desc << std::endl;
return SUCCESS;
}
po::notify(vm); // throws on error, so do after help in case
- } catch(po::error& e){
- // there are problems
- std::cerr << "ERROR: " << e.what() << std::endl << std::endl;
+ } catch (po::error &e) {
+ // there are problems
+ std::cerr << "ERROR: " << e.what() << std::endl << std::endl;
std::cerr << desc << std::endl;
return ERROR_IN_COMMAND_LINE;
}
- return SUCCESS;
+ return SUCCESS;
}
#endif /* _CLI_OPTIONS_H_ */
diff --git a/riscv/incl/iss/arch/riscv_hart_msu_vp.h b/riscv/incl/iss/arch/riscv_hart_msu_vp.h
index 1e5715d..086e111 100644
--- a/riscv/incl/iss/arch/riscv_hart_msu_vp.h
+++ b/riscv/incl/iss/arch/riscv_hart_msu_vp.h
@@ -1,21 +1,21 @@
/*******************************************************************************
* Copyright (C) 2017, MINRES Technologies GmbH
* All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
- *
+ *
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
- *
+ *
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
- *
+ *
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -27,7 +27,7 @@
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
- *
+ *
* Contributors:
* eyck@minres.com - initial API and implementation
******************************************************************************/
@@ -35,203 +35,186 @@
#ifndef _RISCV_CORE_H_
#define _RISCV_CORE_H_
-#include
+#include
+#include
+#include
#include
+#include
+#include
+#include
+#include
#include
#include
-#include
-#include
-#include
-#include
-#include
namespace iss {
namespace arch {
-enum {
- tohost_dflt = 0xF0001000,
- fromhost_dflt = 0xF0001040
-};
+enum { tohost_dflt = 0xF0001000, fromhost_dflt = 0xF0001040 };
enum csr_name {
/* user-level CSR */
// User Trap Setup
- ustatus=0x000,
- uie=0x004,
- utvec=0x005,
+ ustatus = 0x000,
+ uie = 0x004,
+ utvec = 0x005,
// User Trap Handling
- uscratch=0x040,
- uepc=0x041,
- ucause=0x042,
- utval=0x043,
- uip=0x044,
+ uscratch = 0x040,
+ uepc = 0x041,
+ ucause = 0x042,
+ utval = 0x043,
+ uip = 0x044,
// User Floating-Point CSRs
- fflags=0x001,
- frm=0x002,
- fcsr=0x003,
+ fflags = 0x001,
+ frm = 0x002,
+ fcsr = 0x003,
// User Counter/Timers
- cycle=0xC00,
- time=0xC01,
- instret=0xC02,
- hpmcounter3=0xC03,
- hpmcounter4=0xC04,
+ cycle = 0xC00,
+ time = 0xC01,
+ instret = 0xC02,
+ hpmcounter3 = 0xC03,
+ hpmcounter4 = 0xC04,
/*...*/
- hpmcounter31=0xC1F,
- cycleh=0xC80,
- timeh=0xC81,
- instreth=0xC82,
- hpmcounter3h=0xC83,
- hpmcounter4h=0xC84,
+ hpmcounter31 = 0xC1F,
+ cycleh = 0xC80,
+ timeh = 0xC81,
+ instreth = 0xC82,
+ hpmcounter3h = 0xC83,
+ hpmcounter4h = 0xC84,
/*...*/
- hpmcounter31h=0xC9F,
+ hpmcounter31h = 0xC9F,
/* supervisor-level CSR */
// Supervisor Trap Setup
- sstatus=0x100,
- sedeleg=0x102,
- sideleg=0x103,
- sie=0x104,
- stvec=0x105,
- scounteren=0x106,
+ sstatus = 0x100,
+ sedeleg = 0x102,
+ sideleg = 0x103,
+ sie = 0x104,
+ stvec = 0x105,
+ scounteren = 0x106,
// Supervisor Trap Handling
- sscratch=0x140,
- sepc=0x141,
- scause=0x142,
- stval=0x143,
- sip=0x144,
+ sscratch = 0x140,
+ sepc = 0x141,
+ scause = 0x142,
+ stval = 0x143,
+ sip = 0x144,
// Supervisor Protection and Translation
- satp=0x180,
+ satp = 0x180,
/* machine-level CSR */
// Machine Information Registers
- mvendorid=0xF11,
- marchid=0xF12,
- mimpid=0xF13,
- mhartid=0xF14,
+ mvendorid = 0xF11,
+ marchid = 0xF12,
+ mimpid = 0xF13,
+ mhartid = 0xF14,
// Machine Trap Setup
- mstatus=0x300,
- misa=0x301,
- medeleg=0x302,
- mideleg=0x303,
- mie=0x304,
- mtvec=0x305,
- mcounteren=0x306,
+ mstatus = 0x300,
+ misa = 0x301,
+ medeleg = 0x302,
+ mideleg = 0x303,
+ mie = 0x304,
+ mtvec = 0x305,
+ mcounteren = 0x306,
// Machine Trap Handling
- mscratch=0x340,
- mepc=0x341,
- mcause=0x342,
- mtval=0x343,
- mip=0x344,
+ mscratch = 0x340,
+ mepc = 0x341,
+ mcause = 0x342,
+ mtval = 0x343,
+ mip = 0x344,
// Machine Protection and Translation
- pmpcfg0=0x3A0,
- pmpcfg1=0x3A1,
- pmpcfg2=0x3A2,
- pmpcfg3=0x3A3,
- pmpaddr0=0x3B0,
- pmpaddr1=0x3B1,
+ pmpcfg0 = 0x3A0,
+ pmpcfg1 = 0x3A1,
+ pmpcfg2 = 0x3A2,
+ pmpcfg3 = 0x3A3,
+ pmpaddr0 = 0x3B0,
+ pmpaddr1 = 0x3B1,
/*...*/
- pmpaddr15=0x3BF,
+ pmpaddr15 = 0x3BF,
// Machine Counter/Timers
- mcycle=0xB00,
- minstret=0xB02,
- mhpmcounter3=0xB03,
- mhpmcounter4=0xB04,
+ mcycle = 0xB00,
+ minstret = 0xB02,
+ mhpmcounter3 = 0xB03,
+ mhpmcounter4 = 0xB04,
/*...*/
- mhpmcounter31=0xB1F,
- mcycleh=0xB80,
- minstreth=0xB82,
- mhpmcounter3h=0xB83,
- mhpmcounter4h=0xB84,
+ mhpmcounter31 = 0xB1F,
+ mcycleh = 0xB80,
+ minstreth = 0xB82,
+ mhpmcounter3h = 0xB83,
+ mhpmcounter4h = 0xB84,
/*...*/
- mhpmcounter31h=0xB9F,
+ mhpmcounter31h = 0xB9F,
// Machine Counter Setup
- mhpmevent3=0x323,
- mhpmevent4=0x324,
+ mhpmevent3 = 0x323,
+ mhpmevent4 = 0x324,
/*...*/
- mhpmevent31=0x33F,
+ mhpmevent31 = 0x33F,
// Debug/Trace Registers (shared with Debug Mode)
- tselect=0x7A0,
- tdata1=0x7A1,
- tdata2=0x7A2,
- tdata3=0x7A3,
+ tselect = 0x7A0,
+ tdata1 = 0x7A1,
+ tdata2 = 0x7A2,
+ tdata3 = 0x7A3,
// Debug Mode Registers
- dcsr=0x7B0,
- dpc=0x7B1,
- dscratch=0x7B2
+ dcsr = 0x7B0,
+ dpc = 0x7B1,
+ dscratch = 0x7B2
};
namespace {
-const char lvl[]={'U', 'S', 'H', 'M'};
+const char lvl[] = {'U', 'S', 'H', 'M'};
-const char* trap_str[] = {
- "Instruction address misaligned",
- "Instruction access fault",
- "Illegal instruction",
- "Breakpoint",
- "Load address misaligned",
- "Load access fault",
- "Store/AMO address misaligned",
- "Store/AMO access fault",
- "Environment call from U-mode",
- "Environment call from S-mode",
- "Reserved",
- "Environment call from M-mode",
- "Instruction page fault",
- "Load page fault",
- "Reserved",
- "Store/AMO page fault"
-};
-const char* irq_str[] = {
- "User software interrupt",
- "Supervisor software interrupt",
- "Reserved",
- "Machine software interrupt",
- "User timer interrupt",
- "Supervisor timer interrupt",
- "Reserved",
- "Machine timer interrupt",
- "User external interrupt",
- "Supervisor external interrupt",
- "Reserved",
- "Machine external interrupt"
-};
+const char *trap_str[] = {"Instruction address misaligned",
+ "Instruction access fault",
+ "Illegal instruction",
+ "Breakpoint",
+ "Load address misaligned",
+ "Load access fault",
+ "Store/AMO address misaligned",
+ "Store/AMO access fault",
+ "Environment call from U-mode",
+ "Environment call from S-mode",
+ "Reserved",
+ "Environment call from M-mode",
+ "Instruction page fault",
+ "Load page fault",
+ "Reserved",
+ "Store/AMO page fault"};
+const char *irq_str[] = {
+ "User software interrupt", "Supervisor software interrupt", "Reserved", "Machine software interrupt",
+ "User timer interrupt", "Supervisor timer interrupt", "Reserved", "Machine timer interrupt",
+ "User external interrupt", "Supervisor external interrupt", "Reserved", "Machine external interrupt"};
enum {
- PGSHIFT=12,
- PTE_PPN_SHIFT=10,
+ PGSHIFT = 12,
+ PTE_PPN_SHIFT = 10,
// page table entry (PTE) fields
- PTE_V = 0x001, // Valid
- PTE_R = 0x002, // Read
- PTE_W = 0x004, // Write
- PTE_X = 0x008, // Execute
- PTE_U = 0x010, // User
- PTE_G = 0x020, // Global
- PTE_A = 0x040, // Accessed
- PTE_D = 0x080, // Dirty
+ PTE_V = 0x001, // Valid
+ PTE_R = 0x002, // Read
+ PTE_W = 0x004, // Write
+ PTE_X = 0x008, // Execute
+ PTE_U = 0x010, // User
+ PTE_G = 0x020, // Global
+ PTE_A = 0x040, // Accessed
+ PTE_D = 0x080, // Dirty
PTE_SOFT = 0x300 // Reserved for Software
};
-template
-inline bool PTE_TABLE(T PTE){
- return (((PTE) & (PTE_V | PTE_R | PTE_W | PTE_X)) == PTE_V);
-}
+template inline bool PTE_TABLE(T PTE) { return (((PTE) & (PTE_V | PTE_R | PTE_W | PTE_X)) == PTE_V); }
-
-enum { PRIV_U=0, PRIV_S=1, PRIV_M=3};
+enum { PRIV_U = 0, PRIV_S = 1, PRIV_M = 3 };
enum {
- ISA_A=1,
- ISA_B=1<<1,
- ISA_C=1<<2,
- ISA_D=1<<3,
- ISA_E=1<<4,
- ISA_F=1<<5,
- ISA_G=1<<6,
- ISA_I=1<<8,
- ISA_M=1<<12,
- ISA_N=1<<13,
- ISA_Q=1<<16,
- ISA_S=1<<18,
- ISA_U=1<<20};
+ ISA_A = 1,
+ ISA_B = 1 << 1,
+ ISA_C = 1 << 2,
+ ISA_D = 1 << 3,
+ ISA_E = 1 << 4,
+ ISA_F = 1 << 5,
+ ISA_G = 1 << 6,
+ ISA_I = 1 << 8,
+ ISA_M = 1 << 12,
+ ISA_N = 1 << 13,
+ ISA_Q = 1 << 16,
+ ISA_S = 1 << 18,
+ ISA_U = 1 << 20
+};
struct vm_info {
int levels;
@@ -240,165 +223,122 @@ struct vm_info {
uint64_t ptbase;
};
-
-struct trap_load_access_fault: public trap_access {
- trap_load_access_fault(uint64_t badaddr) : trap_access(5<<16, badaddr) {}
+struct trap_load_access_fault : public trap_access {
+ trap_load_access_fault(uint64_t badaddr) : trap_access(5 << 16, badaddr) {}
};
-struct illegal_instruction_fault: public trap_access {
- illegal_instruction_fault(uint64_t badaddr) : trap_access(2<<16, badaddr) {}
+struct illegal_instruction_fault : public trap_access {
+ illegal_instruction_fault(uint64_t badaddr) : trap_access(2 << 16, badaddr) {}
};
-struct trap_instruction_page_fault: public trap_access {
- trap_instruction_page_fault(uint64_t badaddr) : trap_access(12<<16, badaddr) {}
+struct trap_instruction_page_fault : public trap_access {
+ trap_instruction_page_fault(uint64_t badaddr) : trap_access(12 << 16, badaddr) {}
};
-struct trap_load_page_fault: public trap_access {
- trap_load_page_fault(uint64_t badaddr) : trap_access(13<<16, badaddr) {}
+struct trap_load_page_fault : public trap_access {
+ trap_load_page_fault(uint64_t badaddr) : trap_access(13 << 16, badaddr) {}
};
-struct trap_store_page_fault: public trap_access {
- trap_store_page_fault(uint64_t badaddr) : trap_access(15<<16, badaddr) {}
+struct trap_store_page_fault : public trap_access {
+ trap_store_page_fault(uint64_t badaddr) : trap_access(15 << 16, badaddr) {}
};
}
typedef union {
uint32_t val;
struct /*mstatus*/ {
- uint32_t
- SD:1, //SD bit is read-only and is set when either the FS or XS bits encode a Dirty state (i.e., SD=((FS==11) OR (XS==11)))
- _WPRI3:8, //unused
- TSR:1, //Trap SRET
- TW:1, //Timeout Wait
- TVM:1, //Trap Virtual Memory
- MXR:1, //Make eXecutable Readable
- SUM:1, //permit Supervisor User Memory access
- MPRV:1, //Modify PRiVilege
- XS:2, //status of additional user-mode extensions and associated state, All off/None dirty or clean, some on/None dirty, some clean/Some dirty
- FS:2, //floating-point unit status Off/Initial/Clean/Dirty
- MPP:2, // machine previous privilege
- _WPRI2:2, // unused
- SPP:1, // supervisor previous privilege
- MPIE:1, //previous machine interrupt-enable
- _WPRI1:1, // unused
- SPIE:1, //previous supervisor interrupt-enable
- UPIE:1, //previous user interrupt-enable
- MIE:1, //machine interrupt-enable
- _WPRI0:1, // unused
- SIE:1, //supervisor interrupt-enable
- UIE:1; //user interrupt-enable
+ uint32_t SD : 1, // SD bit is read-only and is set when either the FS or XS
+ // bits encode a Dirty state (i.e., SD=((FS==11) OR
+ // (XS==11)))
+ _WPRI3 : 8, // unused
+ TSR : 1, // Trap SRET
+ TW : 1, // Timeout Wait
+ TVM : 1, // Trap Virtual Memory
+ MXR : 1, // Make eXecutable Readable
+ SUM : 1, // permit Supervisor User Memory access
+ MPRV : 1, // Modify PRiVilege
+ XS : 2, // status of additional user-mode extensions and associated
+ // state, All off/None dirty or clean, some on/None dirty, some
+ // clean/Some dirty
+ FS : 2, // floating-point unit status Off/Initial/Clean/Dirty
+ MPP : 2, // machine previous privilege
+ _WPRI2 : 2, // unused
+ SPP : 1, // supervisor previous privilege
+ MPIE : 1, // previous machine interrupt-enable
+ _WPRI1 : 1, // unused
+ SPIE : 1, // previous supervisor interrupt-enable
+ UPIE : 1, // previous user interrupt-enable
+ MIE : 1, // machine interrupt-enable
+ _WPRI0 : 1, // unused
+ SIE : 1, // supervisor interrupt-enable
+ UIE : 1; // user interrupt-enable
} m;
struct /*sstatus*/ {
- uint32_t
- SD:1,
- _WPRI4:11,
- MXR:1,
- SUM:1,
- _WPRI3:1,
- XS:2,
- FS:2,
- _WPRI2:4,
- SPP:1,
- _WPRI1:2,
- SPIE:1,
- UPIE:1,
- _WPRI0:2,
- SIE:1,
- UIE:1;
+ uint32_t SD : 1, _WPRI4 : 11, MXR : 1, SUM : 1, _WPRI3 : 1, XS : 2, FS : 2, _WPRI2 : 4, SPP : 1, _WPRI1 : 2,
+ SPIE : 1, UPIE : 1, _WPRI0 : 2, SIE : 1, UIE : 1;
} s;
struct /*ustatus*/ {
- uint32_t
- SD:1,
- _WPRI4:11,
- MXR:1,
- SUM:1,
- _WPRI3:1,
- XS:2,
- FS:2,
- _WPRI2:8,
- UPIE:1,
- _WPRI0:3,
- UIE:1;
+ uint32_t SD : 1, _WPRI4 : 11, MXR : 1, SUM : 1, _WPRI3 : 1, XS : 2, FS : 2, _WPRI2 : 8, UPIE : 1, _WPRI0 : 3,
+ UIE : 1;
} u;
} mstatus32_t;
typedef union {
uint64_t val;
struct /*mstatus*/ {
- uint64_t
- SD:1, // SD bit is read-only and is set when either the FS or XS bits encode a Dirty state (i.e., SD=((FS==11) OR (XS==11)))
- _WPRI4:27,// unused
- SXL:2, // value of XLEN for S-mode
- UXL:2, // value of XLEN for U-mode
- _WPRI3:9, // unused
- TSR:1, // Trap SRET
- TW:1, // Timeout Wait
- TVM:1, // Trap Virtual Memory
- MXR:1, // Make eXecutable Readable
- SUM:1, // permit Supervisor User Memory access
- MPRV:1, // Modify PRiVilege
- XS:2, // status of additional user-mode extensions and associated state, All off/None dirty or clean, some on/None dirty, some clean/Some dirty
- FS:2, // floating-point unit status Off/Initial/Clean/Dirty
- MPP:2, // machine previous privilege
- _WPRI2:2, // unused
- SPP:1, // supervisor previous privilege
- MPIE:1, // previous machine interrupt-enable
- _WPRI1:1, // unused
- SPIE:1, // previous supervisor interrupt-enable
- UPIE:1, // previous user interrupt-enable
- MIE:1, // machine interrupt-enable
- _WPRI0:1, // unused
- SIE:1, // supervisor interrupt-enable
- UIE:1; // ‚user interrupt-enable
+ uint64_t SD : 1, // SD bit is read-only and is set when either the FS or XS
+ // bits encode a Dirty state (i.e., SD=((FS==11) OR
+ // (XS==11)))
+ _WPRI4 : 27, // unused
+ SXL : 2, // value of XLEN for S-mode
+ UXL : 2, // value of XLEN for U-mode
+ _WPRI3 : 9, // unused
+ TSR : 1, // Trap SRET
+ TW : 1, // Timeout Wait
+ TVM : 1, // Trap Virtual Memory
+ MXR : 1, // Make eXecutable Readable
+ SUM : 1, // permit Supervisor User Memory access
+ MPRV : 1, // Modify PRiVilege
+ XS : 2, // status of additional user-mode extensions and associated
+ // state, All off/None dirty or clean, some on/None dirty, some
+ // clean/Some dirty
+ FS : 2, // floating-point unit status Off/Initial/Clean/Dirty
+ MPP : 2, // machine previous privilege
+ _WPRI2 : 2, // unused
+ SPP : 1, // supervisor previous privilege
+ MPIE : 1, // previous machine interrupt-enable
+ _WPRI1 : 1, // unused
+ SPIE : 1, // previous supervisor interrupt-enable
+ UPIE : 1, // previous user interrupt-enable
+ MIE : 1, // machine interrupt-enable
+ _WPRI0 : 1, // unused
+ SIE : 1, // supervisor interrupt-enable
+ UIE : 1; // ‚user interrupt-enable
} m;
struct /*sstatus*/ {
- uint64_t
- SD:1,
- _WPRI5:29,// unused
- UXL:2, // value of XLEN for U-mode
- _WPRI4:12,
- MXR:1,
- SUM:1,
- _WPRI3:1,
- XS:2,
- FS:2,
- _WPRI2:4,
- SPP:1,
- _WPRI1:2,
- SPIE:1,
- UPIE:1,
- _WPRI0:2,
- SIE:1,
- UIE:1;
+ uint64_t SD : 1,
+ _WPRI5 : 29, // unused
+ UXL : 2, // value of XLEN for U-mode
+ _WPRI4 : 12, MXR : 1, SUM : 1, _WPRI3 : 1, XS : 2, FS : 2, _WPRI2 : 4, SPP : 1, _WPRI1 : 2, SPIE : 1,
+ UPIE : 1, _WPRI0 : 2, SIE : 1, UIE : 1;
} s;
struct /*ustatus*/ {
- uint32_t
- SD:1,
- _WPRI4:29,// unused
- UXL:2, // value of XLEN for U-mode
- _WPRI3:12,
- MXR:1,
- SUM:1,
- _WPRI2:1,
- XS:2,
- FS:2,
- _WPRI1:8,
- UPIE:1,
- _WPRI0:3,
- UIE:1;
+ uint32_t SD : 1,
+ _WPRI4 : 29, // unused
+ UXL : 2, // value of XLEN for U-mode
+ _WPRI3 : 12, MXR : 1, SUM : 1, _WPRI2 : 1, XS : 2, FS : 2, _WPRI1 : 8, UPIE : 1, _WPRI0 : 3, UIE : 1;
} u;
} mstatus64_t;
-template
-inline vm_info decode_vm_info(uint32_t state, uint64_t sptbr);
+template inline vm_info decode_vm_info(uint32_t state, uint64_t sptbr);
-template<>
-inline vm_info decode_vm_info<32u>(uint32_t state, uint64_t sptbr){
+template <> inline vm_info decode_vm_info<32u>(uint32_t state, uint64_t sptbr) {
if (state == PRIV_M) {
return {0, 0, 0, 0};
} else if (state <= PRIV_S) {
- switch (bit_sub<31,1>(sptbr)) {
+ switch (bit_sub<31, 1>(sptbr)) {
case 0: // off
return {0, 0, 0, 0};
case 1: // SV32
return {2, 10, 4, bit_sub<0, 22>(sptbr) << PGSHIFT};
- default: abort();
+ default:
+ abort();
}
} else {
abort();
@@ -406,8 +346,7 @@ inline vm_info decode_vm_info<32u>(uint32_t state, uint64_t sptbr){
return {0, 0, 0, 0}; // dummy
}
-template<>
-inline vm_info decode_vm_info<64u>(uint32_t state, uint64_t sptbr){
+template <> inline vm_info decode_vm_info<64u>(uint32_t state, uint64_t sptbr) {
if (state == PRIV_M) {
return {0, 0, 0, 0};
} else if (state <= PRIV_S) {
@@ -422,7 +361,8 @@ inline vm_info decode_vm_info<64u>(uint32_t state, uint64_t sptbr){
return {5, 9, 8, bit_sub<0, 44>(sptbr) << PGSHIFT};
case 11: // SV64
return {6, 9, 8, bit_sub<0, 44>(sptbr) << PGSHIFT};
- default: abort();
+ default:
+ abort();
}
} else {
abort();
@@ -430,58 +370,55 @@ inline vm_info decode_vm_info<64u>(uint32_t state, uint64_t sptbr){
return {0, 0, 0, 0}; // dummy
}
-
-constexpr uint32_t get_mask(unsigned priv_lvl, uint32_t mask){
- switch(priv_lvl){
+constexpr uint32_t get_mask(unsigned priv_lvl, uint32_t mask) {
+ switch (priv_lvl) {
case PRIV_U:
- return mask&0x80000011UL; // 0b1000 0000 0000 0000 0000 0000 0001 0001
+ return mask & 0x80000011UL; // 0b1000 0000 0000 0000 0000 0000 0001 0001
case PRIV_S:
- return mask&0x800de133UL; // 0b1000 0000 0000 1101 1110 0001 0011 0011
+ return mask & 0x800de133UL; // 0b1000 0000 0000 1101 1110 0001 0011 0011
default:
- return mask&0x807ff9ddUL; // 0b1000 0000 0111 1111 1111 1001 1011 1011
+ return mask & 0x807ff9ddUL; // 0b1000 0000 0111 1111 1111 1001 1011 1011
}
}
-constexpr uint64_t get_mask(unsigned priv_lvl, uint64_t mask){
- switch(priv_lvl){
+constexpr uint64_t get_mask(unsigned priv_lvl, uint64_t mask) {
+ switch (priv_lvl) {
case PRIV_U:
- return mask&0x8000000000000011ULL; //0b1...0 1111 0000 0000 0111 1111 1111 1001 1011 1011
+ return mask & 0x8000000000000011ULL; // 0b1...0 1111 0000 0000 0111 1111
+ // 1111 1001 1011 1011
case PRIV_S:
- return mask&0x80000003000de133ULL; //0b1...0 0011 0000 0000 0000 1101 1110 0001 0011 0011
+ return mask & 0x80000003000de133ULL; // 0b1...0 0011 0000 0000 0000 1101
+ // 1110 0001 0011 0011
default:
- return mask&0x8000000f007ff9ddULL; //0b1...0 1111 0000 0000 0111 1111 1111 1001 1011 1011
+ return mask & 0x8000000f007ff9ddULL; // 0b1...0 1111 0000 0000 0111 1111
+ // 1111 1001 1011 1011
}
}
-constexpr uint32_t get_misa(uint32_t mask){
- return (1UL<<30)| ISA_I | ISA_M | ISA_A | ISA_U | ISA_S | ISA_M ;
-}
+constexpr uint32_t get_misa(uint32_t mask) { return (1UL << 30) | ISA_I | ISA_M | ISA_A | ISA_U | ISA_S | ISA_M; }
-constexpr uint64_t get_misa(uint64_t mask){
- return (2ULL<<62)| ISA_I | ISA_M | ISA_A | ISA_U | ISA_S | ISA_M ;
-}
+constexpr uint64_t get_misa(uint64_t mask) { return (2ULL << 62) | ISA_I | ISA_M | ISA_A | ISA_U | ISA_S | ISA_M; }
-template
-struct riscv_hart_msu_vp: public BASE {
+template struct riscv_hart_msu_vp : public BASE {
using super = BASE;
using this_class = riscv_hart_msu_vp;
- using virt_addr_t= typename super::virt_addr_t;
- using phys_addr_t= typename super::phys_addr_t;
- using reg_t = typename super::reg_t;
+ using virt_addr_t = typename super::virt_addr_t;
+ using phys_addr_t = typename super::phys_addr_t;
+ using reg_t = typename super::reg_t;
using addr_t = typename super::addr_t;
- using rd_csr_f = iss::status (this_class::*)(unsigned addr, reg_t&);
+ using rd_csr_f = iss::status (this_class::*)(unsigned addr, reg_t &);
using wr_csr_f = iss::status (this_class::*)(unsigned addr, reg_t);
const typename super::reg_t PGSIZE = 1 << PGSHIFT;
- const typename super::reg_t PGMASK = PGSIZE-1;
+ const typename super::reg_t PGMASK = PGSIZE - 1;
- constexpr reg_t get_irq_mask(size_t mode){
+ constexpr reg_t get_irq_mask(size_t mode) {
const reg_t m[4] = {
- 0b000100010001, //U mode
- 0b001100110011, // S-mode
- 0,
- 0b101110111011 // M-mode
+ 0b000100010001, // U mode
+ 0b001100110011, // S-mode
+ 0,
+ 0b101110111011 // M-mode
};
return m[mode];
}
@@ -489,43 +426,44 @@ struct riscv_hart_msu_vp: public BASE {
riscv_hart_msu_vp();
virtual ~riscv_hart_msu_vp();
- virtual void load_file(std::string name, int type=-1);
+ virtual void load_file(std::string name, int type = -1);
- virtual phys_addr_t v2p(const iss::addr_t& addr);
+ virtual phys_addr_t v2p(const iss::addr_t &addr);
- virtual iss::status read(const iss::addr_t& addr, unsigned length, uint8_t* const data) override;
- virtual iss::status write(const iss::addr_t& addr, unsigned length, const uint8_t* const data) override;
+ virtual iss::status read(const iss::addr_t &addr, unsigned length, uint8_t *const data) override;
+ virtual iss::status write(const iss::addr_t &addr, unsigned length, const uint8_t *const data) override;
- virtual uint64_t enter_trap(uint64_t flags) override {return riscv_hart_msu_vp::enter_trap(flags, fault_data);}
+ virtual uint64_t enter_trap(uint64_t flags) override { return riscv_hart_msu_vp::enter_trap(flags, fault_data); }
virtual uint64_t enter_trap(uint64_t flags, uint64_t addr) override;
virtual uint64_t leave_trap(uint64_t flags) override;
virtual void wait_until(uint64_t flags) override;
- virtual std::string get_additional_disass_info(){
+ virtual std::string get_additional_disass_info() {
std::stringstream s;
- s<<"[p:"<reg.machine_state]<<";s:0x"<reg.icount<<"]";
+ s << "[p:" << lvl[this->reg.machine_state] << ";s:0x" << std::hex << std::setfill('0')
+ << std::setw(sizeof(reg_t) * 2) << mstatus_r << std::dec << ";c:" << this->reg.icount << "]";
return s.str();
};
protected:
- virtual iss::status read_mem(phys_addr_t addr, unsigned length, uint8_t* const data);
- virtual iss::status write_mem(phys_addr_t addr, unsigned length, const uint8_t* const data);
+ virtual iss::status read_mem(phys_addr_t addr, unsigned length, uint8_t *const data);
+ virtual iss::status write_mem(phys_addr_t addr, unsigned length, const uint8_t *const data);
- virtual iss::status read_csr(unsigned addr, reg_t& val);
- virtual iss::status write_csr(unsigned addr, reg_t val);
+ virtual iss::status read_csr(unsigned addr, reg_t &val);
+ virtual iss::status write_csr(unsigned addr, reg_t val);
uint64_t tohost = tohost_dflt;
uint64_t fromhost = fromhost_dflt;
reg_t fault_data;
- using mem_type = util::sparse_array;
- using csr_type = util::sparse_array::reg_t, 1ULL<<12, 12>;
+ using mem_type = util::sparse_array;
+ using csr_type = util::sparse_array::reg_t, 1ULL << 12, 12>;
using csr_page_type = typename csr_type::page_type;
mem_type mem;
csr_type csr;
- reg_t& mstatus_r;
- reg_t& satp_r;
- unsigned to_host_wr_cnt=0;
+ reg_t &mstatus_r;
+ reg_t &satp_r;
+ unsigned to_host_wr_cnt = 0;
std::stringstream uart_buf;
std::unordered_map ptw;
std::unordered_map atomic_reservation;
@@ -533,90 +471,88 @@ protected:
std::unordered_map csr_wr_cb;
private:
- iss::status read_cycle(unsigned addr, reg_t& val);
- iss::status read_status(unsigned addr, reg_t& val);
+ iss::status read_cycle(unsigned addr, reg_t &val);
+ iss::status read_status(unsigned addr, reg_t &val);
iss::status write_status(unsigned addr, reg_t val);
- iss::status read_ie(unsigned addr, reg_t& val);
+ iss::status read_ie(unsigned addr, reg_t &val);
iss::status write_ie(unsigned addr, reg_t val);
- iss::status read_ip(unsigned addr, reg_t& val);
+ iss::status read_ip(unsigned addr, reg_t &val);
iss::status write_ip(unsigned addr, reg_t val);
- iss::status read_satp(unsigned addr, reg_t& val);
+ iss::status read_satp(unsigned addr, reg_t &val);
iss::status write_satp(unsigned addr, reg_t val);
void check_interrupt();
};
-template
-riscv_hart_msu_vp::riscv_hart_msu_vp() : mstatus_r(csr[mstatus]), satp_r(csr[satp]) {
- csr[misa]=traits::XLEN==32?1ULL<<(traits::XLEN-2):2ULL<<(traits::XLEN-2);
+template riscv_hart_msu_vp::riscv_hart_msu_vp() : mstatus_r(csr[mstatus]), satp_r(csr[satp]) {
+ csr[misa] = traits::XLEN == 32 ? 1ULL << (traits::XLEN - 2) : 2ULL << (traits::XLEN - 2);
uart_buf.str("");
// read-only registers
- csr_wr_cb[misa]=nullptr;
- for(unsigned addr=mcycle; addr<=hpmcounter31; ++addr)
- csr_wr_cb[addr]=nullptr;
- for(unsigned addr=mcycleh; addr<=hpmcounter31h; ++addr)
- csr_wr_cb[addr]=nullptr;
+ csr_wr_cb[misa] = nullptr;
+ for (unsigned addr = mcycle; addr <= hpmcounter31; ++addr) csr_wr_cb[addr] = nullptr;
+ for (unsigned addr = mcycleh; addr <= hpmcounter31h; ++addr) csr_wr_cb[addr] = nullptr;
// special handling
- csr_rd_cb[mcycle]=&riscv_hart_msu_vp::read_cycle;
- csr_rd_cb[mcycleh]=&riscv_hart_msu_vp::read_cycle;
- csr_rd_cb[minstret]=&riscv_hart_msu_vp::read_cycle;
- csr_rd_cb[minstreth]=&riscv_hart_msu_vp::read_cycle;
- csr_rd_cb[mstatus]=&riscv_hart_msu_vp::read_status;
- csr_wr_cb[mstatus]=&riscv_hart_msu_vp::write_status;
- csr_rd_cb[sstatus]=&riscv_hart_msu_vp::read_status;
- csr_wr_cb[sstatus]=&riscv_hart_msu_vp::write_status;
- csr_rd_cb[ustatus]=&riscv_hart_msu_vp::read_status;
- csr_wr_cb[ustatus]=&riscv_hart_msu_vp::write_status;
- csr_rd_cb[mip]=&riscv_hart_msu_vp::read_ip;
- csr_wr_cb[mip]=&riscv_hart_msu_vp::write_ip;
- csr_rd_cb[sip]=&riscv_hart_msu_vp::read_ip;
- csr_wr_cb[sip]=&riscv_hart_msu_vp::write_ip;
- csr_rd_cb[uip]=&riscv_hart_msu_vp::read_ip;
- csr_wr_cb[uip]=&riscv_hart_msu_vp::write_ip;
- csr_rd_cb[mie]=&riscv_hart_msu_vp::read_ie;
- csr_wr_cb[mie]=&riscv_hart_msu_vp::write_ie;
- csr_rd_cb[sie]=&riscv_hart_msu_vp::read_ie;
- csr_wr_cb[sie]=&riscv_hart_msu_vp::write_ie;
- csr_rd_cb[uie]=&riscv_hart_msu_vp::read_ie;
- csr_wr_cb[uie]=&riscv_hart_msu_vp::write_ie;
- csr_rd_cb[satp]=&riscv_hart_msu_vp::read_satp;
- csr_wr_cb[satp]=&riscv_hart_msu_vp::write_satp;
+ csr_rd_cb[mcycle] = &riscv_hart_msu_vp::read_cycle;
+ csr_rd_cb[mcycleh] = &riscv_hart_msu_vp::read_cycle;
+ csr_rd_cb[minstret] = &riscv_hart_msu_vp::read_cycle;
+ csr_rd_cb[minstreth] = &riscv_hart_msu_vp::read_cycle;
+ csr_rd_cb[mstatus] = &riscv_hart_msu_vp::read_status;
+ csr_wr_cb[mstatus] = &riscv_hart_msu_vp::write_status;
+ csr_rd_cb[sstatus] = &riscv_hart_msu_vp::read_status;
+ csr_wr_cb[sstatus] = &riscv_hart_msu_vp::write_status;
+ csr_rd_cb[ustatus] = &riscv_hart_msu_vp::read_status;
+ csr_wr_cb[ustatus] = &riscv_hart_msu_vp::write_status;
+ csr_rd_cb[mip] = &riscv_hart_msu_vp::read_ip;
+ csr_wr_cb[mip] = &riscv_hart_msu_vp::write_ip;
+ csr_rd_cb[sip] = &riscv_hart_msu_vp::read_ip;
+ csr_wr_cb[sip] = &riscv_hart_msu_vp::write_ip;
+ csr_rd_cb[uip] = &riscv_hart_msu_vp::read_ip;
+ csr_wr_cb[uip] = &riscv_hart_msu_vp::write_ip;
+ csr_rd_cb[mie] = &riscv_hart_msu_vp::read_ie;
+ csr_wr_cb[mie] = &riscv_hart_msu_vp::write_ie;
+ csr_rd_cb[sie] = &riscv_hart_msu_vp::read_ie;
+ csr_wr_cb[sie] = &riscv_hart_msu_vp::write_ie;
+ csr_rd_cb[uie] = &riscv_hart_msu_vp::read_ie;
+ csr_wr_cb[uie] = &riscv_hart_msu_vp::write_ie;
+ csr_rd_cb[satp] = &riscv_hart_msu_vp::read_satp;
+ csr_wr_cb[satp] = &riscv_hart_msu_vp::write_satp;
}
-template
-riscv_hart_msu_vp::~riscv_hart_msu_vp() {
-}
+template riscv_hart_msu_vp::~riscv_hart_msu_vp() {}
-template
-void riscv_hart_msu_vp::load_file(std::string name, int type) {
- FILE* fp = fopen(name.c_str(), "r");
- if(fp){
+template void riscv_hart_msu_vp::load_file(std::string name, int type) {
+ FILE *fp = fopen(name.c_str(), "r");
+ if (fp) {
char buf[5];
- auto n = fread(buf, 1,4,fp);
- if(n!=4) throw std::runtime_error("input file has insufficient size");
- buf[4]=0;
- if(strcmp(buf+1, "ELF")==0){
+ auto n = fread(buf, 1, 4, fp);
+ if (n != 4) throw std::runtime_error("input file has insufficient size");
+ buf[4] = 0;
+ if (strcmp(buf + 1, "ELF") == 0) {
fclose(fp);
- //Create elfio reader
+ // Create elfio reader
ELFIO::elfio reader;
// Load ELF data
- if ( !reader.load( name ) ) throw std::runtime_error("could not process elf file");
+ if (!reader.load(name)) throw std::runtime_error("could not process elf file");
// check elf properties
- //TODO: fix ELFCLASS like:
- // if ( reader.get_class() != ELFCLASS32 ) throw std::runtime_error("wrong elf class in file");
- if ( reader.get_type() != ET_EXEC ) throw std::runtime_error("wrong elf type in file");
- //TODO: fix machine type like:
- // if ( reader.get_machine() != EM_RISCV ) throw std::runtime_error("wrong elf machine in file");
- for (const auto pseg :reader.segments ) {
- const auto fsize=pseg->get_file_size(); // 0x42c/0x0
- const auto seg_data=pseg->get_data();
- if(fsize>0){
- this->write(typed_addr_t(iss::DEBUG_WRITE, traits::MEM, pseg->get_virtual_address()), fsize, reinterpret_cast(seg_data));
+ // TODO: fix ELFCLASS like:
+ // if ( reader.get_class() != ELFCLASS32 ) throw std::runtime_error("wrong
+ // elf class in file");
+ if (reader.get_type() != ET_EXEC) throw std::runtime_error("wrong elf type in file");
+ // TODO: fix machine type like:
+ // if ( reader.get_machine() != EM_RISCV ) throw std::runtime_error("wrong
+ // elf machine in file");
+ for (const auto pseg : reader.segments) {
+ const auto fsize = pseg->get_file_size(); // 0x42c/0x0
+ const auto seg_data = pseg->get_data();
+ if (fsize > 0) {
+ this->write(
+ typed_addr_t(iss::DEBUG_WRITE, traits::MEM, pseg->get_virtual_address()), fsize,
+ reinterpret_cast(seg_data));
}
}
- for (const auto sec :reader.sections ) {
- if(sec->get_name() == ".tohost"){
- tohost=sec->get_address();
- fromhost=tohost+0x40;
+ for (const auto sec : reader.sections) {
+ if (sec->get_name() == ".tohost") {
+ tohost = sec->get_address();
+ fromhost = tohost + 0x40;
}
}
return;
@@ -624,451 +560,426 @@ void riscv_hart_msu_vp::load_file(std::string name, int type) {
}
}
-template
-iss::status riscv_hart_msu_vp::read(const iss::addr_t& addr, unsigned length, uint8_t* const data){
+template
+iss::status riscv_hart_msu_vp::read(const iss::addr_t &addr, unsigned length, uint8_t *const data) {
#ifndef NDEBUG
- if(addr.type& iss::DEBUG){
- LOG(DEBUG)<<"debug read of "<::MEM:{
- if((addr.type&(iss::ACCESS_TYPE-iss::DEBUG))==iss::FETCH && (addr.val&0x1) == 1){
- fault_data=addr.val;
- if((addr.type&iss::DEBUG))
- throw trap_access(0, addr.val);
- this->reg.trap_state=(1<<31); // issue trap 0
+ switch (addr.space) {
+ case traits::MEM: {
+ if ((addr.type & (iss::ACCESS_TYPE - iss::DEBUG)) == iss::FETCH && (addr.val & 0x1) == 1) {
+ fault_data = addr.val;
+ if ((addr.type & iss::DEBUG)) throw trap_access(0, addr.val);
+ this->reg.trap_state = (1 << 31); // issue trap 0
return iss::Err;
}
try {
- if((addr.val&~PGMASK) != ((addr.val+length-1)&~PGMASK)){ // we may cross a page boundary
+ if ((addr.val & ~PGMASK) != ((addr.val + length - 1) & ~PGMASK)) { // we may cross a page boundary
vm_info vm = decode_vm_info::XLEN>(this->reg.machine_state, csr[satp]);
- if(vm.levels!=0){ // VM is active
- auto split_addr = (addr.val+length)&~PGMASK;
- auto len1=split_addr-addr.val;
+ if (vm.levels != 0) { // VM is active
+ auto split_addr = (addr.val + length) & ~PGMASK;
+ auto len1 = split_addr - addr.val;
auto res = read(addr, len1, data);
- if(res==iss::Ok)
- res = read(iss::addr_t{addr.type, addr.space, split_addr}, length-len1, data+len1);
+ if (res == iss::Ok)
+ res = read(iss::addr_t{addr.type, addr.space, split_addr}, length - len1, data + len1);
return res;
}
}
- phys_addr_t paddr = (addr.type&iss::ADDRESS_TYPE)==iss::PHYSICAL?addr:v2p(addr);
- if((paddr.val +length)>mem.size()) return iss::Err;
- switch(paddr.val){
- case 0x0200BFF8:{ // CLINT base, mtime reg
- uint64_t mtime = this->reg.icount>>12/*12*/;
- std::copy((uint8_t*)&mtime, ((uint8_t*)&mtime)+length, data);
+ phys_addr_t paddr = (addr.type & iss::ADDRESS_TYPE) == iss::PHYSICAL ? addr : v2p(addr);
+ if ((paddr.val + length) > mem.size()) return iss::Err;
+ switch (paddr.val) {
+ case 0x0200BFF8: { // CLINT base, mtime reg
+ uint64_t mtime = this->reg.icount >> 12 /*12*/;
+ std::copy((uint8_t *)&mtime, ((uint8_t *)&mtime) + length, data);
+ } break;
+ case 0x10008000: {
+ const mem_type::page_type &p = mem(paddr.val / mem.page_size);
+ uint64_t offs = paddr.val & mem.page_addr_mask;
+ std::copy(p.data() + offs, p.data() + offs + length, data);
+ if (this->reg.icount > 30000) data[3] |= 0x80;
+ } break;
+ default: { return read_mem(paddr, length, data); }
}
- break;
- case 0x10008000:{
- const mem_type::page_type& p = mem(paddr.val/mem.page_size);
- uint64_t offs=paddr.val&mem.page_addr_mask;
- std::copy(
- p.data() + offs,
- p.data() + offs+length,
- data);
- if(this->reg.icount>30000)
- data[3]|=0x80;
- }
- break;
- default:{
- return read_mem(paddr, length, data);
- }
- }
- } catch(trap_access& ta){
- this->reg.trap_state=(1<<31)|ta.id;
+ } catch (trap_access &ta) {
+ this->reg.trap_state = (1 << 31) | ta.id;
return iss::Err;
}
- }
- break;
- case traits::CSR:{
- if(length!=sizeof(reg_t)) return iss::Err;
- return read_csr(addr.val, *reinterpret_cast(data));
- }
- break;
- case traits::FENCE:{
- if((addr.val +length)>mem.size()) return iss::Err;
- switch(addr.val){
- case 2: // SFENCE:VMA lower
- case 3:{// SFENCE:VMA upper
+ } break;
+ case traits::CSR: {
+ if (length != sizeof(reg_t)) return iss::Err;
+ return read_csr(addr.val, *reinterpret_cast(data));
+ } break;
+ case traits::FENCE: {
+ if ((addr.val + length) > mem.size()) return iss::Err;
+ switch (addr.val) {
+ case 2: // SFENCE:VMA lower
+ case 3: { // SFENCE:VMA upper
auto status = csr[mstatus];
- auto tvm = status&(1<<20);
- if(this->reg.machine_state==PRIV_S & tvm!=0){
- this->reg.trap_state=(1<<31)|(2<<16);
- this->fault_data=this->reg.PC;
+ auto tvm = status & (1 << 20);
+ if (this->reg.machine_state == PRIV_S & tvm != 0) {
+ this->reg.trap_state = (1 << 31) | (2 << 16);
+ this->fault_data = this->reg.PC;
return iss::Err;
}
return iss::Ok;
}
}
- }
- break;
- case traits::RES:{
+ } break;
+ case traits::RES: {
auto it = atomic_reservation.find(addr.val);
- if(it!= atomic_reservation.end() && (*it).second != 0){
+ if (it != atomic_reservation.end() && (*it).second != 0) {
memset(data, 0xff, length);
atomic_reservation.erase(addr.val);
} else
memset(data, 0, length);
- }
- break;
+ } break;
default:
- return iss::Err; //assert("Not supported");
+ return iss::Err; // assert("Not supported");
}
return iss::Ok;
}
-template
-iss::status riscv_hart_msu_vp::write(const iss::addr_t& addr, unsigned length, const uint8_t* const data){
+template
+iss::status riscv_hart_msu_vp::write(const iss::addr_t &addr, unsigned length, const uint8_t *const data) {
#ifndef NDEBUG
- const char* prefix = addr.type & iss::DEBUG?"debug ":"";
- switch(length){
+ const char *prefix = addr.type & iss::DEBUG ? "debug " : "";
+ switch (length) {
case 8:
- LOG(DEBUG)<::MEM:{
- phys_addr_t paddr = (addr.type&iss::ADDRESS_TYPE)==iss::PHYSICAL?addr:v2p(addr);
- if((paddr.val +length)>mem.size()) return iss::Err;
- switch(paddr.val){
+ switch (addr.space) {
+ case traits::MEM: {
+ phys_addr_t paddr = (addr.type & iss::ADDRESS_TYPE) == iss::PHYSICAL ? addr : v2p(addr);
+ if ((paddr.val + length) > mem.size()) return iss::Err;
+ switch (paddr.val) {
case 0x10013000: // UART0 base, TXFIFO reg
case 0x10023000: // UART1 base, TXFIFO reg
- uart_buf<<(char)data[0];
- if(((char)data[0])=='\n' || data[0]==0){
- // LOG(INFO)<<"UART"<<((paddr.val>>16)&0x3)<<" send '"<>16)&0x3)<<" send
+ // '"<::CSR:{
- if(length!=sizeof(reg_t)) return iss::Err;
- return write_csr(addr.val, *reinterpret_cast(data));
- }
- break;
- case traits::FENCE:{
- if((addr.val +length)>mem.size()) return iss::Err;
- switch(addr.val){
+ } break;
+ case traits::CSR: {
+ if (length != sizeof(reg_t)) return iss::Err;
+ return write_csr(addr.val, *reinterpret_cast(data));
+ } break;
+ case traits::FENCE: {
+ if ((addr.val + length) > mem.size()) return iss::Err;
+ switch (addr.val) {
case 2:
- case 3:{
+ case 3: {
ptw.clear();
auto status = csr[mstatus];
- auto tvm = status&(1<<20);
- if(this->reg.machine_state==PRIV_S & tvm!=0){
- this->reg.trap_state=(1<<31)|(2<<16);
- this->fault_data=this->reg.PC;
+ auto tvm = status & (1 << 20);
+ if (this->reg.machine_state == PRIV_S & tvm != 0) {
+ this->reg.trap_state = (1 << 31) | (2 << 16);
+ this->fault_data = this->reg.PC;
return iss::Err;
}
return iss::Ok;
}
}
- }
- break;
- case traits::RES:{
+ } break;
+ case traits::RES: {
atomic_reservation[addr.val] = data[0];
- }
- break;
+ } break;
default:
return iss::Err;
}
return iss::Ok;
- } catch(trap_access& ta){
- this->reg.trap_state=(1<<31)|ta.id;
+ } catch (trap_access &ta) {
+ this->reg.trap_state = (1 << 31) | ta.id;
return iss::Err;
}
}
-template
-iss::status riscv_hart_msu_vp::read_csr(unsigned addr, reg_t& val){
- if(addr >= csr.size()) return iss::Err;
+template iss::status riscv_hart_msu_vp::read_csr(unsigned addr, reg_t &val) {
+ if (addr >= csr.size()) return iss::Err;
auto it = csr_rd_cb.find(addr);
- if(it == csr_rd_cb.end()){
- val=csr[addr&csr.page_addr_mask];
+ if (it == csr_rd_cb.end()) {
+ val = csr[addr & csr.page_addr_mask];
return iss::Ok;
}
- rd_csr_f f=it->second;
- if(f==nullptr)
- throw illegal_instruction_fault(this->fault_data);
+ rd_csr_f f = it->second;
+ if (f == nullptr) throw illegal_instruction_fault(this->fault_data);
return (this->*f)(addr, val);
}
-template
-iss::status riscv_hart_msu_vp::write_csr(unsigned addr, reg_t val){
- if(addr>=csr.size()) return iss::Err;
+template iss::status riscv_hart_msu_vp::write_csr(unsigned addr, reg_t val) {
+ if (addr >= csr.size()) return iss::Err;
auto it = csr_wr_cb.find(addr);
- if(it == csr_wr_cb.end()){
- csr[addr&csr.page_addr_mask] = val;
+ if (it == csr_wr_cb.end()) {
+ csr[addr & csr.page_addr_mask] = val;
return iss::Ok;
}
- wr_csr_f f=it->second;
- if(f==nullptr)
- throw illegal_instruction_fault(this->fault_data);
+ wr_csr_f f = it->second;
+ if (f == nullptr) throw illegal_instruction_fault(this->fault_data);
return (this->*f)(addr, val);
-
}
-template
-iss::status riscv_hart_msu_vp::read_cycle(unsigned addr, reg_t& val) {
- if( addr== mcycle) {
+template iss::status riscv_hart_msu_vp::read_cycle(unsigned addr, reg_t &val) {
+ if (addr == mcycle) {
val = static_cast(this->reg.icount);
- }else if(addr==mcycleh) {
- if(sizeof(typename traits::reg_t)!=4) return iss::Err;
- val = static_cast((this->reg.icount)>>32);
+ } else if (addr == mcycleh) {
+ if (sizeof(typename traits