Add `reg info` and `vreg info` debug commands
Add custom commands to print all the available scalar and vector register content in the interactive mode.
PiperOrigin-RevId: 560111860
diff --git a/WORKSPACE b/WORKSPACE
index 75d2e3f..00af9e3 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -6,17 +6,17 @@
# MPACT-RiscV repo
http_archive(
name = "com_google_mpact-riscv",
- sha256 = "244236ecf63f812eedf4e1c80e79276374d4c8a9222860220706522edf093fc8",
- strip_prefix = "mpact-riscv-8b0c6b7fa4f48d6dba99c1a4abba3bb548577cad",
- url = "https://github.com/google/mpact-riscv/archive/8b0c6b7fa4f48d6dba99c1a4abba3bb548577cad.tar.gz",
+ sha256 = "9b617e364fb64b49f2ddd83c9eb0c012d3afee1569ad85262e0ccaf8a29ae760",
+ strip_prefix = "mpact-riscv-7b5ba3433b2c39752ca9a35d1b1ce48a7fec8722",
+ url = "https://github.com/google/mpact-riscv/archive/7b5ba3433b2c39752ca9a35d1b1ce48a7fec8722.tar.gz",
)
# MPACT-Sim repo
http_archive(
name = "com_google_mpact-sim",
- sha256 = "8b35b5f172f241fd207f5f54d81aacab1617dea16607b36e3417ef47f2366afc",
- strip_prefix = "mpact-sim-c4b68d7bdef36b9eb2e85f8dc22ccc4eb27ba4c5",
- url = "https://github.com/google/mpact-sim/archive/c4b68d7bdef36b9eb2e85f8dc22ccc4eb27ba4c5.tar.gz",
+ sha256 = "1f0e6ea27b0487a5d997f85efaebdf60a1f1dbb478c30b25d3c6b41e9d4b4028",
+ strip_prefix = "mpact-sim-e1b7b0adeb53875908995674a8555b68c4821903",
+ url = "https://github.com/google/mpact-sim/archive/e1b7b0adeb53875908995674a8555b68c4821903.tar.gz",
)
load("@com_google_mpact-sim//:repos.bzl", "mpact_sim_repos")
diff --git a/sim/BUILD b/sim/BUILD
index 8f3bb8e..b84f1c3 100644
--- a/sim/BUILD
+++ b/sim/BUILD
@@ -162,12 +162,17 @@
"//sim/test:testfiles/rv32soft_fp.elf",
],
deps = [
+ ":kelvin_state",
":kelvin_top",
"@com_google_absl//absl/flags:flag",
"@com_google_absl//absl/flags:parse",
"@com_google_absl//absl/flags:usage",
"@com_google_absl//absl/log",
+ "@com_google_absl//absl/strings",
+ "@com_google_absl//absl/strings:str_format",
"@com_google_mpact-riscv//riscv:debug_command_shell",
+ "@com_google_mpact-riscv//riscv:riscv_state",
"@com_google_mpact-sim//mpact/sim/util/program_loader:elf_loader",
+ "@com_googlesource_code_re2//:re2",
],
)
diff --git a/sim/kelvin_sim.cc b/sim/kelvin_sim.cc
index b60a923..2e55304 100644
--- a/sim/kelvin_sim.cc
+++ b/sim/kelvin_sim.cc
@@ -1,16 +1,24 @@
#include <signal.h>
+#include <cstdint>
+#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
+#include "sim/kelvin_state.h"
#include "sim/kelvin_top.h"
#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#include "absl/flags/usage.h"
#include "absl/log/log.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/string_view.h"
#include "riscv/debug_command_shell.h"
+#include "riscv/riscv_register_aliases.h"
#include "mpact/sim/util/program_loader/elf_program_loader.h"
+#include "re2/re2.h"
// Flags for specifying interactive mode.
ABSL_FLAG(bool, i, false, "Interactive mode");
@@ -29,6 +37,67 @@
}
}
+// Custom debug command to print all the scalar register values.
+static bool PrintRegisters(
+ absl::string_view input,
+ const mpact::sim::riscv::DebugCommandShell::CoreAccess &core_access,
+ std::string &output) {
+ LazyRE2 xreg_info_re{R"(\s*reg\s+info\s*)"};
+ if (!RE2::FullMatch(input, *xreg_info_re)) {
+ return false;
+ }
+ std::string output_str;
+ for (int i = 0; i < 32; ++i) {
+ std::string reg_name = absl::StrCat("x", i);
+ auto result = core_access.debug_interface->ReadRegister(reg_name);
+ if (!result.ok()) {
+ // Skip the register if error occurs.
+ continue;
+ }
+ output_str +=
+ absl::StrCat(mpact::sim::riscv::kXRegisterAliases[i], "\t = [",
+ absl::Hex(result.value(), absl::kZeroPad8), "]\n");
+ }
+ output = output_str;
+ return true;
+}
+
+// Custom debug command to print all the assigned vector register values.
+static bool PrintVectorRegisters(
+ absl::string_view input,
+ const mpact::sim::riscv::DebugCommandShell::CoreAccess &core_access,
+ std::string &output) {
+ LazyRE2 vreg_info_re{R"(\s*vreg\s+info\s*)"};
+ if (!RE2::FullMatch(input, *vreg_info_re)) {
+ return false;
+ }
+ std::string output_str;
+ for (int i = 0; i < kelvin::sim::kNumVregs; ++i) {
+ std::string reg_name = absl::StrCat("v", i);
+ auto result = core_access.debug_interface->GetRegisterDataBuffer(reg_name);
+ if (!result.ok()) {
+ // Skip the register if error occurs.
+ continue;
+ }
+ auto *db = result.value();
+ if (db == nullptr) {
+ // Skip the register if the data buffer is not available.
+ continue;
+ }
+ std::string data_str;
+ std::string sep;
+ for (int j = 0; j < kelvin::sim::kVectorLengthInBits / 32; ++j) {
+ auto value = db->Get<uint32_t>(j);
+ data_str += sep + absl::StrFormat("%08x", value);
+ sep = ":";
+ }
+ output_str += absl::StrCat("v", i, "\t = [", data_str, "]\n");
+ }
+
+ output = output_str;
+ return true;
+}
+
int main(int argc, char **argv) {
absl::SetProgramUsageMessage("Kelvin MPACT-Sim based CLI tool");
auto out_args = absl::ParseCommandLine(argc, argv);
@@ -71,6 +140,13 @@
if (interactive) {
mpact::sim::riscv::DebugCommandShell cmd_shell(
{{&kelvin_top, &elf_loader}});
+ // Add custom commands to interactive debug command shell.
+ cmd_shell.AddCommand(
+ " reg info - print all scalar regs",
+ PrintRegisters);
+ cmd_shell.AddCommand(
+ " vreg info - print assigned vector regs",
+ PrintVectorRegisters);
cmd_shell.Run(std::cin, std::cout);
std::cout << "Total cycles: " << kelvin_top.GetCycleCount() << std::endl;
} else {
diff --git a/sim/kelvin_state.h b/sim/kelvin_state.h
index f7571dd..52d271b 100644
--- a/sim/kelvin_state.h
+++ b/sim/kelvin_state.h
@@ -20,6 +20,8 @@
// https://spacebeaker.googlesource.com/shodan/hw/kelvin/+/refs/heads/master/hdl/chisel/src/kelvin/Parameters.scala#13.
inline constexpr uint32_t kVectorLengthInBits = 256;
+inline constexpr int kNumVregs = 64;
+
constexpr uint64_t kKelvinMaxMemoryAddress = 0x3f'ffffULL; // 4MB
template <typename T>