From 20660d52ab2e1743ec48b603615c0c3be5af72dd Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 20 Jul 2025 12:10:04 +0200 Subject: [PATCH 01/69] adds VSCode configuration --- .vscode/extensions.json | 10 ++++++++++ .vscode/launch.json | 30 ++++++++++++++++-------------- .vscode/settings.json | 14 ++++++++------ src/vp/system.h | 2 +- 4 files changed, 35 insertions(+), 21 deletions(-) create mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..c15ab36 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + "recommendations": [ + "ms-vscode.cpptools-extension-pack", + "llvm-vs-code-extensions.vscode-clangd", + "eclipse-cdt.cdt-gdb-vscode", + "eclipse-cdt.memory-inspector", + "eclipse-cdt.peripheral-inspector", + + ] +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 0cf3870..cf58568 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,16 +5,18 @@ "version": "0.2.0", "configurations": [ { - "type": "gdb", + "type": "gdbtarget", "request": "attach", "name": "Attach-to-gdbserver", - "executable": "./fw/hello-world/hello", - "target": ":10000", - "remote": true, + "program": "./fw/hello-world/hello", + "imageAndSymbols": { + "symbolFileName": "./fw/hello-world/hello" + }, + "target": { + "port": "10000" + }, "cwd": "${workspaceRoot}", - "valuesFormatting": "prettyPrinters", - "gdbpath": "/opt/riscv/bin/riscv32-unknown-elf-gdb", - "debugger_args": [], + "gdb": "riscv64-unknown-elf-gdb", "presentation": { "hidden": true, "group": "FW Debug", @@ -24,10 +26,9 @@ { "type": "gdb", "request": "launch", - "name": "Launch-VP-with-gdbserver", + "name": "Launch VP with gdbserver", "cwd": "${workspaceRoot}", - "valuesFormatting": "parseText", - "target": "./build/src/tgc-vp", + "program": "${workspaceFolder}/build/Debug/src/riscv-vp", "arguments": "-f fw/hello-world/hello -g 10000", "presentation": { "hidden": true, @@ -38,16 +39,17 @@ { "type": "gdb", "request": "launch", - "name": "VP-Debug", + "name": "Launch VP", "cwd": "${workspaceRoot}", - "program": "${workspaceFolder}/out/build/Debug/src/riscv-vp", - "arguments": "--isa ? -f fw/hello-world/hello" + "program": "${workspaceFolder}/build/Debug/src/riscv-vp", + "arguments": "--isa tgc5c -f fw/hello-world/hello", + "openGdbConsole": true }, ], "compounds": [ { "name": "FW-Debug", - "configurations": ["Launch-VP-with-gdbserver", "Attach-to-gdbserver"] + "configurations": ["Launch VP with gdbserver", "Attach-to-gdbserver"] } ] } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index c0a759c..1e6291f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,13 +5,15 @@ "debug.allowBreakpointsEverywhere": true, "editor.rulers": [ { - "column": 120, + "column": 140, "comment": "clang-format" } ], - "cmake.configureArgs": [ - "--preset", - "Debug", - "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON" - ] + "clangd.arguments": [ + "--pretty", + "--background-index", + "--compile-commands-dir=${workspaceFolder}/build" + ], + "cmake.copyCompileCommands": "${workspaceFolder}/build/compile_commands.json" + } \ No newline at end of file diff --git a/src/vp/system.h b/src/vp/system.h index 3ae7b54..c7674c1 100644 --- a/src/vp/system.h +++ b/src/vp/system.h @@ -67,7 +67,7 @@ private: sc_core::sc_signal core_int_s{"core_int_s"}; void gen_reset(); -#include "../vp/gen/PipelinedMemoryBusToApbBridge.h" +#include "../vp/gen/PipelinedMemoryBusToApbBridge.h" // IWYU pragma: keep }; } // namespace vp From 084d8e0fd62c9edf43f218260efea1edd1e37960 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Mon, 28 Jul 2025 19:14:54 +0200 Subject: [PATCH 02/69] updates dbt-rise submodules --- .vscode/launch.json | 2 +- Modulefile | 2 +- dbt-rise-core | 2 +- dbt-rise-riscv | 2 +- scc | 2 +- src/CLIParser.cpp | 8 ++------ 6 files changed, 7 insertions(+), 11 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index cf58568..fd317ab 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -42,7 +42,7 @@ "name": "Launch VP", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "--isa tgc5c -f fw/hello-world/hello", + "arguments": "-v TRACEALL --isa tgc5c -f fw/hello-world/hello", "openGdbConsole": true }, ], diff --git a/Modulefile b/Modulefile index c04143a..d5cc444 100644 --- a/Modulefile +++ b/Modulefile @@ -12,4 +12,4 @@ if { $distro == "CentOS" && ![info exists ::env(PROJECT)] && ![info exists ::env puts stderr "Don't forget to execute 'scl enable devtoolset-7 llvm-toolset-7 bash'" } -module load tools/gcc-riscv64-unknown-elf/13 tools/cmake/3.28 tools/utilities \ No newline at end of file +module load tools/gcc-riscv64-unknown-elf/13 tools/cmake/3.28 tools/utilities tools/vscode diff --git a/dbt-rise-core b/dbt-rise-core index 2627112..b0fd676 160000 --- a/dbt-rise-core +++ b/dbt-rise-core @@ -1 +1 @@ -Subproject commit 2627112886005ba7e7415972bd9e76424c219e91 +Subproject commit b0fd6762be2a39e4b05667f71778be4fb1bd6019 diff --git a/dbt-rise-riscv b/dbt-rise-riscv index a13689b..c000fd6 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit a13689b3826b4f7b27fa400208599184e3956580 +Subproject commit c000fd68059681b639c8ec79ef7f9b2b2ef5ea91 diff --git a/scc b/scc index 3179717..a6cdc7a 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit 3179717f71478bf25f11a3961808fa7920ae7932 +Subproject commit a6cdc7aeadb5024829042213b331b14bd718abb1 diff --git a/src/CLIParser.cpp b/src/CLIParser.cpp index 8109434..fa2ddea 100644 --- a/src/CLIParser.cpp +++ b/src/CLIParser.cpp @@ -41,14 +41,10 @@ CLIParser::CLIParser(int argc, char* argv[]) auto log_level = vm_["verbose"].as(); auto log_level_num = static_cast(log_level); LOGGER(DEFAULT)::reporting_level() = logging::as_log_level(log_level_num > 6 ? 6 : log_level_num); - ; - LOGGER(DEFAULT)::print_time() = false; - LOG_OUTPUT(DEFAULT)::ostream() = &std::cout; LOGGER(connection)::reporting_level() = logging::as_log_level(log_level_num > 4 ? log_level_num - 1 : log_level_num); - ; - LOGGER(connection)::print_time() = false; - LOG_OUTPUT(connection)::ostream() = &std::cout; + LOGGER(dbt_rise_iss)::reporting_level() = + logging::as_log_level(log_level_num > 4 ? log_level_num - 1 : log_level_num); /////////////////////////////////////////////////////////////////////////// // configure logging /////////////////////////////////////////////////////////////////////////// From 9db8c39925f87f3465f54c2e958727aa82bf13e6 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Wed, 30 Jul 2025 05:56:41 +0200 Subject: [PATCH 03/69] fixes some settings and comments --- .clang-format | 2 +- .envrc | 4 +++- pysysc/tgc-vp-toplevel.py | 9 +++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.clang-format b/.clang-format index 48c14b9..a2683b8 100644 --- a/.clang-format +++ b/.clang-format @@ -38,7 +38,7 @@ BreakBeforeTernaryOperators: true BreakConstructorInitializersBeforeComma: true BreakAfterJavaFieldAnnotations: false BreakStringLiterals: true -ColumnLimit: 120 +ColumnLimit: 140 CommentPragmas: '^( IWYU pragma:| @suppress)' ConstructorInitializerAllOnOneLineOrOnePerLine: false ConstructorInitializerIndentWidth: 0 diff --git a/.envrc b/.envrc index bcdccba..032d31f 100644 --- a/.envrc +++ b/.envrc @@ -6,6 +6,8 @@ if [ $distro == "CentOS" ]; then elif [ $distro == "Rocky" ]; then . /opt/rh/gcc-toolset-11/enable fi -module load ./Modulefile +if has module; then + module load ./Modulefile +fi layout python3 [ -f .envrc.$USER ] && . .envrc.$USER diff --git a/pysysc/tgc-vp-toplevel.py b/pysysc/tgc-vp-toplevel.py index b1a3b9f..bf8bee0 100755 --- a/pysysc/tgc-vp-toplevel.py +++ b/pysysc/tgc-vp-toplevel.py @@ -33,17 +33,18 @@ pysysc.load_systemc() ############################################################################### scc.load_lib(project_dir) ############################################################################### -logging.debug("Loading TGC-VP Peripherals libs") +logging.debug("Loading RISCV-VP Peripherals libs") pysysc.add_include_path(os.path.join(project_dir, 'vpvper')) pysysc.add_library('sifive.h', 'libvpvper_sifive.so', project_dir) +pysysc.add_library('sifive.h', 'libvpvper_minres.so', project_dir) ############################################################################### logging.debug("Loading TGC-ISS") -pysysc.add_include_path(os.path.join(project_dir, 'tgc-iss/dbt-rise-tgc/incl/sysc')) -pysysc.add_library('core_complex.h', 'libdbt-rise-tgc_sc.so', project_dir) +pysysc.add_include_path(os.path.join(project_dir, 'iss/dbt-rise-riscv/incl/sysc')) +pysysc.add_library('core_complex.h', 'libdbt-rise-riscv.so', project_dir) ############################################################################### # Include section ############################################################################### -cppyy.include(os.path.join(project_dir, 'src/tgfs_vp/rst_gen.h')) +cppyy.include(os.path.join(project_dir, 'src/vp/rst_gen.h')) ############################################################################### # configure ############################################################################### From 7327ca4fb0690240454acc15c2edc052baeffbd2 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Wed, 30 Jul 2025 06:39:17 +0200 Subject: [PATCH 04/69] updates memory map and prebuilt fw --- .vscode/launch.json | 8 ++++---- fw/hello-world/.gitignore | 6 +++--- fw/hello-world/Makefile | 6 +++--- fw/hello-world/hello.elf | Bin 0 -> 66276 bytes fw/hello-world/prebuilt/hello.elf | Bin 64360 -> 66276 bytes scc | 2 +- src/vp/system.cpp | 6 +++--- 7 files changed, 14 insertions(+), 14 deletions(-) create mode 100755 fw/hello-world/hello.elf diff --git a/.vscode/launch.json b/.vscode/launch.json index fd317ab..0dd1d4f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,9 +8,9 @@ "type": "gdbtarget", "request": "attach", "name": "Attach-to-gdbserver", - "program": "./fw/hello-world/hello", + "program": "./fw/hello-world/hello.elf", "imageAndSymbols": { - "symbolFileName": "./fw/hello-world/hello" + "symbolFileName": "./fw/hello-world/hello.elf" }, "target": { "port": "10000" @@ -29,7 +29,7 @@ "name": "Launch VP with gdbserver", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "-f fw/hello-world/hello -g 10000", + "arguments": "-f fw/hello-world/hello.elf -g 10000", "presentation": { "hidden": true, "group": "FW Debug", @@ -42,7 +42,7 @@ "name": "Launch VP", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "-v TRACEALL --isa tgc5c -f fw/hello-world/hello", + "arguments": "-v DEBUG --isa tgc5c -f fw/hello-world/hello.elf", "openGdbConsole": true }, ], diff --git a/fw/hello-world/.gitignore b/fw/hello-world/.gitignore index ebea2da..3c1acc1 100644 --- a/fw/hello-world/.gitignore +++ b/fw/hello-world/.gitignore @@ -1,3 +1,3 @@ -/hello -/hello.dis -/firmware.map +/*.elf +/*.dis +/*.map diff --git a/fw/hello-world/Makefile b/fw/hello-world/Makefile index c7efb06..376bd71 100644 --- a/fw/hello-world/Makefile +++ b/fw/hello-world/Makefile @@ -4,13 +4,13 @@ C_SRCS = $(wildcard *.c) HEADERS = $(wildcard *.h) CFLAGS += -O0 -g -BOARD=tgc_vp -LINK_TARGET=link +BOARD=riscv_vp +LINK_TARGET=flash RISCV_ARCH:=rv32imc RISCV_ABI:=ilp32 LDFLAGS := -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -compiler := $(shell which riscv32-unknown-elf-gcc) +compiler := $(shell which riscv64-unknown-elf-gcc) TOOL_DIR=$(dir $(compiler)) BSP_BASE = ../bsp diff --git a/fw/hello-world/hello.elf b/fw/hello-world/hello.elf new file mode 100755 index 0000000000000000000000000000000000000000..416242266bdf2f932188900192ae481d1a8ac09a GIT binary patch literal 66276 zcmeFa3w%`7wLiYkoS8W@c_))6A`S!sB9A~o6a+#D2``oM6hy`_Ngx_R%!7wj-Z4OZ zVXSC>v~bm0>-Fbtjn&qA6)l4G*IH{4thLq_mD=8`-WEj>!vFi-`|NXOl7M3E?|1*7 zOZ1$x*V=2Xz4lsbuf5M>HftwMFEb27=s%D6yRf0~2q34Q6cQdG!onv8h#ZkEOd;xT zF47!AOty<&T*)i>({KW?@c0Aws@M7q+%(_F%e$=5j`+etwv>#-Dkd~HXOjM~eLT&- z@UDdgS3Q1J*`foBsv{pq8b!F!*kz>mc}b+@7u?@r_TSU7ZON0{cT61D(opKF*s#v6 z%kTSGOueQw`)}&F`)7veOs(tR_#8=ZOw^Q=^x7#T{SZ2B{9fzHQ){IuD2-)G%YXQA zNB5d3>V2OpZ{Nu{d5^@(^S{*R7s_h+;m11i`|Ro1SWwy#I_MYc%b#q0y2b3br=x1r z#{S+8RsP{9L;S6Hv9#*N*ZJS<^TyQIFMDm~fw}t^yt3%!bt1pu{^Q^|e$V)aTE~53 z{j|2cL}5%J=GC#lY+XOKeaRFff6$TR?T6qVK>FO99`^9wZO^xDoY##IFbXw=nsdFZv@r2mf^D}#q{?4NzJ1kY9%Fk zo^Da&v+9Kp(ypGN%I~1O>+<#G<65*o+$g8?ZD&UStf0pTE#i!*vm?MBrC;3$P_g&- z{%N~)%*JOq)V$ESrfdFK{8IHV)`?F?s4+V9Rqzk@(VD(6kyaB?7>XCZru7wMb-mi^yZ?A zUJ&iAkBfHyC*twe{Jw945@WmHCQ$F`ApiL>S!+VNe{Y{XBA`Zk%Qrp{FQ*&g(c(T* zb0gi&h>GI7TR#v#NOiMbEJc1_JFjB|M1OC2V8xEm(WB%4cX>4PsPK*7vP)yWEiofU z`H;8vbUa~+btiH@y=`2}gz*6YJxdyI zw+b6)6k;~6wBe_^HY&L1dEtK~`$`WbUjWV%1p)OdB0{i{)X!cR@qe-l58Bcud zdZzTmp}M2THuf()k-n=1E0afO^s!epI{Hj-oL!mF3TMaP|LyU|Xx%Zf?dZ`|cSPy9 zRCPaz8Evs6ha;tGd_KnTuw5)SbA=+a=(9^cz3s$7ax1wy;$ykv#vNw;{Jvf}_NEMY zsP%{cXCp@=u>E#%Ox0j4kK>A`BY)jtfjW+_PInHxUn)JpyF<+AD~}5Dos0XeKmMKc z>AOzMiye7x&d@6X6L)wU`(fqLZ%@bb7oxpW+(ERIN3ElRt!$AigO>92UA*5=cgf0o zDr0^iX7t#egY`jct8e3jmM|YI7n{p}QGWZh{nPHgJbysuiTr`y6ZwPgKb}7XIVgG=0u8_SP$oXE*Xd1Lw89b2ujHGE z;yypJZ2A6<@0Lg3gEvuv)+Qt6V#px0QbPHlYqR!r_+SCH^!<^l1-8c0v!8KoqqU4( z-Dxi0q`a{MTj8;+qllV4b`C z2iBvK(xF+$Js2f&?A}x^<1zDRJ0_+-*cGQ^(_OcJSqa0g^Z%jG@7Li8#r;RnizApf zkK_;7eeuew&VL*beB3^a5Hj(c?oCj$&R07BNPd=J)m; zb)k(9>^q9c`sko&v+8|$yYQsWd~&u$1f+`^yD~L84&K#+WjvVKfc{8w?urdMGK6& zPY+Exig8i;8Q@Qgthb7v+#a&t@+jKU&!8c+ky`aR(vggeQ!4X}w7;~AvVST20tzLm zwBu0iQF*8G_>6+t+4FCjUjz3JO8Q1YRdEPDL}c%?modDS}Z^5Tg;#$OCCrI&oz@g6dQ7t%}dbnyh{xqRe& z$mxjw!D7ah?W(a$Y`gVgF)6+;pJ0A}m%1iD_%9M3jP<;VV$CN^nO$rt>#PmipOutu zoBb}yFSs9>aTDgS$E2P4tYf2X>(!SG#+Y$?KkPwzSWBNFdsKP?ZDO?a{weP4@oe~& z*(LM&Ea$42yPD~{)Ar2Xll#KL7xD*rk*_oH#=`626K0Iz6Welhub;jNt)EywN#%%s zcV0J)YZ=a|6`dsJ4|?o)XPMAU&Y4m+MipZ2#J}XoyC~)r3y}}`n-B%I{M$zklRWD% zM8J!(J%{QRA8J`&W|SF|F5QJ^6?+Pv8`W2YpTN=9y6K{jchg1Z-aK`;e{XP8+onwy z8B?M;TRf~Km7>@K3a9qmE%NEm9i^Tre73ct*caU9-LU<=Cv@r4XC|aS(O-o7?4g8E z>prxx=c2ru3!YPL?7JxaZ9ZSRLq1`;F|#eFuXtelj)@z#zk^XF#K6t>97dc4^256@ z+latx6HiROaZdEvKYQD9`-^BG;3?XeW90Y!S-|{mYp$=XDEnRUwOjJ<|6Xo>-`}Kd zDU0U3CNN*+{`%JZ2M*@?tk-_Fcl*uzj7b~Tt-kKEmuCKA?u!dv;GJs0D^p)yw0Gdv zN4EH;ZR{(=`WJQ=hk{2=CU^_(j9wL#YoI%3d*=Ub%HpZ7Of8xA=rlexk8TMfc1qKt zEu)MZ^RCPM?K7_xFD$+>Cz{>g%)hs<@zKGJ4{XXU%DKSU_^+kn(_6Q^zhV1p#q8Ii zUMoL6)OzIj*PcO66n}hX;{$tgF=7JEw;6|LB5%C+%n+P^{mkm?=DyhW`XqxIQr`tH zwB7l<@E@SIZO4wS9k^-uHy+>e!*!w8KQf~06MD5-AFhqI9P4wdw{705#`Cv5;aw+w ze{(2rq-fjPWB2-Lp@UP5(49XQSPQKkwyy2BpBhnN^^siW(Sj6k{myvywo%}^>gG0o z&hECHF~TT+{9A2zT_ApY>-lA&mL4KH;Xq-qtbNjGBRcg!-xJxsvS{;xf(g-3%HL0h z<^_$m*DRxG_0Nr>llzQz>pinQ<**qd?xq3eio1s2-R{pZqm8c_-@2=9X22*~^@7oU zbe|EL>otnj>@i9Lh@^UQSt1OacvVS+vZtD zTk4UMh-DP)e6}*Q>Bz~7+uHxWQIuHift8}&>@bUNeF+*LFpK;jn{9tEjfT4( z-5LG+uZ#!2Q*`t;p=j^AtJn6?ZS7BdEWWk9=)yzd@wt zvR8`vH%EWx7omeWqU9S`-PV?K#Q5!PzI6|6o!gT4P|Pm5oFn4BXQaGyf?|DXTf&EHw@mwG`})%LQ(LCJ_tSw}h`D9jvp;QLQfYku zS6O@dv*!5C|LKAjW6(pb zZ8yy`t}B-<&O3+}i*i0giDbbXnxd{X=Ct;8gk&;KdM@Bz`b z!awWzcSEcEeWT|EGD0hE3LFyt*I#PEi1r-JxTP$ba4@5#ESh*QBjo>Re00|CK6VRc z+53&(-x``XLJYT9I$Nku{=+?angUeoNIn=uM&)oxcN0#OMPGc^8}hv~q3FP2(Vl(3DEj92#IJ8H8o5ifAASIq zdt0=9yi%-xsqN#VBE2lSc`sI`<)Y~Ej}aq}x3*=sis-NW-nQ(6#w{Cve{1qaqwJO^ zTIO!MH53q@_PP6oQ5N-EM#%rp#G>py;;LJVF5C^tdofz8o-oSSmxW+Y-!r4E0N%)d zxOV-dtS4ArU-rvqSbM2F`^qkUB6M()F)EOT?E1+`W`&Udt?~bP+e0^nF`O?~+$Pu?%qc9`1`Gx1(w-(L$2rah`cxb!%yd{cS z9w^?h4qh_;Sbk{DJI9|b|LrsUBB87z+O)i(rlK}n(-`hoiLd>Im{eC8US1upT2&Qo zZmL;cM_gr9bwzV+Q+R1bU1e=mgQTmeYpQB!Xs(aNHZ@e#vogB8p(fA<4L=YxN4MNvf+AMum1u^tgQd8W%2RJlWBIpd!pQ(o*&!&X5DNY3vGJB zr8dv>7~C3^VP^dGEf$8yW8%+i|M@!o`9J5+`Un34|BwG}5F$LG9HwZfX^gHA##j`+ zX}*RPMZ;@`*AI&<8(v=+iSl%PO|-E=6{@T1qE)B{a@n%x+F|vDB48vWmQS2GIy@lS zu)MLcY5DTn!IzbXhYcBi;gG`f!^4V(3?EV`{sieh;T1!0#jk%pOG)O%{_PG5=i$pA zAuhz>K{?e^LOOX8K30XzB*XLv@v_wP1Oqr5F=tQE8-r10o;6-!Jd(yOdu^`M(fhhc zPO&jcnsWvg9eNubI+I>bWiRCky}aG-r6=e}MK8a~@;^_q(o@TKEgGx8*}dhyf2_VDxJ%24O< zJmoQgu|w>0I$&M{cAr^K`{dd9)Ob9kkQ(X)nG%vgMYAv=lPdxBylTIgvX59mQ%BIM z$roj9QwT%R<3}BP#n!2HHstZDwZsEoq-n`dPL$Y+Wor`vOs(iYCcu!*oq*&=Eg2uM zHMD?C#S49quI|Ba#+kgDPL;gy(bcJwmz<`Peu-QZlem5h(8H4{E4oWz?=z3NDXchn zHii99NMXLOnZFit0_RlAQPbBRHREt){EoD*8Mrczb(~K@oO6uN1)e#BD=)@>jZMcD z80fuTUx|6YS}8FFG4vDVa8cqeu*($Xvxf?sz@YH@uzG5g!ZUzjg5XdjC1zY_6~$yh z#W>ul@Od_D0j6T)<*?-ngu^)qn2Pp;43BxEl-JXiNBSgnw-%Q+ARn?YIDcplPCV}T zM^+X|ADwD|%8Kp=Xs0#C?xeE=^nb(vEi+$M19X-h&sDfGewX3Oc%N!|Wem@=>!Wu4 zHMnwIT&J!Wh-1x%)IiL1hJ?CVQA0tI>!mh_LSD=;$#SA>o+pJ4B*GRd=vQCxDW9a(Xbi{cuo02EVw4}V) zxgPS>pk0Q+${BUisRk`>7lgpVO6XevIg9$v0mhIguJ=7$>YJP=P2U*Y;*L%e;T*Zx zV&`cVq)*jggWcfipBb@1^~`8K8*l6zp8;ge=KC#LH(H66ol(!^|)-INQ5 zAKI9~FqI}P>Y+H){HCq+nfhiI6_%&Yz6nFkp6Mc-E0>Wf z^Q*wpA)JVyp@M^D1ONprfH?4(#ET zGcU&vXJFH|7gvxRBj+o7`TE#+M5K)QQ8rv?Uz2f#eL;;ggN6%L^iK{GIrpLD1&)11 zc&Sm^Lss7)r^XPu6cdc$XPN;qjBz{GoHR!DsX|LWHex_Cq_jbt$3_W$K4g@qRFpi@ zWi*X?Y{VGz=JKAMfo4BN%7T4TG7xQvcxYfNJ;~M&Q5D}enrRwQEL>o_l`C&O;WI~Q zdusP{MMG0$*;2`yVV6nI*e1>n3tu5%;)jEeej1M}6LF#KA1-g$o)=frG2U5EScRd2 zDUV@yp)F6}XD~cL53EioTr3UxLR9_jNq~1BVQ?iQzjCbQ*nQN`y=Vir9RwY9O2-0- zeIXzF8iX8P^-?SqLxp|Pw&G(N_D$c_@UE2gMe0iH(GBPZiuxH44eTYF8u6})LC98; zZRu%%sg3>c2P;PPFvvm*>3Y>G#it)W^#YCd zI<3Lki0zMoT*@auuar;P6dSLXnAw0SHxYE~JrfAqBTPQtDYBmZB0h{h>xW+Y0ig1N zYFB4Q-4A+8>8iDuAwLI8f$QajGq z$_h6~YHCfX1-2Fe`$>k@f^p7zJ>N4H80Um}iu@1Tj--k{Z?2dIeE4-=_bPkUL<=N0T(x*2d<;FwB)J;+1NNpG)M z%#{+GV5Y{^(hi!6{nOkWGi+au9C$!RK3u@4fxhv03~A!oy3Q*JQwpE)u-=~45H)VJ z(hG#yGJU6Dso7H!y;%2=ax){={Mfvr&6LwgKmW!dSr{892s3zL)b=#@mXb*-#m zDy1TZc}yAVd>|-+Yb0b3oOR4GH|cogGc{U>?9ABqGc!f4^pVfMXakNsUdao|;KQ7} z++I0da;iDm?2Re)EgXZf@RQ3t??FI@JgorESj!5ZfthxH9%kB$loqJ)!Ru>-EHF^e zJ9HUM7TIf}QKxP4bx7@p1%Yf*Jv5h3&gHBxTYHnO^>SK66OfLc+b!Q93+KUAbdh1+ zAPq>EMld;!Xz&CEBQfc*VQS(|fXJS#r9er~8MS+Q^i%~Fvi(ZwH!irrq`a%Anoh`| z)Swem1#m19R505i+f!#^wpU?5L!Ml-mG*$ydVG%AdfM5PW|MY^ff>K7k29lAHAKP~ ze%Uh^}EYDoR#(3CPf2H)f9}^vwwdhJGBjfz@6pQHk?o{E5ET?1PA%ASFyXn|3)TW_VUQpb-6 zFf?Ak%#c?}MTAYIc=-mI%M7P27QF5NQB=GQ)Kt`rV)Rl~I>>J>lRa|`81$Qo660iA zPK~7PiQLI67ie*UkG2`2gl3l|8=ASxKJ$gQbso zl3}*t9E4eKCqiv2aw$Oyol+#EaQ0b6*O}sFWGR2gN$Vnq@wLiUAs|g;0H&!-tWdcc zh=mzPonTrE7Ij(yt5ZhLY#(CC*(DdJN=)8v3DW`SY;W5oRoflzeA`tZlsOZ6uxPh` zD$B*&04+NDekHoQIpt<9#hs1EjK~Wc_nX2#qeSsUEUj z>EL7#TAq42TMw;Gbt(0#B->2<8jIwJvey#N^@kgsIc*rXRgD4XO1k# zs$60#P2G}P%g5-dwnsN5J|b1Mymjwf>aJFr*A?g*S~;g5#3;8@po>$15|4A~l$0<% zr;u*Ty&b*soe~>SDttAi0?1RUvZN%lguLylG}JD3ov{(^7uYwxC}L5!#+Js16l#3i zYY0?#SK>%l{botE@0Q$AXg|t$^{>&t#rS_vdlH6oF&Yt%^Vk7|WG-(g`% zInKq|kL92POG>m`a-)qNRPtP3p66;qr1H8%D$4l2DB1MCs%1&Ba1D*FP?|FD1*!^X zMQTq`4m?QJEAPnFCW`ihc9gpFiHrO1>>btpFXtU)%YUkOR1;s&I~Z69HrxcLMUuYt zfq#a=eTar`M;_NNY93@sxu1dImQ);Z#i`WMYfmLp$1tNo#X3uhC%&Y{iHl>9DLS{r z_*Xu0OU%1Uo9;5Oi(3ggwQ^!fN&eC$-ZQA@<0cHaQa#mSiMCNav1NC)s(sH33F>Cl z#6un4)2?CHP^q$rd<3B+aow-{*hbs)82A3-1$&nJ%upb=XmnjCVB&voHHyF zJ8nU3>`GAG5UlDmQqkww{^Z>|)xTp6h%kxGuFRP64A-^URd zKVZ}?D3?%5_7F!lODeGRVh4{8Waz;tk5Nni0EYwJ8}ntlCwnIQIJ7a^P|*}!I<#ta^xB~-mp5En(NI+}^wKGp&73rA z=*%gzCe9r^cgE1_l|z?S)z&T_42s%HF=WWl#f|kttLjz^6^%_54NXI4iK@D$hSj)A zx*^e6nxUYtsf*S&S5^&OR#Vqd)i|`WYDG;H*CkbTUyM==U0&Zbv~elas~jqSxi*+T zU5hTQsHuaPXmnW7(23CD@>xSK9x`&M{E^&+BL+9uU0b(&W!>Pa+Ujm`jjJ06JE~Pg zm)6u({aBmL}OE>s$yX|Ffkrgc8aX1htF!7 zI(bss6?I>M`n5HS>9=m(qJD*_g9b5Hi7r6R=DHe`Po*znGP1G(KhuTM&5X)Z^ow+e z^2$zqgAJh5O8hQ(C>%6YONup3JV~6@;;V+%G*&bM(!ATH}D=R9O4UIMpu3Iv6adS;=Ww(w~ zHS#x+gDt*crI$}?@Ku_0=6>Wgd+9l&*HMU!pXGgSYyQctI% z%Q$$%kfI@lLxvX)FDe{1yf98XJJSeTJ(`*7p1GOb=Hlebc(6z9SJQJ!JYB!L%d^t^ zOwNrQPhWJ5e|7o}t%eB@%wLT}JE9_yFA`I(U%o&XFw2OBDok2mSpYc7Mk{J-zmUeK zbf6mKgQL;GNYaC0(u&${M|}KXhQmSrWlYbhKyeRkTwdKYxVnBQez9IzUG(KV*;Smd z#lqN?%bOS1R((0EcNL6yTh(0GSXtfpC8I7zq_V*9f3(j+%ULRV%LSr=#UdA|>M#5q zS;_=7mFRVvh#2EtocQDR9mZUgT%xg%;lnrZ1AtAt52thG51~=u@1Al0AYQ_X+hh3o z5wW=jc<%+d7vthF0v1pnkFT5r9xIEG*T-*p%*iNwFVCwWo!7dTH38o>toa&wj(Gr=04p-r zFF=2+OZdc02;4|1s8Nrfvb9XIrhvZGoa@KvM1k zrF8U;6Cg5bfDciyXWK%>mSD3j&HDjJ`2l~A8c-!BDymu`Qho)_oS&d(G$^WZHFk_Z z3r0iL65+|Yh-J^V>HcdF2AArh8?EtR`PWE}U1@Hoj=>+ofaP<*vs$(K>0 z_^uWyhrpLi=q|9S=I(RYl1Iihm*O;+Ity%pE1Z@NI4pr-aV-VL>y|9+?OZ1(+Eefn1jz9m_R;&BDwd0 z_FOi_KmK;S2Lk>v9RJJ&lBW^~5)E^Qxf$<+^DiS@}6W);{b5y(Et&w?s&NLKbC6~&2^@8V0B&Hmv*5l#VU>`1*A zb&dXq10sBrL@?5<8nM>e01$aD^aiT%YYmY&nW}%?s*w1l$e^EsG)lh}g5(BVjUDYk zdFx3SJ&!dI;LVX>p#qm0jrFJ;ub@hiisvyR(lZ4T`bY`ChJ<{bWBcMuH(_4c^FvFI z)zn|0eooK3fw)4_<7vG}WWbwqlXlA%mx`1hfoNvWtsqjp415O&^U~y1z+^}^JiQd& zwO!a6u2~r%e)$lgLb2Qz%Rme z689sZLhl3QK33M!8Zk6Q^?ABgyId67z+`xmA2^!*(pmcy=zB=^H^FW-R5gkIA+|;J zg5#*}IoX8obqFoESrVS>5N6A%WH-nz0h!9}<3OgT5|%NQB-&F63FTC>9*X41siecF zr;-&8U&aW<=S(Gv?`n}PrxHSUgH1K}za6&Zk#WtXq$sv4M2?(F7C0^OlVYV|U|3vB zf$_Sf0H+e8JaYh;RL0N3m{Do4d`v78CKEf})MR3m zzJ_F}#5Xxq6XL~BaK&>%F^Z-5C&8%1f5%}gcExi_F~(%x3@SCL$nTeB<{vXIPWv&_ z9ql=(7^9{5dN8WYf5H(zy2R0*x!xF=S>lKvj_E)dXJowik&gI&_Qb;GI7h@!ELyaf zi}pCNRKZ7TW%^?@#=l}@l68pH>k<$|F)LI57hIY8Pq{MncegT)omi}{6H7o%EE)Gf zGr39)sM#ffYfd@41k~)J7NywNT=+P37-?C%aS=Yw9Y%U0EA-?cEA-?+z?nQIgUXpa zSmR6{1Tc9dQx8(5*pr7u%-4vR$%Bi}1Xg5b;?vb1q2T)~tZHh#9wLw~mGt_aAdn$} zfbVqzAqgb;_7TXGK$LPP!__QNLpxPhq9T`6Smzq`O$`7Cum;)0sKtY4UvPxVt+Nwf zK|8*LjODU+Y3|jKbQu`)uDM3|lG1es76Ha%j{w6liDBgpW%@xn02!g>-Y1o~Rs^1fn!%62X)dSF|B|R<`k-bumzUbi!n%Wm*FFUzH6ZaeK(%0A zJ65;AENNal^*+0WRGD0#2Q(LKD%+K4HmuWGj!CX0WO5BuL9rwzS5HQAE;z@b!q{D3cRZUU2P>(35TU|3vRf$_R6 zxmGvIOTeQNU{9D==hs*s@jwlAY3-B;zxymMkuYBxcrgkgHW@eG4(dKW@cvJzSQO0z3bA z$*gfnm7_E^sbMeX5xM9z&U8io7;=!CbXoI!T(}QTzYtOFJ>7{<>I}e@aEYo(^`@E z6vSBlz-`vi)mMO7Me)xyvspJuG1m%f0tv4n;Ux~?-yFhgCTPN>Us1c9^xdF5kfJl% z1x|9xxrk+?&_Jj4Y2wvjRF69D2A}Fj)Zxn*q4;Wjk}so#4S2R)Es~f(J;}1c;ZB1) z9LD64aSggFRQ0gqNV0D0R}M>HSX^7~3N;&+s$T;NijV^KYX7(KU2GW_5ogI@r<7B(b(!7{uDf3`_^3;L_ z_pW8~+=H81-+chi6>t&%xQhl``&l~rp^~Se9+DdBA*rDrl48S=)r-utE@8cPKtYD}|9Trzk_`TIPfO;B- zNpe$`@Vt*{W)IH6geb}UL6T{;jU8TOfgWVwB8N+>fn>y>_Hto$Aq9B0RSK~K1)5-9 z0EqhloQrReD7=+S@3@Ry~8K1EU%s3O+UA4RC#q9__lJHSU-IlS#2fdA;v<&ZA zMJY^2{r)%f^Gf{|+xl_O4`#iGzLp)?L0hUFAe&7G_QXxqQ|mpGA2O zJr1#LnB7x6f{DTPsJGa5B?wI~Pdpl4jZfWst*DNB5HAiTfCDVQMhi{)db*5BBX*eDF^-0i?&HcG-9a$yA0 z6^KZhVMo%;1k6e@lD=nKfcu?10IpA90lR0OHI$<6L7}e&-fjoJhj(X)stS;I8&!e0 zsPe1>ovCgzJyXGo2xCA>gCn?ZWSPkU!LhF<@L+hQX!emvj0~+{S2oZ+B{LpskNT!WliG!3-(L!$7_?k74_nS#ESrWwoUd0 zAmhUzX|Zq-iPr;snzbE|iuBtgf32?>bc-!kVVd!MjZm_JDt&zkWh&@uAKxS_K1V?d zeUAW&255TEwks2U=fyJ9oSiMg2^px^>GS7^aNgnyObc)L{+tW+2%ul}J;ma16o2D; z7)8;8ol+iRN%)`Ti6#iPgKAvn+)NSP3L_dj?xJ;QmvIAV7jxUgYo%ev$;GI-?ZLGk z_H6tB5}Mm~tu?6r_+eDo+_qz_@iufEe~AL`UVBc!C^mb8G`UhtNFq;ivnWaVKB$Ga zSxn?_)6umnyo;Nw#btqSOQAnr>w6DUF3b3t6#CfOl;@yd34kipduznBB+BO;m@*n3 zEe5bw)qE{Q)hrb~zlE9$Q3H2fkwQswPB#PIei)FcH0i_ON#mFj!OiHzz|4k_2)_-` z*l{u1mu48)SDE3BHPQ?NWd@I<)l6?SRvS-=s zwURx{W?w3L?FNChGRU-146e&0*R|wgmPqNTM%O}5ok$r#B7}?YZ9jZykGooN9;R;* z{F9IRF}X6C8avo%Qo7O^b6hs!o3s1}Nx1Tnz`0w|jovu8lLjU}aSxWl_WIPG+4VBj zUb~*@1aEl*-mgP&(4MOj4zjCWPSzfu|3O^5sZd0C-v!?A{*8SWiJ$S3jJ;rl;DqjB z!PCrBqdtkGM9d%NbV;PuH+Cdf*9qgIG}5AzB88iFuocr-U|`FuD}(o$-%TiZaPWh` zEF|VCqY%~aY zIFf3F(OW`QfP{D*2YWm_MfZ3s7}#TO*ul3-6MOwX>G46Rk$w}}_xuH=43-k)I=6?R zHPgN8Df{y~P_TFBO6V{kA>Oeg{WJ6~QTp=@2xITKMaLpg3_K6LQ?tMAmn7RuUoz5@ zy(uFRk)G^4n%wsp+6x$$KaH~IYrxM)U{QE7Q2ttw<#ql+D9>W3;s&iR%5z!v8p2|f zGw=f(CwQ=py4#J#3Fwrk7s}BL7KLXl%9VZ&4zH&Kpx z;CU#4We z8`;>wha;f}1FY%6nm&LtIYx_v)W^6o0UxZ23GDF2fDU zn~a`RldCvkuE$A4JSvRK(!eYoy#-u!^Z-`l@3}Cf#5p?gA9Hk)H~GJ#qvfqnCr5kf z=oH)0sdTi*_H-KlaY4L_lHL;O7l4e*5O{GX@de3!feCWhg<{g|N+2`oHjy=-WTggo zMtK0Rv12eCkuC2yOLOSxS3#D8Rat31{mE|z%z9BK-8TV1?mZMxo=GpW&#MHX$e&1NkBdDMqL;)J?Ajtn>BTnA`&3w8>s7f z{W&6huCc(g2?*h3@Oamw)T@C!Lya5o4MZkjW5;+r3BDnO0DT^LQwlsOr& z<< zUS$495M$k(Y;j4FRbAU8%&7_2qMW@7v%GnQZzaki=Mboj-UcglSMbgV-A$|z8N{B1 z2@@BKo-D6}myAE6k$fg41KrMj0m6)YQzj|@gh*8MB{M%b0@SD=E|dUODX1BcaU+`T zyAhQAm@)7Hh=O(j@|QqLKT4U615l%a?om*cf?fn6?8WnWEf~pjh!QQ_DQ~{;55&9)MB%%KTWHyNY(rDgtbT|v9@Z1CRK>9>@@4;z2 zaK;mmFpzC626Ny$=Zf&R00dsJ3&Q&_D0zP=xi3)MoPBT9+!v7hHgc!+vbjgw1#D#t z%4x8S=SmO^;v9|N4q?GUL*7mlm46Ba<6#X+x1?!kKkEi*=q(hy{UBf(-Px$o|3RWh z&^swEkO=5e^h-iJ3H?~t{ghB8>$pbWN9a}75&8|Gh^{+E=-+i6-m{|Ri_r43aV=*6 z@3!2Fkkj%cLQczH1LSd9c3ZuQR8FgHgq&7)0utV7Xmu0~=JfYpN#*qS2|`Y*9};p} zJr1b5Rs+ePa$4<6$Z53@knk=-tMWq?r`1bH<+M7PkkjgNLQbn+2h?4w@qKM2kJD-! zAmQDJR(~T$nfC2YQcc#-Pe~Pg5LBKUHO}MIqDsEqxsFa8OiC}K^f`KwQTiTby~|2M z9~0shSQ0X^)-pcRb!miVvyK6JE+G6RJ%zZ2K}97Z+Kfb2iNPkTg~fZvIK)kz5Z=q6 z$hDyLTnwRushcGTRuiN)o<2@#gH!rfq=Uh1!t)7nELnf-B--L#M{MKCv4BXb!;e0x zbRL*vYpj8t5o0;bRB#OQL>p{4Smp^#8S=>$W)7}-@~A$uOOGi~#}wzh zjy~}a-$yOys2w5nPtH*%A%t@jf3aE#iqs*I99!nZ&Qph^Ni z1%O{_3eoqwsQN1*IT;c1q+;oVC&c{{*|M=9a|Jxpj0!*JfC17wSuKQLL3`)3L6Myu zRl~QOQc&aZd$L&(WRx0@c;tFh_tMyru!_ixZ-QbDES1PF5{(~t zf?I(|;zyOqLALp*$0W%*kfh*;JPzVtrFHFp?9lMOkcDo=+4K7&VPV^H%8viwiwfJ0 zKHAavdiDfp<&n>H&)8&Zz`6&A)eonW!t)p|(qslq#){z2aq@h}gHKpD_Yq+%)zcX)3cc^%oJS*(}2_gN$N`` zqPL-#FG3TzyNoBXh8UWpcV_=QDC95By*|%C;t7ltQ*a5!P~`T{n-YqpNk|omy}cw$ zjBg7DO)`urAqqSl?vKv*XLn=vKiuQY_C zzjvxzO%<|Z0;)^2!S{@N8H$~vEw^j5<+;(;BTMv$@N-nq^^6a?b7cq6lU}iw9G|z@ zNaT1t&sNuV!zGXtW+3*Cw{EMEr_9@@0G0XlKDqnGb1U!O02%#aov!1U7Wl`aPP)fV zJQtx)-Nc{MaF^WSy(nBBPBL#baC>R${X-# zqMJst;$5TD2);^T8i~swZuBW-b9E5s$zf_+lKtyJzkW5jqO+6mPaEi@r=sSxUhCo! zJZXt%kInv_=7$8^dycE)+@|C3i#V>+0Q?-c#Sb~A{TP2`LL0>DKjOB|-pY%OM%^tn zyxghS6F(K3Dn2+PBS9Nudi(YC?dzId{BCx^bllyn6=1LAWX#A(=uG6M0<4go)q$sL zOQzeBw|gP%7h@=HT8opade(XA(X}m~+m>HNiluU9T#SuJs*`Js*lw%r*QJ{Zov3Y* zL|Y`sCq)XwDkD~yHV&t{)Xt*=4(Tl;YhN9|So?Zi&27c;>X1{qz1pP!zvCJ!-gWo@LyjgnvK2@C zM3a!<%1Sq|y0!IJmhyE@^+{+9pUT*SU8;*XR9%yCr{}FSIdApG%c}Iaw%xQs@{Fzq z57C@l^Jlu2&ms=%92Hny<{~v*4}bf&iGNibyJ~Qh$Udh@RV_hj5T-G z*6woFyUG@wqR`bI&WjsgxWP!7Y}{yUF!I*IA932dQPw+kN=W4|v#Z0ruAlJF!njEW zQK^H$>J8Cd`V((NccjFxlAvLH1_0v!k7}xW04~GfK&~=PXUw{B5rT_xZ>Lu40ge!R zRU?=031H;SkTz?;8Dl}^E6*4or7KtAM}2Ba#yw~NOC;DWv8(rzT<;~TxJ!w5VycS1 zwCW7+F$%y>0|WHW2Q_+}Yz@O)1Hpga~@C zV_e^twyD15!lI@~-o|szO>j*(2TwJ4ho0z~FiDv(Io^aR%7l1aCG8O7qqtd_nZdPa ztVxtZL!FJR#yYIY6yIqfsD~3BfHi!)19IXVfG*_5w#EsCD|z<`3n+TXc|y7fEBZuZ z4sbo0Iq-~J=Qrd`&7>z8uCmV4$u>M$#AF)Tf|_Pb6`uH92K){RLj(x9sFWY60 z^pXqH1ZQ!ZrnfD}N;F6mU~|lBL8UG}$ESEcMChF|C6t_aEex)f8)&n4Z@F+qx02lH z43jnzr0a58l`c(VL9P=>?`>a?RI8SPAvz+oq zOifyGZe%#+=~U4}->;v;sJu%79FeHr`4`jRJ(=6NB2ml# zz7k2onB^7eK6iB$Z^wjqJ0`~4F)7wY%8tpM?U)iv1DD0yF|G4pikr-S}M&f1jxTl>D#b5x=U}zh#N9Uz4rt^>0Sv>wD3@ z5~Y7D5no>oi>Z43yMg%nr3eL8uRouUuYanCuIERXd+|y~|0(^ahjqRFWHG+J8d*Te z*I)9**I&^`*XwWL;_ENW*Y)}nEM4Ch1&=rn4p#E@mpeDW&zYJCSEc8M{+dpI7@|p3 zeZdf2uV2c=*Z*dyuGcSnbUoYhi2Px?UgKl8Y1Dg?Iy=Cf(e9?@m(2-Jm=zvAWJF=y zripro)7s^AOTzNRk20%kYHNpyNTeCSMUf_P>Fg<&PMUb>jKb-ci%VxsnNeu(!-*;i zo;Yk&SnX~Z9=xn#am`q{2_nkTWy>q8YR4|Cs;sD64Hz3p4sNWkijEy#IPBtK!-o}- zz9G7Fti9n{hq z^@~iNB9>G&Mbs9dk!4La%c`Qw>I<fh^D!VwWsA{xZ9s`{wV`@cHK)vnM;b#q;`sb+ay z1V7_LUn7wwn3}3a>T7G^Icz03W!B7?4y~xDZLSi_q7}`JRoF_lvF7?J@NvUcwfm|n zDz{2(!>UNrD(twrBvM(?R3WBZHajwL_RQ&#nUl)J#Oc!_rBmikDV;P^!n0;im_28f zEJm9f8qh^iHgm$IlOhu@zpQLZxvZFZMP&9BvcxFq)C5|B#i5w98?4fY8@|d;bfSlH z6)P%gl*c;NNp+fLqo-C5yhC-#N6r?{7QOd%@VKz1r@MIWaG*jY|*tBp1<>mM7Yal zQ%zlDMFpgyNzkex-_%ejz}^VzM!AL5*sY*obV0GALqk1w%k}R@I|bRPgsL_5A5UbsX0U1wmSU zMJ0Md(umrOkvq=T@wcP4G`l%~YTr$@cQHVCe0iNTtSm=YRRD?Df(kVr>jLuG_NP}0FJ9vE2Pg>Aa%@@AP};_IsTb{gX(a|FX)t)%aRe3It}TXbpBtCkc|b&9GU!*+7?B36u9I6qgLckz%x0)y+tqb0 zcOgMrp4?1STb5gvs@^(Ar#eov@C62LW6cVrwPtL?D_|3-|R?pt(Y@;9*rk^fz&iHGHd3n$O!nRCVK5^QQc4x zEtF?03UohbPM8-N9;wCzQCcQ>OCr@=GprgeY35wk$r_DIYpR>XOxlFAxtJiytC>O| zQa3sqtyW@l^Dam@qZ3)ra|qkod(L7KSyo?LwJK~UQfS3o z4x2@qDi%AnatUUWXpTr(?edDIVHY|?2vN*8bH1ip5&UTJB>qfc++ZYoMA%+z^WKf? z_>z=x$!4P@DIjLPkmL!M@KJ`QDFzJ|`7tz=U1;=1l&6!k^$W=PF=%?lwKcm-Tlg$h z{;17uYiSo6>;&<-a`aB2-O1rS694oDq@XEXZ*2C^LiNvk=Q#8o2U(xj&S+Ep2JKAS3EO(^ z0zdEEOHvALe|w72nZj6I{sJ2ID^{1fm_BzGOVjZ{f%o~RizU*OfaY|uL>g@O@VRpI z)^@J%;$xC>^d@;OO?)hoM(@Dq(!|FSY4l!xE=^ZC_+95IW0F3m9K8b}QT=fx7+xy0VH@l4wZ+x^j7L%MdE;fxDS^Ay^^gOHfq;nI}aat?r|PSO<5 z?mTwx4&IY+%JK7B$!{6Ax~)=6ZIfA&l4i$t8T3hWavA%qx7T!Orgx#y+j6=zrCn(B z{+@2%CwJ-lR_Fuu(08qmD@XfEZ!a1f6P~H=VAFJZUsA|&VrPaVQ~lF)dVAAYd9z({ zGT+b+dLz|XI#0|X*YX|?sEzpI=vKJ`we9sjuif>vyL`c~^z~+CklpRvLmIsknoAQu z&PlU1c=~)n8ogcH>E!5r-&~sbaZWjUPdS$+K3|YVZ%*gZbd{qwzH@0@IkY|H=neHi zZx}>bo<=ZmwFpTm&RR>XnplQjj{Sx zyCErKobBmNBr(@H_VcLNmGfP9ahZva)A_vlbn_T#^d?iTp7DJljoz%vrE&X0n~vkv1{kJ zB%R&@?M&lEx1;x7`@DAa-fm~wj<$>5Mb7PWS3l`3>AIuQ`szLJV&hHOMTVPDxn2fvw{c1N592kJe$NqWkE>(izPosS8+`ixhpYQyXRhkZ!`DQ)KPT!v!z^C7v#PQvIdcMcNr#H2TwL@i$9q3om>HRYxU$1pb(Q#>G z>P{NHGe@kfncc{G1n+Q)!Q;wWp+(8{2W7nvni5H)=d)Fgox{MBMsHf;`og6dVAJT0 zS4vWL8;TUtIEYaHPmsrM`Mwp^}strR#&6xfTn1N+szGYNG9^cQlHlQ%;d|5EXa-Nq8Oj z^}Dam^|Zw<)a!R&T=#7DY%%BF;azXkCO`pO(UQb2_qNpO4e;vsV&E;??3ua6TyIRZ zIa5S8eAEHo06SY2bk>RR2-M$TzbE585@G%R46!k@&3C8&o7P|$OlU?c}lREzyGWEN;?)ntK zo7Tx;bdY}DX(4uqRz+o(~c=0E{cF9=Hrp z#X?-@5#tJBk-~$rr*NmmE6I$-k{Wjl63y!%g(l|+RpjL&9Oj0#J1rK*DLgMF8qb1k zX|dey#L??&;45)Z1D3CmWvd>S236$c1{~%pW2eOeU!8*d-(tH*+*aZjSiI2t#?`_i z`cak_TD&}k!(6f1uvj1s&6Om#o7t&|p99jk%Hri^93b{sENJ3nO?L6j&@|c?i(H zVH-r>ofeD36=(otk*ca%VO@ywEF7>)B`&K~@djMh%A&9?!elLAQvN`Y@vpk2?hR)F=60(O0@0<3owuXH;KT>9y^^n8y40>cBictk#Ld}GzTm0Wll7pN%Y*MjAo` zF1DV-<$x?IQ$2}>pjpz%lc@qdB)AtxvPKmb_w9{H0O|!C)>=_Akq81()%j9CMox^B z#{klv7(P0NVrsR%sHM7pj^`yv8$wrJY|GjD3Cj^hKpExfPDdnZNmXHT*TrfCXS>zBg#57X>g+x zN5=tn;BW$lfb7H-)>3G>LTQdoL3dg#Q+vcLFI#c=R*7N#c3LdT)NqAW0A*-RD5SMV z@d{vQFz9vwm)CFvSBZ4IoLGrqF3{>?&KLx%Q53s;2gvRx*CHV;N_=pW*eLqTl%nG& z21SnJ|2$z`-7Cez~bc-78g1V z0m}x4;{cYIMJz6|HsEqI4tD8wTpw3xUVeuPIk##*Tvb{x4d+aJ3 zd{a^gi~Hi-ivu>|MdqAE){7|aS6E({Wa#QNw2;YG7FfItVeu;K5?sm@mKP2O<0@f2 z4NvtUBf51z%Dq^gE36Mu9>{Wqu--&jy0A`I9F?^=U=dz6;qY$|w~Ahv?N~RHi1lIv z5Ejd`aloCtEQqOMc`2)|ws@haz*d}MUgef?5)Levx5z6cix_RmZq{t|bW*?2~ zODw};)aYTBm#MNe(+$chEN^8UraWBsvIzEdxZcGw9I+YK`&ot~zDyPo)+%so#aI^X z<3i=`zfkf#Ri?sl*KKqc%P+I8!g>XlcUfFy@j{NkO1Nh|%q^_v0KUOm#KViYzQrn2#%eWrgI;^{Yv;%R;RAk1(c%oK>7{eU09x)l<;#;vo69*!e$gD4!Ls4oM^);t%3 z)d9+5fnhel6yedp6%?~xT->upbBp0trX+av=`ynzq1Bi=}a@LNhT+N7zKj zEhQ+j%0RlMm?11j915l|3LzQLnwn@wU<5M-sta%cFRqF0JJqZv?*faL6*yvVx(IKQ z)xtUh(ksAn4cQ`MR7`9BBe>P#ZJwX^QiC{$566i&7Q)YaI+hTYa6b-l0p12_C;3?= zt8YSKE9vgU>24OjgVVh%Jctul^!`7?*<5h@^%C39#UGc>{xEFV2Z!);!O4ZO|8CU1 z#d<$MEedf{hst7pSaI59XCYBEub zWFE3Gn+1mG0vw8n+1cNOlguQ3f`t48AHyO1Jabh0d6Hw#&vOc8@s!H~$05g?zZfSD zW+Ce&5eZoDCjm#Dqm=LyB#WOspQ|tloX*Gsd&Ca;*`rQ2_#En`WUIxgjs@3rdLs9K z4C8vF)3|ow;pd5K2ESeq$p?N;xNuA#Vf80C9b>CjP0;*gq5h@=xraDbiy>@MG)A zm_HN$>ao&XA-&?iPTCrW6~>Us0akI~(Wt<4KnETR7~kSMa6MrCM|tZ2=x3fD;lXM{ z!HPz~%qtpxSQX@%{FEhFFCuLi9D?P9`cOX%-)2!98# z{w{~`qk#1v`_KOAZ(~@`{t;F*s(<>s7}m3Y`WqO+?4SPLg)sZ4zilDR{^{>n2(y3s zn-#+BpZ-3DF#D&!MIp@o>2FR5vw!*<62k1?CHA)>g!2LGZ$AigPsOL~?>q?q1hD=- zg7D7(>pyJ|{qCRjvE z^QY~xJ4wBBW{V-wLL%$0qOnd0} zzJzHH{f?I~?V;c05~e-$yII1thkgf3I2ZlX?^FpF0@m+O3G@4trc^A+&=11dSo0 zS2YUPHUF@lFKl%EOWpAEeTlArwVQgr-O%-KbyLqpqpp9in|iJkbp6NO)N_S!s(OW2 zXZDv8`2;Dw#w2Eg<$zk|qtz2$EY?PWn4+P@j~`dvKh z?*Xj886$izV7-hW{l5{m|I)Dj;J@&$-^r8ymw@$mV0{3;16Y3}!1@mW>-JcG0d>GK|p=?Mfh^m z>v!pd=K*HCa2-Lo2C)7Hfb#e+IqP@(tX~J1{=LN3XA5Ai7ap+rzXf<5%D1E4bgakj z2h7aCzcd)Kk6OZo31(OQHWkZz6(+p1ky= zpr988K~LhL6uz>eb=0pxZ=VB+_)eWRM~F+mN2mTu@cQC<>%(3X<9k|=&tg4=$Nvm^eSKB% z+3*Eq-3LJb{6U=X{OmxUK?^hIi$Cw8dmkD9d&s)pDFYA!ViTpN_D~4OdVf0Z*85YI zgR~WkLQ1_0RA9P4WooPFFxIDaa!2f-ZzPGMkD?Z+7l#-L?NSWFI@CceDVmy%c9Nv% zTLLp4!z8k~%o;>w8Q53?N(#hS05{oI^h(IG=(4PBtm9a(GBlHI#GY{Q!ql;DJduZ1 z4qZmuG0Z}{5`EHa@i=-SlIP~O&_S@h5=S2Ov-Si6Exrdg0#KnOg@?jJdu$@6wuZ_m z%r*wZ2~>w+3C2kuq2NNsE$833h~QCKEmSSq!cjcg0l{KQbulecUjazy$uQ2dWeY)v z5+^$WF;i}B)XcUjQ3x(DNt=x%?x#4kc2gOAOQj?#h!{gk}YJjYAM-9KS1quQ{Kaj2H3 zLMrfZdJ@4E4Tvns+(_?IFwwsX`^mRhACPDwTa zdfL+_kaoZabM68X*$pBDrJPO@#~v5XxuG~7J%8ZR!R`vd8z)`V+;Pf_L%CN^3;Pp1 z3O4Hzx@BOZ!J{rAr3k0PmK$1={}>Sf!c7xpsSFpSFTT8XxXg0IAH!~e{0gaS69(6iA)u*eTUfCr9NoOI`eg8`eWXP-8MIX1&QrUH;~ni z@^N;zp<@g|NdDS_{bu+F=?=2D`|C#0;GxrT@1hQ0eH4;7?xG4P)vn{}oDQY~*j=<$ z`Kz(Z6S{-;Kd}3bM}uope^1cBy88Q!0luD5t9&l_*-HCR`*whbBk_ZSOR9SXS?g5o z?-+9pPbkr(x?MDAow^C!JbKNO?UGK>9%R~Se7kS(%Ob(8Na~p1xe|q>!+qQfs;HE& zi4SNB$E|%dW-quksk$!(yH7vtFYl;FwPP8CZC?JwXAZ=NhqjpK$Xt62gHsx=l_9<} YI>7a!CiTa=prPHpBV&H45lXfD2beGvi~s-t literal 0 HcmV?d00001 diff --git a/fw/hello-world/prebuilt/hello.elf b/fw/hello-world/prebuilt/hello.elf index 5f9677b5bdb29265d0250f17870ffff2c986d015..416242266bdf2f932188900192ae481d1a8ac09a 100755 GIT binary patch literal 66276 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 YI>7a!CiTa=prPHpBV&H45lXfD2beGvi~s-t literal 64360 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 diff --git a/scc b/scc index a6cdc7a..13d2138 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit a6cdc7aeadb5024829042213b331b14bd718abb1 +Subproject commit 13d2138e7e0b390cf9fd503c81d03e790b150b1a diff --git a/src/vp/system.cpp b/src/vp/system.cpp index ab0069b..6229636 100644 --- a/src/vp/system.cpp +++ b/src/vp/system.cpp @@ -23,11 +23,11 @@ system::system(sc_core::sc_module_name nm) core_complex.dbus(ahb_router.target[1]); ahb_router.initiator.at(0)(qspi.xip_sck); - ahb_router.set_target_range(0, 0xE0000000, 16_MB); + ahb_router.set_target_range(0, 0x20000000, 16_MB); ahb_router.initiator.at(1)(mem_ram.target); - ahb_router.set_target_range(1, 0xC0000000, 128_kB); + ahb_router.set_target_range(1, 0x00000000, 128_kB); ahb_router.initiator.at(2)(apbBridge.target[0]); - ahb_router.set_target_range(2, 0xF0000000, 256_MB); + ahb_router.set_target_range(2, 0x10000000, 256_MB); size_t i = 0; for(const auto& e : PipelinedMemoryBusToApbBridge_map) { From b29f7ab6fa096f4f48d602c46c2fddb533b5e8d5 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Wed, 30 Jul 2025 06:41:36 +0200 Subject: [PATCH 05/69] make BSP location for fw configurable --- fw/.gitignore | 2 +- fw/hello-world/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fw/.gitignore b/fw/.gitignore index 0e8815f..105c692 100644 --- a/fw/.gitignore +++ b/fw/.gitignore @@ -1 +1 @@ -/fir +/bsp diff --git a/fw/hello-world/Makefile b/fw/hello-world/Makefile index 376bd71..25c3cf6 100644 --- a/fw/hello-world/Makefile +++ b/fw/hello-world/Makefile @@ -13,5 +13,5 @@ LDFLAGS := -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) compiler := $(shell which riscv64-unknown-elf-gcc) TOOL_DIR=$(dir $(compiler)) -BSP_BASE = ../bsp +BSP_BASE ?= ../bsp include $(BSP_BASE)/env/common-gcc.mk From d6a71a20651dc6aa21b15dbea5caefffb13838de Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 8 Aug 2025 09:36:34 +0200 Subject: [PATCH 06/69] updates submodules and setup files --- .vscode/launch.json | 17 +++++++++++++---- .vscode/tasks.json | 8 ++++---- CMakePresets.json | 1 + conanfile.py | 2 +- dbt-rise-riscv | 2 +- fw/hello-world/Makefile | 2 +- scc | 2 +- 7 files changed, 22 insertions(+), 12 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 0dd1d4f..1856298 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -18,7 +18,7 @@ "cwd": "${workspaceRoot}", "gdb": "riscv64-unknown-elf-gdb", "presentation": { - "hidden": true, + "hidden": false, "group": "FW Debug", "order": 2 } @@ -29,9 +29,9 @@ "name": "Launch VP with gdbserver", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "-f fw/hello-world/hello.elf -g 10000", + "arguments": "--isa 'rv32gc|msu_vp' -v DEBUG --disass -f fw/hello-world/hello.elf -g 10000", "presentation": { - "hidden": true, + "hidden": false, "group": "FW Debug", "order": 1 } @@ -42,9 +42,18 @@ "name": "Launch VP", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "-v DEBUG --isa tgc5c -f fw/hello-world/hello.elf", + "arguments": "-v DEBUG -t 3 --isa tgc5c -f fw/hello-world/hello.elf", "openGdbConsole": true }, + { + "type": "gdb", + "request": "launch", + "name": "Launch VP (asmjit)", + "cwd": "${workspaceRoot}", + "program": "${workspaceFolder}/build/Debug/src/riscv-vp", + "arguments": "--isa tgc5c --backend asmjit -f fw/hello-world/hello.elf", + "openGdbConsole": true + } ], "compounds": [ { diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 18fdf26..6d68af2 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -4,7 +4,7 @@ { "label": "CMake-and-make", "type": "shell", - "command": "source .venv/bin/activate && cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DCMAKE_EXPORT_COMPILE_COMMANDS=ON && cmake --build build", + "command": "cmake --preset Release -B build/Release && cmake --build build/Release", "problemMatcher": [], "presentation": { "echo": true, @@ -22,7 +22,7 @@ { "label": "Build-FW", "type": "shell", - "command": "cd fw/hello-world/ && make", + "command": "make -C fw/hello-world clean all", "problemMatcher": [], "presentation": { "echo": true, @@ -36,7 +36,7 @@ { "label": "Execute-VP", "type": "shell", - "command": "build/src/tgc-vp -f fw/hello-world/hello -p pctrace=contrib/TGC_C_cycles.json", + "command": "build/Debug/src/riscv-vp -f fw/hello-world/hello.elf -p pctrace=contrib/TGC_C_cycles.json", "problemMatcher": [], "presentation": { "echo": true, @@ -50,7 +50,7 @@ { "label": "VP-GDB-Server", "type": "shell", - "command": "build/src/tgc-vp -f fw/hello-world/hello -g 10000", + "command": "build/Debug/src/riscv-vp -v TRACEALL --disass -f fw/hello-world/hello.elf -g 10000", "problemMatcher": [], "presentation": { "echo": true, diff --git a/CMakePresets.json b/CMakePresets.json index 7128e62..4bc9be5 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -19,6 +19,7 @@ "CMAKE_INSTALL_PREFIX": "${sourceDir}/install/${presetName}", "CMAKE_EXPORT_COMPILE_COMMANDS": "ON", "CMAKE_PROJECT_TOP_LEVEL_INCLUDES": "scc/cmake/conan_provider.cmake", + "CONAN_BUILD_PROFILE": "auto-cmake", "WITH_TCC": "OFF" } }, diff --git a/conanfile.py b/conanfile.py index 5a25656..c7e147e 100644 --- a/conanfile.py +++ b/conanfile.py @@ -33,7 +33,7 @@ class Pkg(ConanFile): "boost/*:without_timer": "True", "boost/*:without_type_erasure": "True", "boost/*:without_wave": "True", - "systemc/*:shared": "True" + "systemc/*:shared": "True", } def requirements(self): diff --git a/dbt-rise-riscv b/dbt-rise-riscv index c000fd6..1c8e1be 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit c000fd68059681b639c8ec79ef7f9b2b2ef5ea91 +Subproject commit 1c8e1bef1c7b897612c370785159f6123a45d3ba diff --git a/fw/hello-world/Makefile b/fw/hello-world/Makefile index 25c3cf6..e344dd1 100644 --- a/fw/hello-world/Makefile +++ b/fw/hello-world/Makefile @@ -8,7 +8,7 @@ BOARD=riscv_vp LINK_TARGET=flash RISCV_ARCH:=rv32imc RISCV_ABI:=ilp32 -LDFLAGS := -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) +LDFLAGS := -g -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) compiler := $(shell which riscv64-unknown-elf-gcc) TOOL_DIR=$(dir $(compiler)) diff --git a/scc b/scc index 13d2138..badc373 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit 13d2138e7e0b390cf9fd503c81d03e790b150b1a +Subproject commit badc373aae58a9745dac803862edb522e6674321 From ec38023f3ed75e81190107bac95eb481930d2286 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 8 Aug 2025 09:49:47 +0200 Subject: [PATCH 07/69] cleans up tasks.json --- .vscode/tasks.json | 26 ++++---------------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 6d68af2..d88a924 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -2,25 +2,7 @@ "version": "2.0.0", "tasks": [ { - "label": "CMake-and-make", - "type": "shell", - "command": "cmake --preset Release -B build/Release && cmake --build build/Release", - "problemMatcher": [], - "presentation": { - "echo": true, - "reveal": "always", - "focus": true, - "panel": "dedicated", - "showReuseMessage": false, - "clear": true - }, - "group": { - "kind": "build", - "isDefault": true - } - }, - { - "label": "Build-FW", + "label": "Build FW", "type": "shell", "command": "make -C fw/hello-world clean all", "problemMatcher": [], @@ -34,7 +16,7 @@ } }, { - "label": "Execute-VP", + "label": "Execute VP", "type": "shell", "command": "build/Debug/src/riscv-vp -f fw/hello-world/hello.elf -p pctrace=contrib/TGC_C_cycles.json", "problemMatcher": [], @@ -48,9 +30,9 @@ } }, { - "label": "VP-GDB-Server", + "label": "Execute VP with GDB-Server", "type": "shell", - "command": "build/Debug/src/riscv-vp -v TRACEALL --disass -f fw/hello-world/hello.elf -g 10000", + "command": "build/Debug/src/riscv-vp -f fw/hello-world/hello.elf -g 10000", "problemMatcher": [], "presentation": { "echo": true, From 58cd8e7b074bbcd2abfba0313d33199749ba5aba Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Tue, 12 Aug 2025 10:43:42 +0200 Subject: [PATCH 08/69] adds mtime connection --- dbt-rise-riscv | 2 +- src/vp/system.cpp | 2 ++ src/vp/system.h | 9 ++++----- vpvper | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 1c8e1be..82b7653 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 1c8e1bef1c7b897612c370785159f6123a45d3ba +Subproject commit 82b765336f08787899f6030d5eb8918247e34c4a diff --git a/src/vp/system.cpp b/src/vp/system.cpp index 6229636..543fd0b 100644 --- a/src/vp/system.cpp +++ b/src/vp/system.cpp @@ -53,6 +53,7 @@ system::system(sc_core::sc_module_name nm) qspi.rst_i(rst_s); core_complex.rst_i(rst_s); + aclint.mtime_o(mtime_s); aclint.mtime_int_o(mtime_int_s); aclint.msip_int_o(msip_int_s); irq_ctrl.irq_o(core_int_s); @@ -63,6 +64,7 @@ system::system(sc_core::sc_module_name nm) timer0.interrupt_o[1](irq_int_s[2]); qspi.irq_o(irq_int_s[3]); + core_complex.mtime_i(mtime_s); core_complex.timer_irq_i(mtime_int_s); core_complex.ext_irq_i(core_int_s); core_complex.local_irq_i(local_int_s); diff --git a/src/vp/system.h b/src/vp/system.h index c7674c1..e9f0889 100644 --- a/src/vp/system.h +++ b/src/vp/system.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -59,13 +60,11 @@ private: scc::memory<128_kB, scc::LT> mem_ram{"mem_ram"}; scc::memory<8_kB, scc::LT> boot_rom{"boot_rom"}; - sc_core::sc_signal rst_s{"rst_s"}, mtime_int_s{"mtime_int_s"}, - msip_int_s{"msip_int_s"}; + sc_core::sc_signal rst_s{"rst_s"}, mtime_int_s{"mtime_int_s"}, msip_int_s{"msip_int_s"}; - sc_core::sc_vector> irq_int_s{"irq_int_s", 32}, - local_int_s{"local_int_s", 16}; + sc_core::sc_vector> irq_int_s{"irq_int_s", 32}, local_int_s{"local_int_s", 16}; sc_core::sc_signal core_int_s{"core_int_s"}; - + sc_core::sc_signal mtime_s{"mtime_s"}; void gen_reset(); #include "../vp/gen/PipelinedMemoryBusToApbBridge.h" // IWYU pragma: keep }; diff --git a/vpvper b/vpvper index 77b5ffa..ec61cb9 160000 --- a/vpvper +++ b/vpvper @@ -1 +1 @@ -Subproject commit 77b5ffa40d50f63f4adac0b32076d9da590a4c51 +Subproject commit ec61cb97a50cd8c71df1c64c3a43c1947a9f6af4 From 8eff2d4ccf380c505e832e67be77ce07f204e3d3 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Tue, 12 Aug 2025 11:18:15 +0200 Subject: [PATCH 09/69] adds separate clock for aclints mtime register --- src/vp/system.cpp | 3 +++ src/vp/system.h | 1 + vpvper | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vp/system.cpp b/src/vp/system.cpp index 543fd0b..3d48159 100644 --- a/src/vp/system.cpp +++ b/src/vp/system.cpp @@ -19,6 +19,8 @@ system::system(sc_core::sc_module_name nm) : sc_core::sc_module(nm) , NAMED(ahb_router, 3, 2) , NAMED(apbBridge, PipelinedMemoryBusToApbBridge_map.size(), 1) { + mtime_clk = (1.0 / 32768) * 1_sec; + core_complex.ibus(ahb_router.target[0]); core_complex.dbus(ahb_router.target[1]); @@ -53,6 +55,7 @@ system::system(sc_core::sc_module_name nm) qspi.rst_i(rst_s); core_complex.rst_i(rst_s); + aclint.mtime_clk_i(mtime_clk); aclint.mtime_o(mtime_s); aclint.mtime_int_o(mtime_int_s); aclint.msip_int_o(msip_int_s); diff --git a/src/vp/system.h b/src/vp/system.h index e9f0889..dfb2ca3 100644 --- a/src/vp/system.h +++ b/src/vp/system.h @@ -60,6 +60,7 @@ private: scc::memory<128_kB, scc::LT> mem_ram{"mem_ram"}; scc::memory<8_kB, scc::LT> boot_rom{"boot_rom"}; + sc_core::sc_signal mtime_clk{"mtime_clk"}; sc_core::sc_signal rst_s{"rst_s"}, mtime_int_s{"mtime_int_s"}, msip_int_s{"msip_int_s"}; sc_core::sc_vector> irq_int_s{"irq_int_s", 32}, local_int_s{"local_int_s", 16}; diff --git a/vpvper b/vpvper index ec61cb9..923024b 160000 --- a/vpvper +++ b/vpvper @@ -1 +1 @@ -Subproject commit ec61cb97a50cd8c71df1c64c3a43c1947a9f6af4 +Subproject commit 923024bd82902bd15f55dd5e108d5823cb0c4add From c98e2b9f41ec6983cae390b83b2d0381b3dcfae8 Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch Date: Thu, 14 Aug 2025 11:05:48 +0200 Subject: [PATCH 10/69] updates dbt-rise-riscv submodule --- dbt-rise-riscv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 82b7653..f4bfd06 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 82b765336f08787899f6030d5eb8918247e34c4a +Subproject commit f4bfd06d7eaa3369fde9db3cb3cc28ab9b4bcf35 From dc71178c0cbd5fe368866fa90e38fe711e276b67 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Thu, 14 Aug 2025 15:53:23 +0200 Subject: [PATCH 11/69] fixes dgb access for 64bit cores --- .vscode/launch.json | 18 ++++++++++++------ dbt-rise-riscv | 2 +- fw/hello-world/Makefile | 2 ++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 1856298..43d3fca 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -17,6 +17,7 @@ }, "cwd": "${workspaceRoot}", "gdb": "riscv64-unknown-elf-gdb", + "openGdbConsole": true, "presentation": { "hidden": false, "group": "FW Debug", @@ -30,11 +31,16 @@ "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", "arguments": "--isa 'rv32gc|msu_vp' -v DEBUG --disass -f fw/hello-world/hello.elf -g 10000", - "presentation": { - "hidden": false, - "group": "FW Debug", - "order": 1 - } + "openGdbConsole": true + }, + { + "type": "gdb", + "request": "launch", + "name": "Launch 64bit VP with gdbserver", + "cwd": "${workspaceRoot}", + "program": "${workspaceFolder}/build/Debug/src/riscv-vp", + "arguments": "--isa 'rv64gc|msu_vp' -v TRACEALL --disass -f fw/hello-world/hello.elf -g 10000", + "openGdbConsole": true }, { "type": "gdb", @@ -42,7 +48,7 @@ "name": "Launch VP", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "-v DEBUG -t 3 --isa tgc5c -f fw/hello-world/hello.elf", + "arguments": "-v DEBUG -t 3 --isa 'tgc5c|mu_p' -f fw/hello-world/hello.elf", "openGdbConsole": true }, { diff --git a/dbt-rise-riscv b/dbt-rise-riscv index f4bfd06..48f8983 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit f4bfd06d7eaa3369fde9db3cb3cc28ab9b4bcf35 +Subproject commit 48f8983d7ee71cfcccc8216ff159ce5367f4c6a4 diff --git a/fw/hello-world/Makefile b/fw/hello-world/Makefile index e344dd1..f980993 100644 --- a/fw/hello-world/Makefile +++ b/fw/hello-world/Makefile @@ -8,6 +8,8 @@ BOARD=riscv_vp LINK_TARGET=flash RISCV_ARCH:=rv32imc RISCV_ABI:=ilp32 +#RISCV_ARCH:=rv64imc +#RISCV_ABI:=lp64 LDFLAGS := -g -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) compiler := $(shell which riscv64-unknown-elf-gcc) From 2168421020c7c4fb3e01310f26f97ffbea6d489a Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 15 Aug 2025 09:26:22 +0200 Subject: [PATCH 12/69] updates dbt-rise-riscv --- .gdbinit | 1 + .gitignore | 1 + .vscode/tasks.json | 14 ++++++++++++++ dbt-rise-riscv | 2 +- 4 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 .gdbinit diff --git a/.gdbinit b/.gdbinit new file mode 100644 index 0000000..043b1d8 --- /dev/null +++ b/.gdbinit @@ -0,0 +1 @@ +set breakpoint pending on diff --git a/.gitignore b/.gitignore index d2d7f29..371559b 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ CMakeSettings.json /CMakeUserPresets.json /.envrc.* .clangd +/install diff --git a/.vscode/tasks.json b/.vscode/tasks.json index d88a924..5f74661 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -42,6 +42,20 @@ "showReuseMessage": false, "clear": true }, + }, + { + "label": "Execute 64bit VP with GDB-Server", + "type": "shell", + "command": "build/Debug/src/riscv-vp --isa 'rv64gc|msu_vp' -v TRACEALL -f fw/hello-world/hello.elf -g 10000 |& tee run.log", + "problemMatcher": [], + "presentation": { + "echo": true, + "reveal": "always", + "focus": true, + "panel": "dedicated", + "showReuseMessage": false, + "clear": true + }, } ] } diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 48f8983..c99d195 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 48f8983d7ee71cfcccc8216ff159ce5367f4c6a4 +Subproject commit c99d195faa93daaa9f00f52ee13408c76443e302 From 65647e9910180c6775b6ccda5b8dadde9d169cb2 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 15 Aug 2025 09:52:24 +0200 Subject: [PATCH 13/69] extends VSCode/Theia setup --- .vscode/c_cpp_properties.json | 17 -------------- .vscode/launch.json | 27 +++++++++++----------- .vscode/settings.json | 8 +++++-- .vscode/tasks.json | 42 +++++++++++++++++++++++++++++------ 4 files changed, 55 insertions(+), 39 deletions(-) delete mode 100644 .vscode/c_cpp_properties.json diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json deleted file mode 100644 index 1211532..0000000 --- a/.vscode/c_cpp_properties.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "configurations": [ - { - "name": "Linux", - "includePath": [ - "${workspaceFolder}/**" - ], - "defines": [], - "compilerPath": "/usr/bin/gcc", - "cStandard": "gnu17", - "cppStandard": "gnu++14", - "intelliSenseMode": "linux-gcc-x64", - "configurationProvider": "ms-vscode.cmake-tools" - } - ], - "version": 4 -} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 43d3fca..488d4f1 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,13 +1,10 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "gdbtarget", "request": "attach", - "name": "Attach-to-gdbserver", + "name": "Attach GDB to VP", "program": "./fw/hello-world/hello.elf", "imageAndSymbols": { "symbolFileName": "./fw/hello-world/hello.elf" @@ -27,25 +24,25 @@ { "type": "gdb", "request": "launch", - "name": "Launch VP with gdbserver", + "name": "32bit VP with gdbserver", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "--isa 'rv32gc|msu_vp' -v DEBUG --disass -f fw/hello-world/hello.elf -g 10000", + "arguments": "--isa 'rv32gc|msu_vp' -v INFO --disass -f fw/hello-world/hello.elf -g 10000", "openGdbConsole": true }, { "type": "gdb", "request": "launch", - "name": "Launch 64bit VP with gdbserver", + "name": "64bit VP with gdbserver", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "--isa 'rv64gc|msu_vp' -v TRACEALL --disass -f fw/hello-world/hello.elf -g 10000", + "arguments": "--isa 'rv64gc|msu_vp' -v INFO --disass -f fw/hello-world/hello.elf -g 10000", "openGdbConsole": true }, { "type": "gdb", "request": "launch", - "name": "Launch VP", + "name": "TGC5 VP", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", "arguments": "-v DEBUG -t 3 --isa 'tgc5c|mu_p' -f fw/hello-world/hello.elf", @@ -54,17 +51,21 @@ { "type": "gdb", "request": "launch", - "name": "Launch VP (asmjit)", + "name": "TGC5 VP (asmjit)", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "--isa tgc5c --backend asmjit -f fw/hello-world/hello.elf", + "arguments": "-v DEBUG --isa 'tgc5c|mu_p' --backend asmjit -f fw/hello-world/hello.elf", "openGdbConsole": true } ], "compounds": [ { - "name": "FW-Debug", - "configurations": ["Launch VP with gdbserver", "Attach-to-gdbserver"] + "name": "FW-Debug 32bit", + "configurations": ["32bit VP with gdbserver", "Attach to VP"] + }, + { + "name": "FW-Debug 64bit", + "configurations": ["64bit VP with gdbserver", "Attach to VP"] } ] } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 1e6291f..347762a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,6 +14,10 @@ "--background-index", "--compile-commands-dir=${workspaceFolder}/build" ], - "cmake.copyCompileCommands": "${workspaceFolder}/build/compile_commands.json" - + "cmake.copyCompileCommands": "${workspaceFolder}/build/compile_commands.json", + "cmake.options.statusBarVisibility": "hidden", + "cmake.options.advanced": { + "configure": {"projectStatusVisibility": "visible"}, + "build": {"statusBarVisibility": "visible"} + } } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 5f74661..1d8974f 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -2,7 +2,7 @@ "version": "2.0.0", "tasks": [ { - "label": "Build FW", + "label": "Build 32bit FW", "type": "shell", "command": "make -C fw/hello-world clean all", "problemMatcher": [], @@ -15,10 +15,10 @@ "clear": true } }, - { - "label": "Execute VP", +{ + "label": "Build 64bit FW", "type": "shell", - "command": "build/Debug/src/riscv-vp -f fw/hello-world/hello.elf -p pctrace=contrib/TGC_C_cycles.json", + "command": "make -C fw/hello-world RISCV_ARCH=rv64imc RISCV_ABI=lp64 clean all", "problemMatcher": [], "presentation": { "echo": true, @@ -30,9 +30,37 @@ } }, { - "label": "Execute VP with GDB-Server", + "label": "Run 32bit VP", "type": "shell", - "command": "build/Debug/src/riscv-vp -f fw/hello-world/hello.elf -g 10000", + "command": "build/Debug/src/riscv-vp --isa 'rv32gc|msu_vp' -f fw/hello-world/hello.elf -p pctrace=contrib/TGC_C_cycles.json", + "problemMatcher": [], + "presentation": { + "echo": true, + "reveal": "always", + "focus": true, + "panel": "dedicated", + "showReuseMessage": false, + "clear": true + } + }, + { + "label": "Run 64bit VP", + "type": "shell", + "command": "build/Debug/src/riscv-vp --isa 'rv64gc|msu_vp' -f fw/hello-world/hello.elf -p pctrace=contrib/TGC_C_cycles.json", + "problemMatcher": [], + "presentation": { + "echo": true, + "reveal": "always", + "focus": true, + "panel": "dedicated", + "showReuseMessage": false, + "clear": true + } + }, + { + "label": "Run 32bit VP with GDB-Server", + "type": "shell", + "command": "build/Debug/src/riscv-vp --isa 'rv32gc|msu_vp' -f fw/hello-world/hello.elf -g 10000", "problemMatcher": [], "presentation": { "echo": true, @@ -44,7 +72,7 @@ }, }, { - "label": "Execute 64bit VP with GDB-Server", + "label": "Run 64bit VP with GDB-Server", "type": "shell", "command": "build/Debug/src/riscv-vp --isa 'rv64gc|msu_vp' -v TRACEALL -f fw/hello-world/hello.elf -g 10000 |& tee run.log", "problemMatcher": [], From 543a517c72181f5c5c52e3c932ae43dea62bcc00 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 15 Aug 2025 10:02:47 +0200 Subject: [PATCH 14/69] updates dbt_rise --- dbt-rise-riscv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbt-rise-riscv b/dbt-rise-riscv index c99d195..8d25fa1 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit c99d195faa93daaa9f00f52ee13408c76443e302 +Subproject commit 8d25fa110869843628a7b4981f9c39818157e772 From 35a9fe95cbc4bd9bc5461f7d1ef3582b0da7a3db Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 15 Aug 2025 11:49:11 +0200 Subject: [PATCH 15/69] corrects tasks in tasks.json --- .vscode/tasks.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 1d8974f..5b079fd 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -32,7 +32,7 @@ { "label": "Run 32bit VP", "type": "shell", - "command": "build/Debug/src/riscv-vp --isa 'rv32gc|msu_vp' -f fw/hello-world/hello.elf -p pctrace=contrib/TGC_C_cycles.json", + "command": "build/Debug/src/riscv-vp --isa 'rv32gc|msu_vp' -f fw/hello-world/hello.elf", "problemMatcher": [], "presentation": { "echo": true, @@ -46,7 +46,7 @@ { "label": "Run 64bit VP", "type": "shell", - "command": "build/Debug/src/riscv-vp --isa 'rv64gc|msu_vp' -f fw/hello-world/hello.elf -p pctrace=contrib/TGC_C_cycles.json", + "command": "build/Debug/src/riscv-vp --isa 'rv64gc|msu_vp' -f fw/hello-world/hello.elf", "problemMatcher": [], "presentation": { "echo": true, From 39ea27ee08a63db08d77794ab7fbabdcab10f2ad Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 15 Aug 2025 11:50:42 +0200 Subject: [PATCH 16/69] changes instantiation to mt --- dbt-rise-riscv | 2 +- src/vp/system.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 8d25fa1..23b00ad 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 8d25fa110869843628a7b4981f9c39818157e772 +Subproject commit 23b00add2353b06fae4e7109c97879919be43720 diff --git a/src/vp/system.h b/src/vp/system.h index dfb2ca3..e26bc66 100644 --- a/src/vp/system.h +++ b/src/vp/system.h @@ -48,7 +48,7 @@ public: system(sc_core::sc_module_name nm); private: - sysc::riscv::core_complex<> core_complex{"core_complex"}; + sysc::riscv::core_complex core_complex{"core_complex"}; scc::router<> ahb_router, apbBridge; vpvper::minres::gpio_tl gpio0{"gpio0"}; vpvper::minres::uart_tl uart0{"uart0"}; From 0eba95df19618bfaa19ab5024af051bb1b6a8d8f Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 13 Sep 2025 15:41:54 +0200 Subject: [PATCH 17/69] updates submodules --- .gitignore | 1 + dbt-rise-core | 2 +- dbt-rise-riscv | 2 +- scc | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 371559b..8c518be 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ CMakeSettings.json /.envrc.* .clangd /install +.gdb_history diff --git a/dbt-rise-core b/dbt-rise-core index b0fd676..e60892d 160000 --- a/dbt-rise-core +++ b/dbt-rise-core @@ -1 +1 @@ -Subproject commit b0fd6762be2a39e4b05667f71778be4fb1bd6019 +Subproject commit e60892d2f9645231d24b02c864b6583ffda0c327 diff --git a/dbt-rise-riscv b/dbt-rise-riscv index c99d195..1260c9d 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit c99d195faa93daaa9f00f52ee13408c76443e302 +Subproject commit 1260c9db5ec97242d07b20254654a057db3e7288 diff --git a/scc b/scc index badc373..214d4fc 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit badc373aae58a9745dac803862edb522e6674321 +Subproject commit 214d4fc7b0faad1918ef42ecda34b046569c6642 From 8581509357386c09f0ec1b00186a7caea24007c1 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 14 Sep 2025 14:57:26 +0200 Subject: [PATCH 18/69] adds standalone FW Debug launch --- .vscode/launch.json | 27 +++++++++++++++++++++++++-- dbt-rise-riscv | 2 +- fw/hello-world/hello.elf | Bin 66276 -> 66392 bytes 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 488d4f1..2254b56 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,6 +1,29 @@ { "version": "0.2.0", "configurations": [ + { + "type": "gdbtarget", + "request": "launch", + "name": "Debug hello world 32bit", + "program": "fw/hello-world/hello.elf", + "imageAndSymbols": { + "symbolFileName": "fw/hello-world/hello.elf" + }, + "target": { + "server": "${workspaceFolder}/build/RelWithDebInfo/src/riscv-vp", + "serverParameters": ["--isa", "rv32gc|msu_vp", "-v", "INFO", "--disass", "-f", "fw/hello-world/hello.elf", "-g", "10000"], + "watchServerProcess": true, + "port": "10000" + }, + "cwd": "${workspaceRoot}", + "gdb": "riscv64-unknown-elf-gdb", + "openGdbConsole": true, + "presentation": { + "hidden": false, + "group": "FW Debug", + "order": 2 + },"initCommands": ["b main"] + }, { "type": "gdbtarget", "request": "attach", @@ -61,11 +84,11 @@ "compounds": [ { "name": "FW-Debug 32bit", - "configurations": ["32bit VP with gdbserver", "Attach to VP"] + "configurations": ["32bit VP with gdbserver", "Attach GDB to VP"] }, { "name": "FW-Debug 64bit", - "configurations": ["64bit VP with gdbserver", "Attach to VP"] + "configurations": ["64bit VP with gdbserver", "Attach GDB to VP"] } ] } \ No newline at end of file diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 1260c9d..45dc8bd 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 1260c9db5ec97242d07b20254654a057db3e7288 +Subproject commit 45dc8bd3fd093207b6d11c97c0de2fb85a2fe627 diff --git a/fw/hello-world/hello.elf b/fw/hello-world/hello.elf index 416242266bdf2f932188900192ae481d1a8ac09a..2dcce5411fe1f2283e1919d4b52270e607e2821c 100755 GIT binary patch delta 20172 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
    9d$5x!b`K*1 zf5vPC-cX$%YN?A@Tb;w4+rV)S!pM2l5xHZLkxl>taa!LrGR}NGC5Cw^J%#&9P^a{A zWSS{m3j=+ja16I1KQ-Ph!N1?f^aFAHu&TdZgEMOoHox_qn0dOjhM=Y_&K_Cv#m?)jKTi4JBIHK>wo1n4bs4~h0QU_#ku`CsCkLQ z>35Ft{QYpC?JR}bUNpBgE~kaH3tcElJ@Ig^+}H5p!a8XK z(%;-rw*t~1P^$X@>5n$lv%8Dr67|OJGTa^i6W1nH@NAi^QN3{8uCB&)gu40JGJfrC z^RuNEo_?Nrwp6ZGZ-BE${UBzx5E6{^QG6OT5|{3Dx*owfwoh znScLnE_GsdwBfVo!bvLq)ohi%KPW5Ig#G2RS}n)*1`V$xY&|2@$NO7aN2Pk})l%F) zamG-8flOPK@p8Ewr|y5bjl5S)c=^KK9kfRw^jCoZSEojYESGDn4FMIbP7VpH=kwM3 zlC5a<;p$hbv5mOC`8O<}YF_T4(q9X1Xbj4o3co{;U#asNFR(|Wfc8|A8_P5_TD{^y zE8?^V;^k+mgGJ$}=Y6xf%%krB z-AFv6?m1{e%?zpM4z|>$x~M-LEZ5K|m2${H2UK?t8m%TA>TIt=1)rko4wX5CmWI`V z#!^k(5hw0zCVrt>{LV;bM|AF}G$_K{Y5i#tRr89`->9DYUAZP60ntky#r=;&zf1Bc zzee>x+((D>v08rEc*lpjm9H5;J=Jdymuq&d`tZv2;T5y{B-Vw8iN%ueC`7Xnue14k0 zh_#2MK(X-1*{m*l%>?kYn*5sabwb_o+68ta3d|DqJfI-XN~i~~b+&r~YEm7W+St+v zyVPT^x6vB+s@Gm`?~vOvS2;)9Y2ql={irdsO-(p@L3k^6seUt~GMcg?ZLv`IfP$Lz z^wA#nR{&S5Pa)O~_cr}}tK{$Vaz_L6pOv`9iKAwXd*c#&7r?#hu{SPvLij=t?zE@g zDD2)A;9Bo?hXVx87^ZZ&^jwN2$GPmv2wvl|Lj;%oz9?1+a0IDi-SOzIHQ+pSd~qSi z3YQWC(5x<7T=o=`Q?&FHkIa6KAyadK0omPx7FZG6;u2V9=ul#2!wZN*xiY4mjT&5hZa~Qx3~nDKZyS%(F|#gq>ppi@v&A;5-!On&|-4D%l;Hv zV8I&c5};7zp}@n*6_0j&RBSQQL26EL*=3?Z7{@FCzHo{!{5~v@5sa;o(A^7kADW!# zvO9w21ePJhEiT|#G#{dJBERO_JZrSslk{;eyRihPx$LH(F|>&B<`U;)v79E{xYjjV zYYfR#U3R`!(%D*5W5VqVfl-vby4l**n0Ancp#^WoFyb7I33q_U#5#yaFhywi2C(d| zD@3a;F2VT*l|TtHR>KwUBEX&Q!3C*#1l=zU_#C?DH7MNm=*f~Z-5u!ms*FEm#b_h5 z7-<}*g4d{^OZYGzbse3TEiU1=he2?JKaTl~Wk4QJP@M1Bbb>y@QQ$%|v$`I*$rVP>Q(pZ9_YEU?w1Vcoh zMw8P`mQoqtIF}v6#foKGmKl)Q`5QAdHl86YM#hWpaFWW7v%$Q1vl1hnUf!q36rHCV zn9eC~5UI>(I91guk4?V=8*9f-)TFk7o(ySzU!3*v<9$#68kME^Gfv(-9-ohd>0u2S1 z$|KR@yqF&im<(!hBJ&489!w-`1F}7lumi}h1cK1(fez&iJ?1q8QLHh5{T#$nys*He z5I%q=V-s~uwXgw=crZ0Om<@)?j-fDN?Dc}2;j%k|2J;T`5izM_I<6%+(PfvgmUKcV zn*1=S;gwiRF|(K|fmfl$R}B$8jIr)^#QAd*`y$3pnDJxbvTH=M7m2Q|x3~m#i5Tn7 zLSW1%Cesfe;AT*mG6a{8;0nud%L*?N8K+O5UWg?<%MTcLj5!E^wm4{xQtuBe2QDPi z!>hzf(MH!6KM@HeYE&`{*Ti>J0+&hQ?gBT)o|#EtbJOWMc8zey!kwO|aV|SOy6HOg z$2g90F1z0JG(PSLRC<_isO+{9ta10EJAlS99Y%kW;|Cpm^lxZxlJ(UsqIgU5)*mOn zdFh-n?dLeRi=ZX%y(O!+q(LH0p z-RQK#nz%y_mL8*M+|PWE{2m&zgf3=^PmP<5Jm#8|vSYQOG~XMKF=Tc(5S-vHMYqOK z*>O|I3BnaHJB_9>u=g=>lL(Iy?)m6z2~QSo6uq9sIl{%}j76V-Ad!LNQU*dWmScMH}7;N|HA05lMIsEkmh4 zW!i*ZQrrJj7+dGj<@GL!htNxjW2V2PYrE|6Q3uLMTRi%<2;K>0UzU z=VQ{Z$7;}#0CAR>K{F$bWKMApqYF_7`Y!-JN;2&3N6%z4(f>%P5biV3Hj%{)QcXAG z&3xh$<*2;MzziAFaW|)fa3*<^-E4Gi3D&sms1aI-^e;#H@zFQXQgSij$>>`WMu9n3 zNsj5QjzMuHRZD;Y%3ae3A=5HOmPwqAMpo7R?QJ;{$ZH# zYU18un(&$gK4Cs-dVCRctAI@+WwE*2Q$tG_94Q2$77dflZV_5=sS0gz2`w`WUx`a~ zfhUA=vkD+t5>=IEZXi4{E`dT7(^e=4x-ZTG7PmMNw*;_fp@A;0O&mSre3ZK5Ty{T4 zOMJQ_{*q=3_ZviG{*zdu>}Kffpx#7rVS+oS2M&OIpmX@pG>3ryOe7pWz426!wTYi& zpo#W)J?77oLzZUm1JFphCS33U59n<`?~!y27arps9`ks}cDmuhleA;b&H$#M-cLgl z4v&~T3p>BZ@?iBA4$%sdc-!AfJ)WN)CBQ?#P6CH<;muk&JZ;2ycXx&XXGs?h%iK=b zbDqY9OVp6olEn4Qrh$zFxK8WQj1a4^^E56jFTx>8%pv-PCh02`xx={yMa*G0f;3*n z5#V;@wsThC!c8qSPYY3ie1`(ueDSD+LzF5Gb^hCkDX_kT`RAC}9FB=YayX{5vS7r& zQF=Sop1|cv0?ow6gKfGmj1wB>?`+i^M9R{S687QsR^S1b#m7XMmS_@*RL510-wWZ1fDny{}*HaFpBMFK86t!{tweAz+u!vpi;Xx!`KcyaTxwvcYhfE z5AcYWL*M`19&vsk{g#8Hyl3wh!2RDElK*R|ZuulL#t&T*b3hy#_%k_J3Oq3fI}+rX zgMA5n=HLt9i8;uQG|v>Lau9HzuXEu4T!%3+2OA-fm;-#3;EWvjFV88@sq}xDMEoFd z{|8RQKLB2w+&n-Fr510Eqxz#e@KY?c_S4K5KW<9Q0dbuIh;TWlrkt4r|Ev3S!5oZD z;4=rSf%{|Z0DK#8f3-3PO$mIR1OKN9G{_wIziuGTY$6Cbqw+h_b(?G;>`)L(F|Q7NC3((&`M7{8Y6 zXJjP|90E=P4b%bu1bCH)Zvox~Uooxr@E-%8mw-P3-2VzH^?wH3|GF&ky}-%-s^eeFGW?%fWFpM_KwYOM{Izq;|5*d6uYl_R zGPou1KLJ01AJVKrWaJ+Q?pq=MYvBG5d&!TW{EiBlA2Sor1V*p-az-M*G`w)TuS@Y*MMlI@t(_M-aUO~x+JvFZp7y{L+%+Vv+j9Qrd!$F?)g|& zI6Y91LOnJWO4-t`#L4yFH}#jY+$x#BX@-;)R>dQm?m{moZThK{_zLx}u>Ll^0||S? sepuTSwq&`ycT-18wy`chwrPw7o#el4T8dtNwdrAy?L()8I8L|!1w~$L#sB~S delta 19646 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 From 1ab0672b75aa1cfe4f30fc2a8f377c8d7b3d1162 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Mon, 15 Sep 2025 12:49:29 +0200 Subject: [PATCH 19/69] updates dbt-rise-core --- .gitignore | 1 + .vscode/launch.json | 18 ++++++++++++++++++ CMakeLists.txt | 6 +++++- dbt-rise-riscv | 2 +- src/sc_main.cpp | 2 +- 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 8c518be..14352b6 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ CMakeSettings.json .clangd /install .gdb_history +/dbt-rise-custom diff --git a/.vscode/launch.json b/.vscode/launch.json index 2254b56..caf1d61 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -79,6 +79,24 @@ "program": "${workspaceFolder}/build/Debug/src/riscv-vp", "arguments": "-v DEBUG --isa 'tgc5c|mu_p' --backend asmjit -f fw/hello-world/hello.elf", "openGdbConsole": true + }, + { + "type": "gdb", + "request": "launch", + "name": "RISCV-VP report ISA", + "cwd": "${workspaceRoot}", + "program": "${workspaceFolder}/build/Debug/src/riscv-vp", + "arguments": "--isa ?", + "openGdbConsole": true + }, + { + "type": "gdb", + "request": "launch", + "name": "RISCV-SIM report ISA", + "cwd": "${workspaceRoot}", + "program": "${workspaceFolder}/build/Debug/dbt-rise-riscv/riscv-sim", + "arguments": "--isa ?", + "openGdbConsole": true } ], "compounds": [ diff --git a/CMakeLists.txt b/CMakeLists.txt index 7418014..77bd66b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,7 @@ project(riscv-vp LANGUAGES C CXX VERSION 1.0.0) option(LIBS_ONLY "Just build the shared libraries needed to build the VP" OFF) option(ENABLE_COVERAGE "Enable code coverage" OFF) option(ENABLE_SANITIZER "Enable address sanitizer" OFF) +option(ENABLE_CLANGFORMAT "Enable code formatting using clang-format." OFF) option(ENABLE_CLANGTIDY "Enable static analysis with clang-tidy." OFF) option(ENABLE_FW_BUILD "Enable build of firmware of MIRES Firmware repo." OFF) option(ENABLE_GPROF "Enable gprof profiling" OFF) @@ -77,7 +78,10 @@ if(NOT LIBS_ONLY) add_subdirectory(src) endif() -find_package(ClangFormat) +if(ENABLE_CLANGFORMAT) + set(CLANG_FORMAT_EXCLUDE_PATTERNS "/scc/" "/build/" "/.direnv/") + find_package(ClangFormat) +endif() if(FW_BUILD) include(FetchContent) diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 45dc8bd..054ef54 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 45dc8bd3fd093207b6d11c97c0de2fb85a2fe627 +Subproject commit 054ef548d79856e482b62902c0aad262122f5280 diff --git a/src/sc_main.cpp b/src/sc_main.cpp index 21c2276..e5094bb 100644 --- a/src/sc_main.cpp +++ b/src/sc_main.cpp @@ -143,7 +143,7 @@ int sc_main(int argc, char* argv[]) { sc_core::sc_start(scc::parse_from_string(parser.get("max_time"))); } else sc_core::sc_start(); - if(!sc_core::sc_end_of_simulation_invoked()) + if(sc_core::sc_start_of_simulation_invoked() && !sc_core::sc_end_of_simulation_invoked()) sc_core::sc_stop(); } catch(sc_core::sc_report& rep) { sc_core::sc_report_handler::get_handler()(rep, sc_core::SC_DISPLAY | sc_core::SC_STOP); From 51d9b9b97bdac2d4d0b60bd9f2bec39a008e63ae Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Mon, 15 Sep 2025 12:52:11 +0200 Subject: [PATCH 20/69] updates submodules --- dbt-rise-riscv | 2 +- scc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 054ef54..de00067 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 054ef548d79856e482b62902c0aad262122f5280 +Subproject commit de0006785ab1b8ef562c143803f3c152ab493a60 diff --git a/scc b/scc index 214d4fc..323dcb3 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit 214d4fc7b0faad1918ef42ecda34b046569c6642 +Subproject commit 323dcb3bf3cb3a1bb4668d0f0b6ee4ffb4455c85 From 68d6aab4c53891b16c26af4f1bb75b0f0acaf6d5 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Mon, 15 Sep 2025 20:54:39 +0200 Subject: [PATCH 21/69] updates dbt-rise-riscv --- .vscode/launch.json | 19 ++++++++++++++----- dbt-rise-riscv | 2 +- fw/hello-world/Makefile | 4 ++-- fw/hello-world/hello.elf | Bin 66392 -> 63440 bytes 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index caf1d61..14723ae 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -11,7 +11,7 @@ }, "target": { "server": "${workspaceFolder}/build/RelWithDebInfo/src/riscv-vp", - "serverParameters": ["--isa", "rv32gc|msu_vp", "-v", "INFO", "--disass", "-f", "fw/hello-world/hello.elf", "-g", "10000"], + "serverParameters": ["--isa", "rv32gc_msu", "-v", "INFO", "-f", "fw/hello-world/hello.elf", "-g", "10000"], "watchServerProcess": true, "port": "10000" }, @@ -50,7 +50,16 @@ "name": "32bit VP with gdbserver", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "--isa 'rv32gc|msu_vp' -v INFO --disass -f fw/hello-world/hello.elf -g 10000", + "arguments": "--isa 'rv32gc_msu' -v INFO --disass -f fw/hello-world/hello.elf -g 10000", + "openGdbConsole": true + }, + { + "type": "gdb", + "request": "launch", + "name": "32bit VP", + "cwd": "${workspaceRoot}", + "program": "${workspaceFolder}/build/Debug/src/riscv-vp", + "arguments": "--isa 'rv32gc_msu' -v INFO --disass -f fw/hello-world/hello.elf", "openGdbConsole": true }, { @@ -59,7 +68,7 @@ "name": "64bit VP with gdbserver", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "--isa 'rv64gc|msu_vp' -v INFO --disass -f fw/hello-world/hello.elf -g 10000", + "arguments": "--isa 'rv64gc_msu' -v INFO --disass -f fw/hello-world/hello.elf -g 10000", "openGdbConsole": true }, { @@ -68,7 +77,7 @@ "name": "TGC5 VP", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "-v DEBUG -t 3 --isa 'tgc5c|mu_p' -f fw/hello-world/hello.elf", + "arguments": "-v DEBUG -t 3 --isa 'tgc5c_mu' -f fw/hello-world/hello.elf", "openGdbConsole": true }, { @@ -77,7 +86,7 @@ "name": "TGC5 VP (asmjit)", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "-v DEBUG --isa 'tgc5c|mu_p' --backend asmjit -f fw/hello-world/hello.elf", + "arguments": "-v DEBUG --isa 'tgc5c_mu' --backend asmjit -f fw/hello-world/hello.elf", "openGdbConsole": true }, { diff --git a/dbt-rise-riscv b/dbt-rise-riscv index de00067..29aac88 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit de0006785ab1b8ef562c143803f3c152ab493a60 +Subproject commit 29aac88dbd62e59814430fec38a0397549b978a6 diff --git a/fw/hello-world/Makefile b/fw/hello-world/Makefile index f980993..47ca309 100644 --- a/fw/hello-world/Makefile +++ b/fw/hello-world/Makefile @@ -2,10 +2,10 @@ TARGET = hello C_SRCS = $(wildcard *.c) HEADERS = $(wildcard *.h) -CFLAGS += -O0 -g +CFLAGS += -Og -g BOARD=riscv_vp -LINK_TARGET=flash +LINK_TARGET=rom RISCV_ARCH:=rv32imc RISCV_ABI:=ilp32 #RISCV_ARCH:=rv64imc diff --git a/fw/hello-world/hello.elf b/fw/hello-world/hello.elf index 2dcce5411fe1f2283e1919d4b52270e607e2821c..6ecfd97b9b84fa5a965096fd689277a4c427220c 100755 GIT binary patch literal 63440 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 O?T-FQyDE@^?fwO|*E@g! literal 66392 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 AY5)KL From 3ef72aa4341225adddfb46117b43d7e392c9fcb1 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Tue, 16 Sep 2025 07:50:29 +0200 Subject: [PATCH 22/69] updates dnt-rise-riscv --- dbt-rise-riscv | 2 +- fw/hello-world/hello.elf | Bin 63440 -> 63440 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 29aac88..bfce933 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 29aac88dbd62e59814430fec38a0397549b978a6 +Subproject commit bfce933b60ad4cf999e1d73d4f581c658d1ee560 diff --git a/fw/hello-world/hello.elf b/fw/hello-world/hello.elf index 6ecfd97b9b84fa5a965096fd689277a4c427220c..719abb960a1703f0ede923033b49381c6ec0d034 100755 GIT binary patch delta 14058 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 Zr_Vb8J+L$Ud{6|T{McWL_x$C6{r~a9)Y||6 delta 14059 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 Date: Sun, 5 Oct 2025 19:52:42 +0200 Subject: [PATCH 23/69] updates submodules --- .vscode/launch.json | 7 +++---- .vscode/settings.json | 9 +++++++-- CMakeLists.txt | 4 ++-- dbt-rise-core | 2 +- dbt-rise-riscv | 2 +- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 14723ae..5d591bc 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -17,7 +17,7 @@ }, "cwd": "${workspaceRoot}", "gdb": "riscv64-unknown-elf-gdb", - "openGdbConsole": true, + "openGdbConsole": false, "presentation": { "hidden": false, "group": "FW Debug", @@ -37,7 +37,7 @@ }, "cwd": "${workspaceRoot}", "gdb": "riscv64-unknown-elf-gdb", - "openGdbConsole": true, + "openGdbConsole": false, "presentation": { "hidden": false, "group": "FW Debug", @@ -59,8 +59,7 @@ "name": "32bit VP", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "--isa 'rv32gc_msu' -v INFO --disass -f fw/hello-world/hello.elf", - "openGdbConsole": true + "arguments": "--isa 'rv32gc_msu' -v INFO --disass -f fw/hello-world/hello.elf" }, { "type": "gdb", diff --git a/.vscode/settings.json b/.vscode/settings.json index 347762a..a1543ea 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,6 +9,7 @@ "comment": "clang-format" } ], + "editor.formatOnSave": true, "clangd.arguments": [ "--pretty", "--background-index", @@ -17,7 +18,11 @@ "cmake.copyCompileCommands": "${workspaceFolder}/build/compile_commands.json", "cmake.options.statusBarVisibility": "hidden", "cmake.options.advanced": { - "configure": {"projectStatusVisibility": "visible"}, - "build": {"statusBarVisibility": "visible"} + "configure": { + "projectStatusVisibility": "visible" + }, + "build": { + "statusBarVisibility": "visible" + } } } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 77bd66b..b81526c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,8 +21,8 @@ include(GNUInstallDirs) # add address sanitizer if(ENABLE_SANITIZER) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer -fsanitize=address,thread") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -fsanitize=address,thread") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer -fsanitize=address") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -fsanitize=address") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address") endif() diff --git a/dbt-rise-core b/dbt-rise-core index e60892d..83eb45b 160000 --- a/dbt-rise-core +++ b/dbt-rise-core @@ -1 +1 @@ -Subproject commit e60892d2f9645231d24b02c864b6583ffda0c327 +Subproject commit 83eb45bb3e393eb979b44e97ba08da8460eedea4 diff --git a/dbt-rise-riscv b/dbt-rise-riscv index bfce933..8a884ed 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit bfce933b60ad4cf999e1d73d4f581c658d1ee560 +Subproject commit 8a884edb80f04a75a78658bef6ec63e455d1c530 From fc66bcbf489ce84e5ce84b7634b250a593a49fb0 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Tue, 7 Oct 2025 16:18:17 +0200 Subject: [PATCH 24/69] sets mt core complex --- .vscode/launch.json | 9 +++++++++ dbt-rise-core | 2 +- dbt-rise-riscv | 2 +- scc | 2 +- src/vp/system.h | 4 ++-- 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 488d4f1..8c75ebd 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -30,6 +30,15 @@ "arguments": "--isa 'rv32gc|msu_vp' -v INFO --disass -f fw/hello-world/hello.elf -g 10000", "openGdbConsole": true }, + { + "type": "gdb", + "request": "launch", + "name": "32bit VP", + "cwd": "${workspaceRoot}", + "program": "${workspaceFolder}/build/Debug/src/riscv-vp", + "arguments": "--isa 'rv32gc_msu' -v INFO --disass -f fw/hello-world/hello.elf", + "initCommands": ["info break"] + }, { "type": "gdb", "request": "launch", diff --git a/dbt-rise-core b/dbt-rise-core index b0fd676..83eb45b 160000 --- a/dbt-rise-core +++ b/dbt-rise-core @@ -1 +1 @@ -Subproject commit b0fd6762be2a39e4b05667f71778be4fb1bd6019 +Subproject commit 83eb45bb3e393eb979b44e97ba08da8460eedea4 diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 23b00ad..06fe403 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 23b00add2353b06fae4e7109c97879919be43720 +Subproject commit 06fe403e69ac61254e951b9751d567c166ce07dd diff --git a/scc b/scc index badc373..658e195 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit badc373aae58a9745dac803862edb522e6674321 +Subproject commit 658e19539affeaaf9117d9405e6faf5ff796856b diff --git a/src/vp/system.h b/src/vp/system.h index e26bc66..03cc258 100644 --- a/src/vp/system.h +++ b/src/vp/system.h @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include #include @@ -48,7 +48,7 @@ public: system(sc_core::sc_module_name nm); private: - sysc::riscv::core_complex core_complex{"core_complex"}; + sysc::riscv::core_complex_mt<> core_complex{"core_complex"}; scc::router<> ahb_router, apbBridge; vpvper::minres::gpio_tl gpio0{"gpio0"}; vpvper::minres::uart_tl uart0{"uart0"}; From d8d55105f1dc0109b29840d60c411538b91036a6 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 15 Aug 2025 11:49:11 +0200 Subject: [PATCH 25/69] corrects tasks in tasks.json --- .vscode/tasks.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 1d8974f..5b079fd 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -32,7 +32,7 @@ { "label": "Run 32bit VP", "type": "shell", - "command": "build/Debug/src/riscv-vp --isa 'rv32gc|msu_vp' -f fw/hello-world/hello.elf -p pctrace=contrib/TGC_C_cycles.json", + "command": "build/Debug/src/riscv-vp --isa 'rv32gc|msu_vp' -f fw/hello-world/hello.elf", "problemMatcher": [], "presentation": { "echo": true, @@ -46,7 +46,7 @@ { "label": "Run 64bit VP", "type": "shell", - "command": "build/Debug/src/riscv-vp --isa 'rv64gc|msu_vp' -f fw/hello-world/hello.elf -p pctrace=contrib/TGC_C_cycles.json", + "command": "build/Debug/src/riscv-vp --isa 'rv64gc|msu_vp' -f fw/hello-world/hello.elf", "problemMatcher": [], "presentation": { "echo": true, From 5a8db5017595095f91254c6a12579fa8086d277d Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 13 Sep 2025 15:41:54 +0200 Subject: [PATCH 26/69] updates submodules --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 371559b..8c518be 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ CMakeSettings.json /.envrc.* .clangd /install +.gdb_history From 5dfe2285e5d617b81a67e901cac31c77b48df06e Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 14 Sep 2025 14:57:26 +0200 Subject: [PATCH 27/69] adds standalone FW Debug launch --- .vscode/launch.json | 27 +++++++++++++++++++++++++-- fw/hello-world/hello.elf | Bin 66276 -> 66392 bytes 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 8c75ebd..b383420 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,6 +1,29 @@ { "version": "0.2.0", "configurations": [ + { + "type": "gdbtarget", + "request": "launch", + "name": "Debug hello world 32bit", + "program": "fw/hello-world/hello.elf", + "imageAndSymbols": { + "symbolFileName": "fw/hello-world/hello.elf" + }, + "target": { + "server": "${workspaceFolder}/build/RelWithDebInfo/src/riscv-vp", + "serverParameters": ["--isa", "rv32gc|msu_vp", "-v", "INFO", "--disass", "-f", "fw/hello-world/hello.elf", "-g", "10000"], + "watchServerProcess": true, + "port": "10000" + }, + "cwd": "${workspaceRoot}", + "gdb": "riscv64-unknown-elf-gdb", + "openGdbConsole": true, + "presentation": { + "hidden": false, + "group": "FW Debug", + "order": 2 + },"initCommands": ["b main"] + }, { "type": "gdbtarget", "request": "attach", @@ -70,11 +93,11 @@ "compounds": [ { "name": "FW-Debug 32bit", - "configurations": ["32bit VP with gdbserver", "Attach to VP"] + "configurations": ["32bit VP with gdbserver", "Attach GDB to VP"] }, { "name": "FW-Debug 64bit", - "configurations": ["64bit VP with gdbserver", "Attach to VP"] + "configurations": ["64bit VP with gdbserver", "Attach GDB to VP"] } ] } \ No newline at end of file diff --git a/fw/hello-world/hello.elf b/fw/hello-world/hello.elf index 416242266bdf2f932188900192ae481d1a8ac09a..2dcce5411fe1f2283e1919d4b52270e607e2821c 100755 GIT binary patch delta 20172 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
      9d$5x!b`K*1 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 delta 19646 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 From 6d968ce9d622022174fbd79075a9dedd5ca10e38 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Mon, 15 Sep 2025 12:49:29 +0200 Subject: [PATCH 28/69] updates dbt-rise-core --- .gitignore | 1 + .vscode/launch.json | 18 ++++++++++++++++++ CMakeLists.txt | 6 +++++- src/sc_main.cpp | 2 +- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 8c518be..14352b6 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ CMakeSettings.json .clangd /install .gdb_history +/dbt-rise-custom diff --git a/.vscode/launch.json b/.vscode/launch.json index b383420..e30f69b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -88,6 +88,24 @@ "program": "${workspaceFolder}/build/Debug/src/riscv-vp", "arguments": "-v DEBUG --isa 'tgc5c|mu_p' --backend asmjit -f fw/hello-world/hello.elf", "openGdbConsole": true + }, + { + "type": "gdb", + "request": "launch", + "name": "RISCV-VP report ISA", + "cwd": "${workspaceRoot}", + "program": "${workspaceFolder}/build/Debug/src/riscv-vp", + "arguments": "--isa ?", + "openGdbConsole": true + }, + { + "type": "gdb", + "request": "launch", + "name": "RISCV-SIM report ISA", + "cwd": "${workspaceRoot}", + "program": "${workspaceFolder}/build/Debug/dbt-rise-riscv/riscv-sim", + "arguments": "--isa ?", + "openGdbConsole": true } ], "compounds": [ diff --git a/CMakeLists.txt b/CMakeLists.txt index 7418014..77bd66b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,7 @@ project(riscv-vp LANGUAGES C CXX VERSION 1.0.0) option(LIBS_ONLY "Just build the shared libraries needed to build the VP" OFF) option(ENABLE_COVERAGE "Enable code coverage" OFF) option(ENABLE_SANITIZER "Enable address sanitizer" OFF) +option(ENABLE_CLANGFORMAT "Enable code formatting using clang-format." OFF) option(ENABLE_CLANGTIDY "Enable static analysis with clang-tidy." OFF) option(ENABLE_FW_BUILD "Enable build of firmware of MIRES Firmware repo." OFF) option(ENABLE_GPROF "Enable gprof profiling" OFF) @@ -77,7 +78,10 @@ if(NOT LIBS_ONLY) add_subdirectory(src) endif() -find_package(ClangFormat) +if(ENABLE_CLANGFORMAT) + set(CLANG_FORMAT_EXCLUDE_PATTERNS "/scc/" "/build/" "/.direnv/") + find_package(ClangFormat) +endif() if(FW_BUILD) include(FetchContent) diff --git a/src/sc_main.cpp b/src/sc_main.cpp index 21c2276..e5094bb 100644 --- a/src/sc_main.cpp +++ b/src/sc_main.cpp @@ -143,7 +143,7 @@ int sc_main(int argc, char* argv[]) { sc_core::sc_start(scc::parse_from_string(parser.get("max_time"))); } else sc_core::sc_start(); - if(!sc_core::sc_end_of_simulation_invoked()) + if(sc_core::sc_start_of_simulation_invoked() && !sc_core::sc_end_of_simulation_invoked()) sc_core::sc_stop(); } catch(sc_core::sc_report& rep) { sc_core::sc_report_handler::get_handler()(rep, sc_core::SC_DISPLAY | sc_core::SC_STOP); From f9caff073e5ab08eee4c25f5de438223b3261efe Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Mon, 15 Sep 2025 20:54:39 +0200 Subject: [PATCH 29/69] updates dbt-rise-riscv --- .vscode/launch.json | 19 ++++++++++++++----- fw/hello-world/Makefile | 4 ++-- fw/hello-world/hello.elf | Bin 66392 -> 63440 bytes 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index e30f69b..b382cd0 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -11,7 +11,7 @@ }, "target": { "server": "${workspaceFolder}/build/RelWithDebInfo/src/riscv-vp", - "serverParameters": ["--isa", "rv32gc|msu_vp", "-v", "INFO", "--disass", "-f", "fw/hello-world/hello.elf", "-g", "10000"], + "serverParameters": ["--isa", "rv32gc_msu", "-v", "INFO", "-f", "fw/hello-world/hello.elf", "-g", "10000"], "watchServerProcess": true, "port": "10000" }, @@ -50,7 +50,16 @@ "name": "32bit VP with gdbserver", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "--isa 'rv32gc|msu_vp' -v INFO --disass -f fw/hello-world/hello.elf -g 10000", + "arguments": "--isa 'rv32gc_msu' -v INFO --disass -f fw/hello-world/hello.elf -g 10000", + "openGdbConsole": true + }, + { + "type": "gdb", + "request": "launch", + "name": "32bit VP", + "cwd": "${workspaceRoot}", + "program": "${workspaceFolder}/build/Debug/src/riscv-vp", + "arguments": "--isa 'rv32gc_msu' -v INFO --disass -f fw/hello-world/hello.elf", "openGdbConsole": true }, { @@ -68,7 +77,7 @@ "name": "64bit VP with gdbserver", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "--isa 'rv64gc|msu_vp' -v INFO --disass -f fw/hello-world/hello.elf -g 10000", + "arguments": "--isa 'rv64gc_msu' -v INFO --disass -f fw/hello-world/hello.elf -g 10000", "openGdbConsole": true }, { @@ -77,7 +86,7 @@ "name": "TGC5 VP", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "-v DEBUG -t 3 --isa 'tgc5c|mu_p' -f fw/hello-world/hello.elf", + "arguments": "-v DEBUG -t 3 --isa 'tgc5c_mu' -f fw/hello-world/hello.elf", "openGdbConsole": true }, { @@ -86,7 +95,7 @@ "name": "TGC5 VP (asmjit)", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "-v DEBUG --isa 'tgc5c|mu_p' --backend asmjit -f fw/hello-world/hello.elf", + "arguments": "-v DEBUG --isa 'tgc5c_mu' --backend asmjit -f fw/hello-world/hello.elf", "openGdbConsole": true }, { diff --git a/fw/hello-world/Makefile b/fw/hello-world/Makefile index f980993..47ca309 100644 --- a/fw/hello-world/Makefile +++ b/fw/hello-world/Makefile @@ -2,10 +2,10 @@ TARGET = hello C_SRCS = $(wildcard *.c) HEADERS = $(wildcard *.h) -CFLAGS += -O0 -g +CFLAGS += -Og -g BOARD=riscv_vp -LINK_TARGET=flash +LINK_TARGET=rom RISCV_ARCH:=rv32imc RISCV_ABI:=ilp32 #RISCV_ARCH:=rv64imc diff --git a/fw/hello-world/hello.elf b/fw/hello-world/hello.elf index 2dcce5411fe1f2283e1919d4b52270e607e2821c..6ecfd97b9b84fa5a965096fd689277a4c427220c 100755 GIT binary patch literal 63440 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 O?T-FQyDE@^?fwO|*E@g! literal 66392 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 AY5)KL From b966050ae980b4ed0cb7191a8ebbf3e261c3d8f3 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Tue, 16 Sep 2025 07:50:29 +0200 Subject: [PATCH 30/69] updates dnt-rise-riscv --- fw/hello-world/hello.elf | Bin 63440 -> 63440 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fw/hello-world/hello.elf b/fw/hello-world/hello.elf index 6ecfd97b9b84fa5a965096fd689277a4c427220c..719abb960a1703f0ede923033b49381c6ec0d034 100755 GIT binary patch delta 14058 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 Zr_Vb8J+L$Ud{6|T{McWL_x$C6{r~a9)Y||6 delta 14059 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 Date: Sun, 5 Oct 2025 19:52:42 +0200 Subject: [PATCH 31/69] updates submodules --- .vscode/launch.json | 7 +++---- .vscode/settings.json | 9 +++++++-- CMakeLists.txt | 4 ++-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index b382cd0..22b2bfe 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -17,7 +17,7 @@ }, "cwd": "${workspaceRoot}", "gdb": "riscv64-unknown-elf-gdb", - "openGdbConsole": true, + "openGdbConsole": false, "presentation": { "hidden": false, "group": "FW Debug", @@ -37,7 +37,7 @@ }, "cwd": "${workspaceRoot}", "gdb": "riscv64-unknown-elf-gdb", - "openGdbConsole": true, + "openGdbConsole": false, "presentation": { "hidden": false, "group": "FW Debug", @@ -59,8 +59,7 @@ "name": "32bit VP", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "--isa 'rv32gc_msu' -v INFO --disass -f fw/hello-world/hello.elf", - "openGdbConsole": true + "arguments": "--isa 'rv32gc_msu' -v INFO --disass -f fw/hello-world/hello.elf" }, { "type": "gdb", diff --git a/.vscode/settings.json b/.vscode/settings.json index 347762a..a1543ea 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,6 +9,7 @@ "comment": "clang-format" } ], + "editor.formatOnSave": true, "clangd.arguments": [ "--pretty", "--background-index", @@ -17,7 +18,11 @@ "cmake.copyCompileCommands": "${workspaceFolder}/build/compile_commands.json", "cmake.options.statusBarVisibility": "hidden", "cmake.options.advanced": { - "configure": {"projectStatusVisibility": "visible"}, - "build": {"statusBarVisibility": "visible"} + "configure": { + "projectStatusVisibility": "visible" + }, + "build": { + "statusBarVisibility": "visible" + } } } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 77bd66b..b81526c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,8 +21,8 @@ include(GNUInstallDirs) # add address sanitizer if(ENABLE_SANITIZER) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer -fsanitize=address,thread") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -fsanitize=address,thread") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer -fsanitize=address") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -fsanitize=address") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address") endif() From 24a796cf54a2c187b01f09cc720d6972be86551c Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 15 Aug 2025 11:50:42 +0200 Subject: [PATCH 32/69] changes instantiation to mt --- .launch/TGC-VP interp.launch | 49 ++++++++++++++++++++++ .launch/TGC-VP-FW-Debug dhrystone.launch | 52 ++++++++++++++++++++++++ Linux.code-workspace | 13 ++++++ dbt-rise-riscv | 2 +- scc | 2 +- src/mcount.c | 9 ++++ 6 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 .launch/TGC-VP interp.launch create mode 100644 .launch/TGC-VP-FW-Debug dhrystone.launch create mode 100644 Linux.code-workspace create mode 100644 src/mcount.c diff --git a/.launch/TGC-VP interp.launch b/.launch/TGC-VP interp.launch new file mode 100644 index 0000000..11d0f2d --- /dev/null +++ b/.launch/TGC-VP interp.launch @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.launch/TGC-VP-FW-Debug dhrystone.launch b/.launch/TGC-VP-FW-Debug dhrystone.launch new file mode 100644 index 0000000..ced7812 --- /dev/null +++ b/.launch/TGC-VP-FW-Debug dhrystone.launch @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Linux.code-workspace b/Linux.code-workspace new file mode 100644 index 0000000..39c5ea3 --- /dev/null +++ b/Linux.code-workspace @@ -0,0 +1,13 @@ +{ + "folders": [ + { + "path": "build/Linux4TGC/buildroot" + }, + { + "path": "build/Linux4TGC/opensbi" + }, + { + "path": "build/Linux4TGC/linux" + } + ] +} \ No newline at end of file diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 06fe403..8a884ed 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 06fe403e69ac61254e951b9751d567c166ce07dd +Subproject commit 8a884edb80f04a75a78658bef6ec63e455d1c530 diff --git a/scc b/scc index 658e195..323dcb3 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit 658e19539affeaaf9117d9405e6faf5ff796856b +Subproject commit 323dcb3bf3cb3a1bb4668d0f0b6ee4ffb4455c85 diff --git a/src/mcount.c b/src/mcount.c new file mode 100644 index 0000000..b762e07 --- /dev/null +++ b/src/mcount.c @@ -0,0 +1,9 @@ +/* The canonical name for the function is `_mcount' in both C and asm, + but some old asm code might assume it's `mcount'. */ +void _mcount (void); +weak_alias (_mcount, mcount); + +void _mcount (void) +{ + mcount_internal ((u_long) __builtin_return_address (1), (u_long) __builtin_return_address(0)); +} From c8d9924b9afaeb63c8ac58a6020fa74792420136 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Tue, 7 Oct 2025 16:18:17 +0200 Subject: [PATCH 33/69] sets mt core complex --- .vscode/launch.json | 2 +- scc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 22b2bfe..0130b1b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -126,4 +126,4 @@ "configurations": ["64bit VP with gdbserver", "Attach GDB to VP"] } ] -} \ No newline at end of file +} diff --git a/scc b/scc index 323dcb3..658e195 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit 323dcb3bf3cb3a1bb4668d0f0b6ee4ffb4455c85 +Subproject commit 658e19539affeaaf9117d9405e6faf5ff796856b From 3ae391151d0cc5622a9071c9ce0de442691c403d Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 11 Oct 2025 09:27:01 +0200 Subject: [PATCH 34/69] updates submodules --- .vscode/launch.json | 2 +- .vscode/settings.json | 1 + dbt-rise-riscv | 2 +- scc | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 8c75ebd..646e817 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -37,7 +37,7 @@ "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", "arguments": "--isa 'rv32gc_msu' -v INFO --disass -f fw/hello-world/hello.elf", - "initCommands": ["info break"] + "openGdbConsole": true }, { "type": "gdb", diff --git a/.vscode/settings.json b/.vscode/settings.json index 347762a..e252bf8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,6 +9,7 @@ "comment": "clang-format" } ], + "editor.formatOnSave": true, "clangd.arguments": [ "--pretty", "--background-index", diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 06fe403..218f652 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 06fe403e69ac61254e951b9751d567c166ce07dd +Subproject commit 218f65211c80d21b93d79add3ae56d082b4f6adb diff --git a/scc b/scc index 658e195..89b2b48 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit 658e19539affeaaf9117d9405e6faf5ff796856b +Subproject commit 89b2b48cdfcf5f79dd278b5749f9b04c521af639 From b3c91220ff154fa15a945cfd556bd7e998cf439d Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch <97940321+EAlexJ@users.noreply.github.com> Date: Mon, 20 Oct 2025 13:19:15 +0200 Subject: [PATCH 35/69] Change C++ standard from 20 to 17 in CMake presets As this causes Issues when installing from scratch with version miss-match with systemc and no C++20 features are used --- CMakePresets.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index 4bc9be5..b0b1ff5 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -15,7 +15,7 @@ "binaryDir": "${sourceDir}/build/${presetName}", "cacheVariables": { "CMAKE_POLICY_DEFAULT_CMP0091": "NEW", - "CMAKE_CXX_STANDARD": "20", + "CMAKE_CXX_STANDARD": "17", "CMAKE_INSTALL_PREFIX": "${sourceDir}/install/${presetName}", "CMAKE_EXPORT_COMPILE_COMMANDS": "ON", "CMAKE_PROJECT_TOP_LEVEL_INCLUDES": "scc/cmake/conan_provider.cmake", @@ -48,4 +48,4 @@ } } ] -} \ No newline at end of file +} From 4ebf3a0e9df5034425fc430c449aa6ab22413ff3 Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch Date: Mon, 20 Oct 2025 15:02:21 +0200 Subject: [PATCH 36/69] corrects default selection for backend wrt most recent dbt-rise-riscv changes --- src/CLIParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CLIParser.cpp b/src/CLIParser.cpp index fa2ddea..4e0afa5 100644 --- a/src/CLIParser.cpp +++ b/src/CLIParser.cpp @@ -82,7 +82,7 @@ void CLIParser::build() { "enable gdb server and specify port to use") ("backend", po::value()->default_value("interp"), "the ISS backend to use, options are: interp, tcc") - ("isa", po::value()->default_value("rv32imac"), + ("isa", po::value()->default_value("rv32imac_m"), "core or isa name to use for simulation, use '?' to get list") ("dump-ir", "dump the intermediate representation") From 1e84bfba078145d8adc937085bb2c33d6f56ab32 Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch Date: Mon, 20 Oct 2025 15:03:42 +0200 Subject: [PATCH 37/69] corrects CMakeLists.txt to use the defined option for fw building --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b81526c..ce8212c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -83,7 +83,7 @@ if(ENABLE_CLANGFORMAT) find_package(ClangFormat) endif() -if(FW_BUILD) +if(ENABLE_FW_BUILD) include(FetchContent) set(FETCHCONTENT_BASE_DIR ${CMAKE_CURRENT_BINARY_DIR}/..) FetchContent_Declare( From 1796807792f3fcc9cf3e88d887b6f3b5ed2816da Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Tue, 21 Oct 2025 16:16:09 +0200 Subject: [PATCH 38/69] sets also conan host profile --- CMakePresets.json | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakePresets.json b/CMakePresets.json index 4bc9be5..c18e91a 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -19,6 +19,7 @@ "CMAKE_INSTALL_PREFIX": "${sourceDir}/install/${presetName}", "CMAKE_EXPORT_COMPILE_COMMANDS": "ON", "CMAKE_PROJECT_TOP_LEVEL_INCLUDES": "scc/cmake/conan_provider.cmake", + "CONAN_HOST_PROFILE": "auto-cmake", "CONAN_BUILD_PROFILE": "auto-cmake", "WITH_TCC": "OFF" } From 1bbcbc9a693aee7d38e54a8664aa4e7309d7229b Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Tue, 21 Oct 2025 16:42:52 +0200 Subject: [PATCH 39/69] changes build profile setting to conan_host_profile --- CMakePresets.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakePresets.json b/CMakePresets.json index c18e91a..30500ed 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -20,7 +20,8 @@ "CMAKE_EXPORT_COMPILE_COMMANDS": "ON", "CMAKE_PROJECT_TOP_LEVEL_INCLUDES": "scc/cmake/conan_provider.cmake", "CONAN_HOST_PROFILE": "auto-cmake", - "CONAN_BUILD_PROFILE": "auto-cmake", + "CONAN_BUILD_PROFILE": "conan_host_profile", + "CMAKE_EXECUTE_PROCESS_COMMAND_ECHO": "STDOUT", "WITH_TCC": "OFF" } }, From db82473e954bf3dd634edd44b89fd0548215bef9 Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch Date: Tue, 28 Oct 2025 15:02:50 +0100 Subject: [PATCH 40/69] systemc now gets included when installing --- conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index c7e147e..33bc95e 100644 --- a/conanfile.py +++ b/conanfile.py @@ -33,7 +33,7 @@ class Pkg(ConanFile): "boost/*:without_timer": "True", "boost/*:without_type_erasure": "True", "boost/*:without_wave": "True", - "systemc/*:shared": "True", + "systemc/*:shared": "False", } def requirements(self): From 85b11cde334c27b15a7408b7bdbf1194b3ea4fd1 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Thu, 6 Nov 2025 17:36:09 +0100 Subject: [PATCH 41/69] updates submodules and applies respective fixes --- .vscode/launch.json | 34 ++++++++++++++++++++++++++++++---- dbt-rise-core | 2 +- dbt-rise-riscv | 2 +- scc | 2 +- src/CLIParser.cpp | 12 +++++------- src/sc_main.cpp | 12 ++++-------- 6 files changed, 42 insertions(+), 22 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 5d591bc..dbae280 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,6 +1,14 @@ { "version": "0.2.0", "configurations": [ + { + "type": "gdb", + "request": "launch", + "name": "riscv-sim hello.elf", + "program": "${workspaceFolder}/build/Debug/dbt-rise-riscv/riscv-sim", + "arguments": "-f dbt-rise-riscv/contrib/fw/hello-world/hello.elf", + "cwd": "${workspaceFolder}" + }, { "type": "gdbtarget", "request": "launch", @@ -11,7 +19,16 @@ }, "target": { "server": "${workspaceFolder}/build/RelWithDebInfo/src/riscv-vp", - "serverParameters": ["--isa", "rv32gc_msu", "-v", "INFO", "-f", "fw/hello-world/hello.elf", "-g", "10000"], + "serverParameters": [ + "--isa", + "rv32gc_msu", + "-v", + "INFO", + "-f", + "fw/hello-world/hello.elf", + "-g", + "10000" + ], "watchServerProcess": true, "port": "10000" }, @@ -22,7 +39,10 @@ "hidden": false, "group": "FW Debug", "order": 2 - },"initCommands": ["b main"] + }, + "initCommands": [ + "b main" + ] }, { "type": "gdbtarget", @@ -110,11 +130,17 @@ "compounds": [ { "name": "FW-Debug 32bit", - "configurations": ["32bit VP with gdbserver", "Attach GDB to VP"] + "configurations": [ + "32bit VP with gdbserver", + "Attach GDB to VP" + ] }, { "name": "FW-Debug 64bit", - "configurations": ["64bit VP with gdbserver", "Attach GDB to VP"] + "configurations": [ + "64bit VP with gdbserver", + "Attach GDB to VP" + ] } ] } \ No newline at end of file diff --git a/dbt-rise-core b/dbt-rise-core index 83eb45b..022150a 160000 --- a/dbt-rise-core +++ b/dbt-rise-core @@ -1 +1 @@ -Subproject commit 83eb45bb3e393eb979b44e97ba08da8460eedea4 +Subproject commit 022150a0d6571e996e18778afb443d67c13c900c diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 8a884ed..5c7bd9e 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 8a884edb80f04a75a78658bef6ec63e455d1c530 +Subproject commit 5c7bd9e7735889f1585ae34aab81b95f19fdbd0c diff --git a/scc b/scc index 323dcb3..f626f02 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit 323dcb3bf3cb3a1bb4668d0f0b6ee4ffb4455c85 +Subproject commit f626f0259f9ba70729e3102a085ec710a082492a diff --git a/src/CLIParser.cpp b/src/CLIParser.cpp index 4e0afa5..a3a5786 100644 --- a/src/CLIParser.cpp +++ b/src/CLIParser.cpp @@ -40,11 +40,9 @@ CLIParser::CLIParser(int argc, char* argv[]) } auto log_level = vm_["verbose"].as(); auto log_level_num = static_cast(log_level); - LOGGER(DEFAULT)::reporting_level() = logging::as_log_level(log_level_num > 6 ? 6 : log_level_num); - LOGGER(connection)::reporting_level() = - logging::as_log_level(log_level_num > 4 ? log_level_num - 1 : log_level_num); - LOGGER(dbt_rise_iss)::reporting_level() = - logging::as_log_level(log_level_num > 4 ? log_level_num - 1 : log_level_num); + LOGGER(DEFAULT)::set_reporting_level(logging::as_log_level(log_level_num > 6 ? 6 : log_level_num)); + LOGGER(connection)::set_reporting_level(logging::as_log_level(log_level_num > 4 ? log_level_num - 1 : log_level_num)); + LOGGER(dbt_rise_iss)::set_reporting_level(logging::as_log_level(log_level_num > 4 ? log_level_num - 1 : log_level_num)); /////////////////////////////////////////////////////////////////////////// // configure logging /////////////////////////////////////////////////////////////////////////// @@ -57,8 +55,8 @@ CLIParser::CLIParser(int argc, char* argv[]) scc::stream_redirection cerr_redir(std::cerr, scc::log::ERROR); sc_core::sc_report_handler::set_actions("/IEEE_Std_1666/deprecated", sc_core::SC_DO_NOTHING); sc_core::sc_report_handler::set_actions(sc_core::SC_ID_MORE_THAN_ONE_SIGNAL_DRIVER_, sc_core::SC_DO_NOTHING); - sc_core::sc_report_handler::set_actions(sc_core::SC_ERROR, sc_core::SC_LOG | sc_core::SC_CACHE_REPORT | - sc_core::SC_DISPLAY | sc_core::SC_STOP); + sc_core::sc_report_handler::set_actions(sc_core::SC_ERROR, + sc_core::SC_LOG | sc_core::SC_CACHE_REPORT | sc_core::SC_DISPLAY | sc_core::SC_STOP); } void CLIParser::build() { diff --git a/src/sc_main.cpp b/src/sc_main.cpp index e5094bb..b89c921 100644 --- a/src/sc_main.cpp +++ b/src/sc_main.cpp @@ -72,9 +72,8 @@ int sc_main(int argc, char* argv[]) { std::unique_ptr tracer; if(auto trace_level = parser.get("trace-level")) { auto file_name = parser.get("trace-file"); - auto enable_sig_trace = (trace_level & 0x1) != 0; // bit0 enables sig trace - auto tx_trace_type = - static_cast(trace_level >> 1); // bit3-bit1 define the kind of transaction trace + auto enable_sig_trace = (trace_level & 0x1) != 0; // bit0 enables sig trace + auto tx_trace_type = static_cast(trace_level >> 1); // bit3-bit1 define the kind of transaction trace auto trace_default_on = parser.is_set("trace-default-on"); if(parser.is_set("trace-default-off")) cfg.set_value("scc_tracer.default_trace_enable", false); @@ -102,8 +101,7 @@ int sc_main(int argc, char* argv[]) { cfg.configure(); std::unique_ptr dumper; if(parser.is_set("dump-structure")) - dumper.reset( - new scc::hierarchy_dumper(parser.get("dump-structure"), scc::hierarchy_dumper::D3JSON)); + dumper.reset(new scc::hierarchy_dumper(parser.get("dump-structure"), scc::hierarchy_dumper::D3JSON)); /////////////////////////////////////////////////////////////////////////// // overwrite config with command line settings /////////////////////////////////////////////////////////////////////////// @@ -121,13 +119,11 @@ int sc_main(int argc, char* argv[]) { tlm::tlm_global_quantum::instance().set(sc_core::sc_time(parser.get("quantum"), sc_core::SC_NS)); if(parser.is_set("reset")) { auto str = parser.get("reset"); - uint64_t start_address = - str.find("0x") == 0 ? std::stoull(str.substr(2), nullptr, 16) : std::stoull(str, nullptr, 10); + uint64_t start_address = str.find("0x") == 0 ? std::stoull(str.substr(2), nullptr, 16) : std::stoull(str, nullptr, 10); cfg.set_value(core_path + ".reset_address", start_address); } if(parser.is_set("disass")) { cfg.set_value(core_path + ".enable_disass", true); - LOGGER(disass)::reporting_level() = logging::INFO; auto file_name = parser.get("disass"); if(file_name.length() > 0) { LOG_OUTPUT(disass)::stream() = fopen(file_name.c_str(), "w"); From 7cb270a65bd1eaf54df8d776c53e09ca25d4646a Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 7 Nov 2025 11:52:36 +0100 Subject: [PATCH 42/69] updates submodules --- dbt-rise-core | 2 +- dbt-rise-riscv | 2 +- fw/hello-world/hello.elf | Bin 63440 -> 0 bytes 3 files changed, 2 insertions(+), 2 deletions(-) delete mode 100755 fw/hello-world/hello.elf diff --git a/dbt-rise-core b/dbt-rise-core index 022150a..17c0f71 160000 --- a/dbt-rise-core +++ b/dbt-rise-core @@ -1 +1 @@ -Subproject commit 022150a0d6571e996e18778afb443d67c13c900c +Subproject commit 17c0f71d400fbdaba9c7e7f40f88c3c08c1de56a diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 5c7bd9e..c0737a2 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 5c7bd9e7735889f1585ae34aab81b95f19fdbd0c +Subproject commit c0737a2f0096f48380238ff321a8aef1dc6432d8 diff --git a/fw/hello-world/hello.elf b/fw/hello-world/hello.elf deleted file mode 100755 index 719abb960a1703f0ede923033b49381c6ec0d034..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63440 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 From deb17913f6dcab157cb4f455f98fdd45dc20c297 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 21 Nov 2025 11:39:34 +0100 Subject: [PATCH 43/69] updates submodules and fixes trace setup --- dbt-rise-core | 2 +- dbt-rise-riscv | 2 +- src/sc_main.cpp | 5 ++--- vpvper | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/dbt-rise-core b/dbt-rise-core index 17c0f71..54518de 160000 --- a/dbt-rise-core +++ b/dbt-rise-core @@ -1 +1 @@ -Subproject commit 17c0f71d400fbdaba9c7e7f40f88c3c08c1de56a +Subproject commit 54518de7effb9b719f5169d51e51fb658e9085af diff --git a/dbt-rise-riscv b/dbt-rise-riscv index c0737a2..05f7051 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit c0737a2f0096f48380238ff321a8aef1dc6432d8 +Subproject commit 05f7051db2886ddc94cb8b6573f6b6cd6b995cb3 diff --git a/src/sc_main.cpp b/src/sc_main.cpp index b89c921..7f23ff3 100644 --- a/src/sc_main.cpp +++ b/src/sc_main.cpp @@ -72,14 +72,13 @@ int sc_main(int argc, char* argv[]) { std::unique_ptr tracer; if(auto trace_level = parser.get("trace-level")) { auto file_name = parser.get("trace-file"); - auto enable_sig_trace = (trace_level & 0x1) != 0; // bit0 enables sig trace - auto tx_trace_type = static_cast(trace_level >> 1); // bit3-bit1 define the kind of transaction trace auto trace_default_on = parser.is_set("trace-default-on"); if(parser.is_set("trace-default-off")) cfg.set_value("scc_tracer.default_trace_enable", false); cfg.set_value("scc_tracer.tx_trace_type", static_cast(scc::tracer::file_type::FTR)); cfg.set_value("scc_tracer.sig_trace_type", static_cast(scc::tracer::file_type::FST)); - tracer = scc::make_unique(file_name, tx_trace_type, enable_sig_trace); + tracer = scc::make_unique(file_name, static_cast(trace_level & 0x2), + static_cast(trace_level & 0x1)); } /////////////////////////////////////////////////////////////////////////// // instantiate top level diff --git a/vpvper b/vpvper index 923024b..6413f14 160000 --- a/vpvper +++ b/vpvper @@ -1 +1 @@ -Subproject commit 923024bd82902bd15f55dd5e108d5823cb0c4add +Subproject commit 6413f14b18658eab8223b30fbbe1216f6d26cc86 From 7cf4857c388ab3b9a3c1f43b9e60a891ea17384a Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 21 Nov 2025 18:12:56 +0100 Subject: [PATCH 44/69] updates submodule and adds abort handling in sc_main --- dbt-rise-riscv | 2 +- scc | 2 +- src/sc_main.cpp | 38 ++++++++++++++++++++++++-------------- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 05f7051..a0ff129 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 05f7051db2886ddc94cb8b6573f6b6cd6b995cb3 +Subproject commit a0ff1294e35d2616291462001d7be693c5032380 diff --git a/scc b/scc index f626f02..9470641 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit f626f0259f9ba70729e3102a085ec710a082492a +Subproject commit 947064144c35540bb9ff3c782e057d66b11fa74d diff --git a/src/sc_main.cpp b/src/sc_main.cpp index 7f23ff3..179d0f6 100644 --- a/src/sc_main.cpp +++ b/src/sc_main.cpp @@ -20,9 +20,10 @@ #include "vp/tb.h" #include +#include +#include #include #include -#include #ifdef ERROR #undef ERROR #endif @@ -31,14 +32,20 @@ const std::string core_path{"tb.top.core_complex"}; using namespace sysc; using namespace sc_core; -namespace po = boost::program_options; namespace { const size_t ERRORR_IN_COMMAND_LINE = 1; const size_t SUCCESS = 0; } // namespace +jmp_buf abrt; +void ABRThandler(int sig) { longjmp(abrt, sig); } + int sc_main(int argc, char* argv[]) { + signal(SIGINT, ABRThandler); + signal(SIGABRT, ABRThandler); + signal(SIGSEGV, ABRThandler); + signal(SIGTERM, ABRThandler); /////////////////////////////////////////////////////////////////////////// // SystemC >=2.2 got picky about multiple drivers so disable check /////////////////////////////////////////////////////////////////////////// @@ -73,8 +80,7 @@ int sc_main(int argc, char* argv[]) { if(auto trace_level = parser.get("trace-level")) { auto file_name = parser.get("trace-file"); auto trace_default_on = parser.is_set("trace-default-on"); - if(parser.is_set("trace-default-off")) - cfg.set_value("scc_tracer.default_trace_enable", false); + cfg.set_value("scc_tracer.default_trace_enable", !parser.is_set("trace-default-off")); cfg.set_value("scc_tracer.tx_trace_type", static_cast(scc::tracer::file_type::FTR)); cfg.set_value("scc_tracer.sig_trace_type", static_cast(scc::tracer::file_type::FST)); tracer = scc::make_unique(file_name, static_cast(trace_level & 0x2), @@ -90,7 +96,7 @@ int sc_main(int argc, char* argv[]) { if(tracer) tracer->add_control(); /////////////////////////////////////////////////////////////////////////// - // dump configuration if requested + // dump configuration if requested and/or structure /////////////////////////////////////////////////////////////////////////// if(parser.get("dump-config").size() > 0) { std::ofstream of{parser.get("dump-config")}; @@ -133,15 +139,19 @@ int sc_main(int argc, char* argv[]) { /////////////////////////////////////////////////////////////////////////// // run simulation /////////////////////////////////////////////////////////////////////////// - try { - if(parser.is_set("max_time")) { - sc_core::sc_start(scc::parse_from_string(parser.get("max_time"))); - } else - sc_core::sc_start(); - if(sc_core::sc_start_of_simulation_invoked() && !sc_core::sc_end_of_simulation_invoked()) - sc_core::sc_stop(); - } catch(sc_core::sc_report& rep) { - sc_core::sc_report_handler::get_handler()(rep, sc_core::SC_DISPLAY | sc_core::SC_STOP); + if(auto res = setjmp(abrt)) { + SCCERR() << "Simulation aborted with signal " << res << "!"; + } else { + try { + if(parser.is_set("max_time")) { + sc_core::sc_start(scc::parse_from_string(parser.get("max_time"))); + } else + sc_core::sc_start(); + if(sc_core::sc_start_of_simulation_invoked() && !sc_core::sc_end_of_simulation_invoked()) + sc_core::sc_stop(); + } catch(sc_core::sc_report& rep) { + sc_core::sc_report_handler::get_handler()(rep, sc_core::SC_DISPLAY | sc_core::SC_STOP); + } } return 0; } From 586b9cb77e6eeb81b8fdcd97bd4cc659a709b6d8 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 21 Nov 2025 18:37:30 +0100 Subject: [PATCH 45/69] updates scc to make signal tracing work --- scc | 2 +- src/sc_main.cpp | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/scc b/scc index 9470641..03567fb 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit 947064144c35540bb9ff3c782e057d66b11fa74d +Subproject commit 03567fbece049e8c0490d62cef055b106da41977 diff --git a/src/sc_main.cpp b/src/sc_main.cpp index 179d0f6..4830914 100644 --- a/src/sc_main.cpp +++ b/src/sc_main.cpp @@ -91,11 +91,6 @@ int sc_main(int argc, char* argv[]) { /////////////////////////////////////////////////////////////////////////// auto i_system = scc::make_unique("tb"); /////////////////////////////////////////////////////////////////////////// - // add non-implemented 'enableTracing' properties - /////////////////////////////////////////////////////////////////////////// - if(tracer) - tracer->add_control(); - /////////////////////////////////////////////////////////////////////////// // dump configuration if requested and/or structure /////////////////////////////////////////////////////////////////////////// if(parser.get("dump-config").size() > 0) { From 5183b35ac31cbf9ce1dc7cec26ef30fbae295fca Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Mon, 24 Nov 2025 08:37:06 +0100 Subject: [PATCH 46/69] fixes zlib version conflictz when using LLVM --- conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index 33bc95e..62a13f6 100644 --- a/conanfile.py +++ b/conanfile.py @@ -46,7 +46,7 @@ class Pkg(ConanFile): self.requires("lz4/1.9.3") self.requires("yaml-cpp/0.8.0") self.requires("jsoncpp/1.9.5") - self.requires("zlib/1.2.12") + self.requires("zlib/1.3.1") self.requires("asmjit/cci.20240531") if "WITH_LLVM" in os.environ: self.requires("llvm-core/19.1.7") From 1338cbffb9f317b1a4625c9e862d60d87f81a72b Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Thu, 27 Nov 2025 17:57:30 +0100 Subject: [PATCH 47/69] updates submodules and sc_main to match them --- .envrc | 2 ++ .gdbinit | 1 - .vscode/launch.json | 11 +++++++++-- conanfile.py | 3 ++- dbt-rise-core | 2 +- dbt-rise-riscv | 2 +- scc | 2 +- src/CLIParser.cpp | 15 +++++++-------- src/sc_main.cpp | 13 +++++-------- src/vp/system.h | 7 ++++--- vpvper | 2 +- 11 files changed, 33 insertions(+), 27 deletions(-) delete mode 100644 .gdbinit diff --git a/.envrc b/.envrc index 032d31f..b0de304 100644 --- a/.envrc +++ b/.envrc @@ -5,6 +5,8 @@ if [ $distro == "CentOS" ]; then . /opt/rh/rh-python38/enable elif [ $distro == "Rocky" ]; then . /opt/rh/gcc-toolset-11/enable +elif [ $distro == "RockyLinux" ]; then + . /opt/rh/gcc-toolset-14/enable fi if has module; then module load ./Modulefile diff --git a/.gdbinit b/.gdbinit deleted file mode 100644 index 043b1d8..0000000 --- a/.gdbinit +++ /dev/null @@ -1 +0,0 @@ -set breakpoint pending on diff --git a/.vscode/launch.json b/.vscode/launch.json index 6dfc5c3..96941f6 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -106,8 +106,15 @@ "name": "32bit VP", "cwd": "${workspaceRoot}", "program": "${workspaceFolder}/build/Debug/src/riscv-vp", - "arguments": "--isa 'rv32gc_msu' -v INFO --disass -f fw/hello-world/hello.elf", - "openGdbConsole": true + "arguments": "--isa 'rv32gc_msu' -v INFO -f fw/hello-world/hello.elf", + "openGdbConsole": true, + "initCommands": [ + "set breakpoint pending on", + "set breakpoint auto-hw on", + "set breakpoint always-inserted on", + "set output-radix 16" + ], + "verbose": false }, { "type": "gdb", diff --git a/conanfile.py b/conanfile.py index c7e147e..b8c0b4e 100644 --- a/conanfile.py +++ b/conanfile.py @@ -12,6 +12,7 @@ class Pkg(ConanFile): ) default_options = { "llvm-core/*:targets": "X86", + "llvm-core/*:components": "Native", "boost/*:fPIC": "True", "boost/*:header_only": "False", "boost/*:without_contract": "True", @@ -46,7 +47,7 @@ class Pkg(ConanFile): self.requires("lz4/1.9.3") self.requires("yaml-cpp/0.8.0") self.requires("jsoncpp/1.9.5") - self.requires("zlib/1.2.12") + self.requires("zlib/1.3.1") self.requires("asmjit/cci.20240531") if "WITH_LLVM" in os.environ: self.requires("llvm-core/19.1.7") diff --git a/dbt-rise-core b/dbt-rise-core index 83eb45b..cc0de2d 160000 --- a/dbt-rise-core +++ b/dbt-rise-core @@ -1 +1 @@ -Subproject commit 83eb45bb3e393eb979b44e97ba08da8460eedea4 +Subproject commit cc0de2d95c844df326fb4145a857c2291b8b4520 diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 218f652..8a528fc 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 218f65211c80d21b93d79add3ae56d082b4f6adb +Subproject commit 8a528fceadae055c02197e194d188bbd0f78a03d diff --git a/scc b/scc index 89b2b48..82602d0 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit 89b2b48cdfcf5f79dd278b5749f9b04c521af639 +Subproject commit 82602d000fa1ed177ad0872dd3f82298f411efbc diff --git a/src/CLIParser.cpp b/src/CLIParser.cpp index fa2ddea..e68e989 100644 --- a/src/CLIParser.cpp +++ b/src/CLIParser.cpp @@ -40,11 +40,10 @@ CLIParser::CLIParser(int argc, char* argv[]) } auto log_level = vm_["verbose"].as(); auto log_level_num = static_cast(log_level); - LOGGER(DEFAULT)::reporting_level() = logging::as_log_level(log_level_num > 6 ? 6 : log_level_num); - LOGGER(connection)::reporting_level() = - logging::as_log_level(log_level_num > 4 ? log_level_num - 1 : log_level_num); - LOGGER(dbt_rise_iss)::reporting_level() = - logging::as_log_level(log_level_num > 4 ? log_level_num - 1 : log_level_num); + auto level = logging::as_log_level(log_level_num > 6 ? 6 : log_level_num); + LOGGER(DEFAULT)::set_reporting_level(level); + LOGGER(connection)::set_reporting_level(level); + LOGGER(dbt_rise_iss)::set_reporting_level(level); /////////////////////////////////////////////////////////////////////////// // configure logging /////////////////////////////////////////////////////////////////////////// @@ -57,8 +56,8 @@ CLIParser::CLIParser(int argc, char* argv[]) scc::stream_redirection cerr_redir(std::cerr, scc::log::ERROR); sc_core::sc_report_handler::set_actions("/IEEE_Std_1666/deprecated", sc_core::SC_DO_NOTHING); sc_core::sc_report_handler::set_actions(sc_core::SC_ID_MORE_THAN_ONE_SIGNAL_DRIVER_, sc_core::SC_DO_NOTHING); - sc_core::sc_report_handler::set_actions(sc_core::SC_ERROR, sc_core::SC_LOG | sc_core::SC_CACHE_REPORT | - sc_core::SC_DISPLAY | sc_core::SC_STOP); + sc_core::sc_report_handler::set_actions(sc_core::SC_ERROR, + sc_core::SC_LOG | sc_core::SC_CACHE_REPORT | sc_core::SC_DISPLAY | sc_core::SC_STOP); } void CLIParser::build() { @@ -88,7 +87,7 @@ void CLIParser::build() { "dump the intermediate representation") ("dump-structure", po::value(), "dump model structure to ELK file") - ("quantum", po::value(), + ("quantum", po::value()->default_value(100), "SystemC quantum time in ns") ("reset,r", po::value(), "reset address") diff --git a/src/sc_main.cpp b/src/sc_main.cpp index e5094bb..4fbb6ce 100644 --- a/src/sc_main.cpp +++ b/src/sc_main.cpp @@ -72,9 +72,8 @@ int sc_main(int argc, char* argv[]) { std::unique_ptr tracer; if(auto trace_level = parser.get("trace-level")) { auto file_name = parser.get("trace-file"); - auto enable_sig_trace = (trace_level & 0x1) != 0; // bit0 enables sig trace - auto tx_trace_type = - static_cast(trace_level >> 1); // bit3-bit1 define the kind of transaction trace + auto enable_sig_trace = (trace_level & 0x1) != 0; // bit0 enables sig trace + auto tx_trace_type = static_cast(trace_level >> 1); // bit3-bit1 define the kind of transaction trace auto trace_default_on = parser.is_set("trace-default-on"); if(parser.is_set("trace-default-off")) cfg.set_value("scc_tracer.default_trace_enable", false); @@ -102,8 +101,7 @@ int sc_main(int argc, char* argv[]) { cfg.configure(); std::unique_ptr dumper; if(parser.is_set("dump-structure")) - dumper.reset( - new scc::hierarchy_dumper(parser.get("dump-structure"), scc::hierarchy_dumper::D3JSON)); + dumper.reset(new scc::hierarchy_dumper(parser.get("dump-structure"), scc::hierarchy_dumper::D3JSON)); /////////////////////////////////////////////////////////////////////////// // overwrite config with command line settings /////////////////////////////////////////////////////////////////////////// @@ -121,13 +119,12 @@ int sc_main(int argc, char* argv[]) { tlm::tlm_global_quantum::instance().set(sc_core::sc_time(parser.get("quantum"), sc_core::SC_NS)); if(parser.is_set("reset")) { auto str = parser.get("reset"); - uint64_t start_address = - str.find("0x") == 0 ? std::stoull(str.substr(2), nullptr, 16) : std::stoull(str, nullptr, 10); + uint64_t start_address = str.find("0x") == 0 ? std::stoull(str.substr(2), nullptr, 16) : std::stoull(str, nullptr, 10); cfg.set_value(core_path + ".reset_address", start_address); } if(parser.is_set("disass")) { cfg.set_value(core_path + ".enable_disass", true); - LOGGER(disass)::reporting_level() = logging::INFO; + LOGGER(disass)::set_reporting_level(logging::INFO); auto file_name = parser.get("disass"); if(file_name.length() > 0) { LOG_OUTPUT(disass)::stream() = fopen(file_name.c_str(), "w"); diff --git a/src/vp/system.h b/src/vp/system.h index 03cc258..ab81f82 100644 --- a/src/vp/system.h +++ b/src/vp/system.h @@ -7,6 +7,7 @@ #ifndef SRC_VP_SYSTEM_H_ #define SRC_VP_SYSTEM_H_ +#include "tlm/scc/quantum_keeper.h" #include #include #include @@ -20,7 +21,7 @@ #include #include #include -#include +#include #include #include #include @@ -48,7 +49,8 @@ public: system(sc_core::sc_module_name nm); private: - sysc::riscv::core_complex_mt<> core_complex{"core_complex"}; +#include "../vp/gen/PipelinedMemoryBusToApbBridge.h" // IWYU pragma: keep + sysc::riscv::core_complex core_complex{"core_complex"}; scc::router<> ahb_router, apbBridge; vpvper::minres::gpio_tl gpio0{"gpio0"}; vpvper::minres::uart_tl uart0{"uart0"}; @@ -67,7 +69,6 @@ private: sc_core::sc_signal core_int_s{"core_int_s"}; sc_core::sc_signal mtime_s{"mtime_s"}; void gen_reset(); -#include "../vp/gen/PipelinedMemoryBusToApbBridge.h" // IWYU pragma: keep }; } // namespace vp diff --git a/vpvper b/vpvper index 923024b..6413f14 160000 --- a/vpvper +++ b/vpvper @@ -1 +1 @@ -Subproject commit 923024bd82902bd15f55dd5e108d5823cb0c4add +Subproject commit 6413f14b18658eab8223b30fbbe1216f6d26cc86 From 152853775b13142130f445fbf6a0b8f1d88c5d9b Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 28 Nov 2025 08:40:11 +0100 Subject: [PATCH 48/69] adds paramter option and simplifies disass handling --- dbt-rise-riscv | 2 +- scc | 2 +- src/CLIParser.cpp | 6 ++++-- src/sc_main.cpp | 18 +++++++++++++++--- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 8a528fc..dab4c69 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 8a528fceadae055c02197e194d188bbd0f78a03d +Subproject commit dab4c69f59e0f33b979ac43b40a29d6ec5c67d68 diff --git a/scc b/scc index 82602d0..3f5d963 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit 82602d000fa1ed177ad0872dd3f82298f411efbc +Subproject commit 3f5d963ae0f7e83a340674d44c3a8e5125d221ef diff --git a/src/CLIParser.cpp b/src/CLIParser.cpp index f0ee526..0d3bbab 100644 --- a/src/CLIParser.cpp +++ b/src/CLIParser.cpp @@ -85,8 +85,8 @@ void CLIParser::build() { "core or isa name to use for simulation, use '?' to get list") ("dump-ir", "dump the intermediate representation") - ("dump-structure", po::value(), - "dump model structure to ELK file") + ("dump-structure", po::value(), + "dump model structure to ELK file") ("quantum", po::value()->default_value(100), "SystemC quantum time in ns") ("reset,r", po::value(), @@ -99,6 +99,8 @@ void CLIParser::build() { "set th ename of the trace file") ("max_time,m", po::value(), "maximum time to run") + ("parameter,p", po::value>(), + "parameter to set, value has the form of =") ("config-file,c", po::value()->default_value(""), "read configuration from file") ("plugin,p", po::value>(), diff --git a/src/sc_main.cpp b/src/sc_main.cpp index 4830914..f432a30 100644 --- a/src/sc_main.cpp +++ b/src/sc_main.cpp @@ -73,18 +73,30 @@ int sc_main(int argc, char* argv[]) { /////////////////////////////////////////////////////////////////////////// scc::configurer cfg(parser.get("config-file")); /////////////////////////////////////////////////////////////////////////// + // process CLI paramter settings + /////////////////////////////////////////////////////////////////////////// + if(parser.is_set("parameter")) + for(auto& p : parser.get>("parameter")) { + auto token = util::split(p, '='); + if(token.size() == 2) + cfg.set_value_from_str(token[0], token[1]); + else + SCCERR() << "Invalid parameter specification '" << p << "', should be '='"; + } + /////////////////////////////////////////////////////////////////////////// // set up tracing & transaction recording /////////////////////////////////////////////////////////////////////////// - std::unique_ptr tracer; if(auto trace_level = parser.get("trace-level")) { auto file_name = parser.get("trace-file"); auto trace_default_on = parser.is_set("trace-default-on"); + auto enable_tx_trace = static_cast(trace_level & 0x2); cfg.set_value("scc_tracer.default_trace_enable", !parser.is_set("trace-default-off")); cfg.set_value("scc_tracer.tx_trace_type", static_cast(scc::tracer::file_type::FTR)); cfg.set_value("scc_tracer.sig_trace_type", static_cast(scc::tracer::file_type::FST)); - tracer = scc::make_unique(file_name, static_cast(trace_level & 0x2), - static_cast(trace_level & 0x1)); + tracer = scc::make_unique(file_name, enable_tx_trace, static_cast(trace_level & 0x1)); + if(enable_tx_trace) + cfg.set_value(core_path + ".enable_instr_trace", true); } /////////////////////////////////////////////////////////////////////////// // instantiate top level From 924808e99dd45b5b5bead27e0afca0233df366fa Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 28 Nov 2025 08:48:11 +0100 Subject: [PATCH 49/69] fixes core_complex instantiation --- src/vp/system.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vp/system.h b/src/vp/system.h index ab81f82..8bd7197 100644 --- a/src/vp/system.h +++ b/src/vp/system.h @@ -50,7 +50,7 @@ public: private: #include "../vp/gen/PipelinedMemoryBusToApbBridge.h" // IWYU pragma: keep - sysc::riscv::core_complex core_complex{"core_complex"}; + sysc::riscv::core_complex<> core_complex{"core_complex"}; scc::router<> ahb_router, apbBridge; vpvper::minres::gpio_tl gpio0{"gpio0"}; vpvper::minres::uart_tl uart0{"uart0"}; From 57eef0d053bb44e3283c7f66193b06fd53653e40 Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch Date: Wed, 26 Nov 2025 17:22:24 +0100 Subject: [PATCH 50/69] disables asmjit by default in presets to decrease build times also this is inline with DBT-RISE-RISCV --- CMakePresets.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index e7ab433..8b236ee 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -22,7 +22,7 @@ "CONAN_HOST_PROFILE": "auto-cmake", "CONAN_BUILD_PROFILE": "conan_host_profile", "CMAKE_EXECUTE_PROCESS_COMMAND_ECHO": "STDOUT", - "WITH_TCC": "OFF" + "WITH_ASMJIT": "OFF" } }, { @@ -50,4 +50,4 @@ } } ] -} +} \ No newline at end of file From 36e841cfc8417274e58bfb63d2bfe4744ab842a0 Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch Date: Sat, 29 Nov 2025 14:47:29 +0100 Subject: [PATCH 51/69] updates dbt-rise-riscv --- dbt-rise-riscv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbt-rise-riscv b/dbt-rise-riscv index dab4c69..b12d51c 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit dab4c69f59e0f33b979ac43b40a29d6ec5c67d68 +Subproject commit b12d51c0c976509805ef5d1fee38918c262af8ae From 1db9124a915842448f4d0110aa4a53f243840ff8 Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch Date: Sun, 30 Nov 2025 13:14:01 +0100 Subject: [PATCH 52/69] updates dbt-rise-riscv --- dbt-rise-riscv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbt-rise-riscv b/dbt-rise-riscv index b12d51c..d4659ec 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit b12d51c0c976509805ef5d1fee38918c262af8ae +Subproject commit d4659ec77557785d236c542dc1405ba17da4c34a From 27b7b025ef3098fcb78c8d47e2fd282fd6cc839b Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Mon, 1 Dec 2025 12:01:11 +0100 Subject: [PATCH 53/69] fixes multiple -p definition in CLI --- src/CLIParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CLIParser.cpp b/src/CLIParser.cpp index 0d3bbab..1c7d621 100644 --- a/src/CLIParser.cpp +++ b/src/CLIParser.cpp @@ -103,7 +103,7 @@ void CLIParser::build() { "parameter to set, value has the form of =") ("config-file,c", po::value()->default_value(""), "read configuration from file") - ("plugin,p", po::value>(), + ("plugin", po::value>(), "plugin(s) to activate") ("dump-config,dc", po::value()->default_value(""), "dump configuration to file file"); From 7e817aa9e38946018bbd10a795c1d08b4d9a6e00 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 5 Dec 2025 13:39:07 +0100 Subject: [PATCH 54/69] updates scc --- dbt-rise-riscv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbt-rise-riscv b/dbt-rise-riscv index d4659ec..3678067 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit d4659ec77557785d236c542dc1405ba17da4c34a +Subproject commit 36780673209c7db9928f4e1b9d03dd530d7083bc From f234849bd1bb2206fbcdeb523427c89e44e34fd4 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 6 Dec 2025 21:24:45 +0100 Subject: [PATCH 55/69] updates dbt-rise-riscv and vpvper --- dbt-rise-riscv | 2 +- scc | 2 +- src/vp/system.cpp | 12 ++++-------- src/vp/system.h | 6 +++--- vpvper | 2 +- 5 files changed, 10 insertions(+), 14 deletions(-) diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 3678067..4990d15 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 36780673209c7db9928f4e1b9d03dd530d7083bc +Subproject commit 4990d15a355fc5209bd5d7ced6c46dea726fa523 diff --git a/scc b/scc index 3f5d963..c54fc1b 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit 3f5d963ae0f7e83a340674d44c3a8e5125d221ef +Subproject commit c54fc1b08431607a9b89567c62a7f941b423b06f diff --git a/src/vp/system.cpp b/src/vp/system.cpp index 3d48159..8d1ed42 100644 --- a/src/vp/system.cpp +++ b/src/vp/system.cpp @@ -5,7 +5,6 @@ */ #include "system.h" - #include #include #include @@ -57,9 +56,9 @@ system::system(sc_core::sc_module_name nm) aclint.mtime_clk_i(mtime_clk); aclint.mtime_o(mtime_s); - aclint.mtime_int_o(mtime_int_s); - aclint.msip_int_o(msip_int_s); - irq_ctrl.irq_o(core_int_s); + aclint.mtime_int_o[0](clint_int_s[sysc::riscv::TIMER_IRQ]); + aclint.msip_int_o[0](clint_int_s[sysc::riscv::SW_IRQ]); + irq_ctrl.irq_o(clint_int_s[sysc::riscv::EXT_IRQ]); irq_ctrl.pending_irq_i(irq_int_s); uart0.irq_o(irq_int_s[0]); @@ -68,10 +67,7 @@ system::system(sc_core::sc_module_name nm) qspi.irq_o(irq_int_s[3]); core_complex.mtime_i(mtime_s); - core_complex.timer_irq_i(mtime_int_s); - core_complex.ext_irq_i(core_int_s); - core_complex.local_irq_i(local_int_s); - core_complex.sw_irq_i(msip_int_s); + core_complex.clint_irq_i(clint_int_s); gpio0.pins_i(pins_i); gpio0.pins_o(pins_o); diff --git a/src/vp/system.h b/src/vp/system.h index 8bd7197..e3e1fd0 100644 --- a/src/vp/system.h +++ b/src/vp/system.h @@ -63,10 +63,10 @@ private: scc::memory<8_kB, scc::LT> boot_rom{"boot_rom"}; sc_core::sc_signal mtime_clk{"mtime_clk"}; - sc_core::sc_signal rst_s{"rst_s"}, mtime_int_s{"mtime_int_s"}, msip_int_s{"msip_int_s"}; + sc_core::sc_signal rst_s{"rst_s"}; - sc_core::sc_vector> irq_int_s{"irq_int_s", 32}, local_int_s{"local_int_s", 16}; - sc_core::sc_signal core_int_s{"core_int_s"}; + sc_core::sc_vector> irq_int_s{"irq_int_s", 32}; + sc_core::sc_vector> clint_int_s{"clint_int_s", 16}; sc_core::sc_signal mtime_s{"mtime_s"}; void gen_reset(); }; diff --git a/vpvper b/vpvper index 6413f14..d9c206f 160000 --- a/vpvper +++ b/vpvper @@ -1 +1 @@ -Subproject commit 6413f14b18658eab8223b30fbbe1216f6d26cc86 +Subproject commit d9c206f61aa3479d67a71bff47b0ded71673fd7d From 1b5585b3959d89b7726ba71cebdcd146d49391b2 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 14 Dec 2025 17:16:23 +0100 Subject: [PATCH 56/69] updates submodules --- dbt-rise-core | 2 +- dbt-rise-riscv | 2 +- scc | 2 +- src/vp/system.h | 2 +- vpvper | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dbt-rise-core b/dbt-rise-core index cc0de2d..2298db9 160000 --- a/dbt-rise-core +++ b/dbt-rise-core @@ -1 +1 @@ -Subproject commit cc0de2d95c844df326fb4145a857c2291b8b4520 +Subproject commit 2298db9905cff8f431434487c05f38d77e32c64e diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 4990d15..6c83288 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 4990d15a355fc5209bd5d7ced6c46dea726fa523 +Subproject commit 6c83288ae060b3a6060d5f677e55d9fb2b246bf4 diff --git a/scc b/scc index c54fc1b..b4fa07a 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit c54fc1b08431607a9b89567c62a7f941b423b06f +Subproject commit b4fa07abffd691228ffea818a7c8fcf25b5c6fd8 diff --git a/src/vp/system.h b/src/vp/system.h index e3e1fd0..29a8136 100644 --- a/src/vp/system.h +++ b/src/vp/system.h @@ -66,7 +66,7 @@ private: sc_core::sc_signal rst_s{"rst_s"}; sc_core::sc_vector> irq_int_s{"irq_int_s", 32}; - sc_core::sc_vector> clint_int_s{"clint_int_s", 16}; + sc_core::sc_vector> clint_int_s{"clint_int_s", 32}; sc_core::sc_signal mtime_s{"mtime_s"}; void gen_reset(); }; diff --git a/vpvper b/vpvper index d9c206f..d035157 160000 --- a/vpvper +++ b/vpvper @@ -1 +1 @@ -Subproject commit d9c206f61aa3479d67a71bff47b0ded71673fd7d +Subproject commit d0351571e230514b1dbb4357964ea2b692b06a6a From 989a5afbc72df29b64fb6c03cbbbb2f8613d1c68 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 2 Jan 2026 11:45:58 +0100 Subject: [PATCH 57/69] updates submodules to fix incoinsistencies --- dbt-rise-riscv | 2 +- scc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 6c83288..7c59338 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 6c83288ae060b3a6060d5f677e55d9fb2b246bf4 +Subproject commit 7c59338d343c4be74422c4de583fec132286980d diff --git a/scc b/scc index b4fa07a..c933ca7 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit b4fa07abffd691228ffea818a7c8fcf25b5c6fd8 +Subproject commit c933ca7e45e6c300abd0ebecc438df5ae4231a7b From a6d2fc239e3ade2ef390783a90acc4ef281df399 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sun, 4 Jan 2026 20:09:01 +0100 Subject: [PATCH 58/69] updates submodules --- scc | 2 +- vpvper | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scc b/scc index c933ca7..ad44f61 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit c933ca7e45e6c300abd0ebecc438df5ae4231a7b +Subproject commit ad44f61ee0ce42c5b40c99fab36eb57ce8f6a87f diff --git a/vpvper b/vpvper index d035157..1d361bd 160000 --- a/vpvper +++ b/vpvper @@ -1 +1 @@ -Subproject commit d0351571e230514b1dbb4357964ea2b692b06a6a +Subproject commit 1d361bdf0ecde86af4083863700adee19aecd3ab From 5620cf58631c3d4daadb8d486b4697f74c9b0f5b Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 10 Jan 2026 11:46:05 +0100 Subject: [PATCH 59/69] updates submodules --- dbt-rise-core | 2 +- dbt-rise-riscv | 2 +- vpvper | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dbt-rise-core b/dbt-rise-core index 2298db9..97c8150 160000 --- a/dbt-rise-core +++ b/dbt-rise-core @@ -1 +1 @@ -Subproject commit 2298db9905cff8f431434487c05f38d77e32c64e +Subproject commit 97c815024fab76fe09738f7f5242259aa3ad786c diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 7c59338..0521018 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 7c59338d343c4be74422c4de583fec132286980d +Subproject commit 0521018e442a4c314d14774ef80535baf3ca2b16 diff --git a/vpvper b/vpvper index 1d361bd..e5db899 160000 --- a/vpvper +++ b/vpvper @@ -1 +1 @@ -Subproject commit 1d361bdf0ecde86af4083863700adee19aecd3ab +Subproject commit e5db89959dea03ddaa903138ba8d4810cee2d266 From e77ee0a7227f4cfeca4a06bfa13a77a92e534696 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 10 Jan 2026 12:11:12 +0100 Subject: [PATCH 60/69] adds github action --- .github/workflows/cmake-single-platform.yml | 47 +++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 .github/workflows/cmake-single-platform.yml diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml new file mode 100644 index 0000000..c3f124c --- /dev/null +++ b/.github/workflows/cmake-single-platform.yml @@ -0,0 +1,47 @@ +name: Smoketest +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +env: + BUILD_TYPE: Release + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout SystemC-Components + uses: actions/checkout@v6 + with: + submodules: true + + - name: Cache Conan + uses: actions/cache@v4 + with: + path: ~/.conan2 + key: conan-${{ runner.os }}-unit-cpp${{ matrix.cpp_std }}-${{ hashFiles('conanfile.py') }} + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y g++ python3-pip cmake ninja-build + pip3 install -r requirements.txt + + - name: Configure + run: cmake --preset ${{env.BUILD_TYPE}} + + - name: Build + run: cmake --build ${{github.workspace}}/build/${{env.BUILD_TYPE}} --config ${{env.BUILD_TYPE}} + + - name: Smoke Test + working-directory: ${{github.workspace}} + run: build/${{env.BUILD_TYPE}}/src/riscv-vp --isa 'rv32gc_msu' -v INFO -f fw/hello-world/hello.elf + + + + + + From de824b6483817d0a1c3b3a26e397afe890858a3e Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 10 Jan 2026 12:15:32 +0100 Subject: [PATCH 61/69] updates github action --- .github/workflows/cmake-single-platform.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index c3f124c..52a50cf 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -1,7 +1,11 @@ name: Smoketest on: push: +<<<<<<< HEAD branches: [ "main" ] +======= + branches: [ "*" ] +>>>>>>> 59096e7 (updates github action) pull_request: branches: [ "main" ] From 0c150fa3bb2e13e87d4161d5acaa9b347be858f2 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 10 Jan 2026 12:17:59 +0100 Subject: [PATCH 62/69] fixes leftover in action --- .github/workflows/cmake-single-platform.yml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index 52a50cf..9ad4f79 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -1,11 +1,7 @@ name: Smoketest on: push: -<<<<<<< HEAD - branches: [ "main" ] -======= - branches: [ "*" ] ->>>>>>> 59096e7 (updates github action) + branches: [ "main", "develop" ] pull_request: branches: [ "main" ] @@ -44,8 +40,3 @@ jobs: working-directory: ${{github.workspace}} run: build/${{env.BUILD_TYPE}}/src/riscv-vp --isa 'rv32gc_msu' -v INFO -f fw/hello-world/hello.elf - - - - - From 1d9e144e29365849909fc426987d53f08f07be28 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 10 Jan 2026 12:34:50 +0100 Subject: [PATCH 63/69] adds submodule update to action --- .github/workflows/cmake-single-platform.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index 9ad4f79..e0cd6fd 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -1,4 +1,4 @@ -name: Smoketest +name: Smoke Test on: push: branches: [ "main", "develop" ] @@ -13,12 +13,16 @@ jobs: runs-on: ubuntu-latest steps: - - name: Checkout SystemC-Components + - name: Checkout Sources uses: actions/checkout@v6 with: submodules: true - - name: Cache Conan + - name: Smoke Test + working-directory: ${{github.workspace}} + run: git submodule update --recursive --init + + - name: Cache Conan uses: actions/cache@v4 with: path: ~/.conan2 From b79adf52a4c12566c65074c17418375d567ee3e3 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 10 Jan 2026 12:35:54 +0100 Subject: [PATCH 64/69] fixes typo in action --- .github/workflows/cmake-single-platform.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index e0cd6fd..49887a8 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -18,11 +18,11 @@ jobs: with: submodules: true - - name: Smoke Test + - name: Pull submodules working-directory: ${{github.workspace}} run: git submodule update --recursive --init - - name: Cache Conan + - name: Cache Conan uses: actions/cache@v4 with: path: ~/.conan2 From f696ef364e698a9a258bede6129e48c5df7a3e46 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 10 Jan 2026 13:19:15 +0100 Subject: [PATCH 65/69] updates vpvper --- .github/workflows/cmake-single-platform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index 49887a8..51a247d 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -42,5 +42,5 @@ jobs: - name: Smoke Test working-directory: ${{github.workspace}} - run: build/${{env.BUILD_TYPE}}/src/riscv-vp --isa 'rv32gc_msu' -v INFO -f fw/hello-world/hello.elf + run: ${{github.workspace}}/build/${{env.BUILD_TYPE}}/src/riscv-vp -f fw/hello-world/hello.elf From b3dbe43365641974349528a5daa271facbb5afcf Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 10 Jan 2026 13:32:36 +0100 Subject: [PATCH 66/69] adds 2x eth controller --- .github/workflows/cmake-single-platform.yml | 2 +- src/vp/system.cpp | 18 ++++++++++-------- src/vp/system.h | 3 +++ 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index 51a247d..af84b8a 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -42,5 +42,5 @@ jobs: - name: Smoke Test working-directory: ${{github.workspace}} - run: ${{github.workspace}}/build/${{env.BUILD_TYPE}}/src/riscv-vp -f fw/hello-world/hello.elf + run: ${{github.workspace}}/build/${{env.BUILD_TYPE}}/src/riscv-vp -f ${{github.workspace}}/fw/hello-world/hello.elf diff --git a/src/vp/system.cpp b/src/vp/system.cpp index 8d1ed42..1ec4e78 100644 --- a/src/vp/system.cpp +++ b/src/vp/system.cpp @@ -16,20 +16,18 @@ using namespace vpvper::minres; system::system(sc_core::sc_module_name nm) : sc_core::sc_module(nm) -, NAMED(ahb_router, 3, 2) +, NAMED(ahb_router, 5, 2) , NAMED(apbBridge, PipelinedMemoryBusToApbBridge_map.size(), 1) { mtime_clk = (1.0 / 32768) * 1_sec; core_complex.ibus(ahb_router.target[0]); core_complex.dbus(ahb_router.target[1]); - ahb_router.initiator.at(0)(qspi.xip_sck); - ahb_router.set_target_range(0, 0x20000000, 16_MB); - ahb_router.initiator.at(1)(mem_ram.target); - ahb_router.set_target_range(1, 0x00000000, 128_kB); - ahb_router.initiator.at(2)(apbBridge.target[0]); - ahb_router.set_target_range(2, 0x10000000, 256_MB); - + ahb_router.bind_target(mem_ram.target, 1, 0x00000000, 128_kB); + ahb_router.bind_target(apbBridge.target[0], 2, 0x10000000, 128_MB); + ahb_router.bind_target(eth0.socket, 3, 0x18000000, 4_KiB); + ahb_router.bind_target(eth1.socket, 4, 0x18001000, 4_KiB); + ahb_router.bind_target(qspi.xip_sck, 0, 0x20000000, 16_MB); size_t i = 0; for(const auto& e : PipelinedMemoryBusToApbBridge_map) { apbBridge.initiator.at(i)(e.target); @@ -45,6 +43,8 @@ system::system(sc_core::sc_module_name nm) qspi.clk_i(clk_i); core_complex.clk_i(clk_i); // mem_ram.clk_i(clk_i); + eth0.clk_i(clk_i); + eth1.clk_i(clk_i); gpio0.rst_i(rst_s); uart0.rst_i(rst_s); @@ -53,6 +53,8 @@ system::system(sc_core::sc_module_name nm) irq_ctrl.rst_i(rst_s); qspi.rst_i(rst_s); core_complex.rst_i(rst_s); + eth0.rst_i(rst_s); + eth1.rst_i(rst_s); aclint.mtime_clk_i(mtime_clk); aclint.mtime_o(mtime_s); diff --git a/src/vp/system.h b/src/vp/system.h index 29a8136..1d03222 100644 --- a/src/vp/system.h +++ b/src/vp/system.h @@ -10,6 +10,7 @@ #include "tlm/scc/quantum_keeper.h" #include #include +#include #include #include #include @@ -58,6 +59,8 @@ private: vpvper::minres::aclint_tl aclint{"aclint"}; vpvper::minres::irq_tl irq_ctrl{"irq_ctrl"}; vpvper::minres::qspi_tl qspi{"qspi"}; + vpvper::minres::ethmac eth0{"eth0"}; + vpvper::minres::ethmac eth1{"eth1"}; scc::memory<128_kB, scc::LT> mem_ram{"mem_ram"}; scc::memory<8_kB, scc::LT> boot_rom{"boot_rom"}; From ccaf7e66e00c74d77459d4a23bd79355445e03f4 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 10 Jan 2026 16:39:45 +0100 Subject: [PATCH 67/69] fixes elf path in github action --- .github/workflows/cmake-single-platform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index af84b8a..f9bceef 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -42,5 +42,5 @@ jobs: - name: Smoke Test working-directory: ${{github.workspace}} - run: ${{github.workspace}}/build/${{env.BUILD_TYPE}}/src/riscv-vp -f ${{github.workspace}}/fw/hello-world/hello.elf + run: ${{github.workspace}}/build/${{env.BUILD_TYPE}}/src/riscv-vp -f ${{github.workspace}}/fw/hello-world/prebuilt/hello.elf From cfaff6ee546f1140b74e3d5612a20b39af4061e9 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 10 Jan 2026 17:03:28 +0100 Subject: [PATCH 68/69] update submodules and CLIParser sto finish execution after help switch --- dbt-rise-riscv | 2 +- scc | 2 +- src/CLIParser.cpp | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/dbt-rise-riscv b/dbt-rise-riscv index 0521018..e187284 160000 --- a/dbt-rise-riscv +++ b/dbt-rise-riscv @@ -1 +1 @@ -Subproject commit 0521018e442a4c314d14774ef80535baf3ca2b16 +Subproject commit e18728450167372fc75a6d430ad059978d66ed75 diff --git a/scc b/scc index ad44f61..d68acaa 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit ad44f61ee0ce42c5b40c99fab36eb57ce8f6a87f +Subproject commit d68acaab98145264ff5041329f5bb423f0069da4 diff --git a/src/CLIParser.cpp b/src/CLIParser.cpp index 1c7d621..9861815 100644 --- a/src/CLIParser.cpp +++ b/src/CLIParser.cpp @@ -28,6 +28,7 @@ CLIParser::CLIParser(int argc, char* argv[]) // --help option if(vm_.count("help")) { std::cout << "DBT-RISE-TGC based virtual platform of TGC cores" << std::endl << desc << std::endl; + exit(0); } po::notify(vm_); // throws on error, so do after help in case there are any problems valid = true; From 451d6321cffa45c64dba4cac0379ce91c5038573 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 10 Jan 2026 17:14:31 +0100 Subject: [PATCH 69/69] updates scc --- scc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scc b/scc index d68acaa..4db09b1 160000 --- a/scc +++ b/scc @@ -1 +1 @@ -Subproject commit d68acaab98145264ff5041329f5bb423f0069da4 +Subproject commit 4db09b165dc483bddad94874eb9400a1fe97b789