Adds an option to overwrite  misa value at start of simulation.

PiperOrigin-RevId: 830564608
Change-Id: If576128ead629b1708362c3bc3fee138b587b455
diff --git a/riscv/riscv32_decoder.cc b/riscv/riscv32_decoder.cc
index 847c03e..809aed0 100644
--- a/riscv/riscv32_decoder.cc
+++ b/riscv/riscv32_decoder.cc
@@ -37,10 +37,11 @@
   riscv_isa_ = std::make_unique<isa32::RiscV32GInstructionSet>(
       state, riscv_isa_factory_.get());
   riscv_encoding_ = std::make_unique<isa32::RiscV32GEncoding>(state);
-  decoder_ = std::make_unique<
-      RiscVGenericDecoder<isa32::OpcodeEnum, isa32::RiscV32GEncoding,
-                          isa32::RiscV32GInstructionSet>>(
-      state, memory, riscv_encoding_.get(), riscv_isa_.get());
+  decoder_ =
+      std::make_unique<RiscVGenericDecoder<RiscVState, isa32::OpcodeEnum,
+                                           isa32::RiscV32GEncoding,
+                                           isa32::RiscV32GInstructionSet>>(
+          state, memory, riscv_encoding_.get(), riscv_isa_.get());
 }
 
 generic::Instruction* RiscV32Decoder::DecodeInstruction(uint64_t address) {
diff --git a/riscv/riscv32_decoder.h b/riscv/riscv32_decoder.h
index 4926a79..5b96385 100644
--- a/riscv/riscv32_decoder.h
+++ b/riscv/riscv32_decoder.h
@@ -71,9 +71,9 @@
  private:
   RiscVState* state_;
   util::MemoryInterface* memory_;
-  std::unique_ptr<
-      RiscVGenericDecoder<isa32::OpcodeEnum, isa32::RiscV32GEncoding,
-                          isa32::RiscV32GInstructionSet>>
+  std::unique_ptr<RiscVGenericDecoder<RiscVState, isa32::OpcodeEnum,
+                                      isa32::RiscV32GEncoding,
+                                      isa32::RiscV32GInstructionSet>>
       decoder_;
   std::unique_ptr<isa32::RiscV32GEncoding> riscv_encoding_;
   std::unique_ptr<RV32IsaFactory> riscv_isa_factory_;
diff --git a/riscv/riscv32g_bitmanip_decoder.cc b/riscv/riscv32g_bitmanip_decoder.cc
index 220a466..f3b3023 100644
--- a/riscv/riscv32g_bitmanip_decoder.cc
+++ b/riscv/riscv32g_bitmanip_decoder.cc
@@ -38,10 +38,11 @@
   riscv_isa_ = std::make_unique<isa32gzb::RiscV32GZBInstructionSet>(
       state, riscv_isa_factory_.get());
   riscv_encoding_ = std::make_unique<isa32gzb::RiscV32GZBEncoding>(state);
-  decoder_ = std::make_unique<
-      RiscVGenericDecoder<isa32gzb::OpcodeEnum, isa32gzb::RiscV32GZBEncoding,
-                          isa32gzb::RiscV32GZBInstructionSet>>(
-      state, memory, riscv_encoding_.get(), riscv_isa_.get());
+  decoder_ =
+      std::make_unique<RiscVGenericDecoder<RiscVState, isa32gzb::OpcodeEnum,
+                                           isa32gzb::RiscV32GZBEncoding,
+                                           isa32gzb::RiscV32GZBInstructionSet>>(
+          state, memory, riscv_encoding_.get(), riscv_isa_.get());
 }
 
 generic::Instruction* RiscV32GBitmanipDecoder::DecodeInstruction(
diff --git a/riscv/riscv32g_bitmanip_decoder.h b/riscv/riscv32g_bitmanip_decoder.h
index 8a54958..c3e957a 100644
--- a/riscv/riscv32g_bitmanip_decoder.h
+++ b/riscv/riscv32g_bitmanip_decoder.h
@@ -75,9 +75,9 @@
 
  private:
   RiscVState* state_;
-  std::unique_ptr<
-      RiscVGenericDecoder<isa32gzb::OpcodeEnum, isa32gzb::RiscV32GZBEncoding,
-                          isa32gzb::RiscV32GZBInstructionSet>>
+  std::unique_ptr<RiscVGenericDecoder<RiscVState, isa32gzb::OpcodeEnum,
+                                      isa32gzb::RiscV32GZBEncoding,
+                                      isa32gzb::RiscV32GZBInstructionSet>>
       decoder_;
   util::MemoryInterface* memory_;
   generic::DataBuffer* inst_db_;
diff --git a/riscv/riscv32g_vec_decoder.cc b/riscv/riscv32g_vec_decoder.cc
index f9f2939..76d0694 100644
--- a/riscv/riscv32g_vec_decoder.cc
+++ b/riscv/riscv32g_vec_decoder.cc
@@ -38,10 +38,11 @@
   riscv_isa_ = std::make_unique<isa32v::RiscV32GVInstructionSet>(
       state, riscv_isa_factory_.get());
   riscv_encoding_ = std::make_unique<isa32v::RiscV32GVecEncoding>(state);
-  decoder_ = std::make_unique<
-      RiscVGenericDecoder<isa32v::OpcodeEnum, isa32v::RiscV32GVecEncoding,
-                          isa32v::RiscV32GVInstructionSet>>(
-      state, memory, riscv_encoding_.get(), riscv_isa_.get());
+  decoder_ =
+      std::make_unique<RiscVGenericDecoder<RiscVState, isa32v::OpcodeEnum,
+                                           isa32v::RiscV32GVecEncoding,
+                                           isa32v::RiscV32GVInstructionSet>>(
+          state, memory, riscv_encoding_.get(), riscv_isa_.get());
 }
 
 generic::Instruction* RiscV32GVecDecoder::DecodeInstruction(uint64_t address) {
diff --git a/riscv/riscv32g_vec_decoder.h b/riscv/riscv32g_vec_decoder.h
index a6c38e9..b549db0 100644
--- a/riscv/riscv32g_vec_decoder.h
+++ b/riscv/riscv32g_vec_decoder.h
@@ -75,9 +75,9 @@
  private:
   RiscVState* state_;
   util::MemoryInterface* memory_;
-  std::unique_ptr<
-      RiscVGenericDecoder<isa32v::OpcodeEnum, isa32v::RiscV32GVecEncoding,
-                          isa32v::RiscV32GVInstructionSet>>
+  std::unique_ptr<RiscVGenericDecoder<RiscVState, isa32v::OpcodeEnum,
+                                      isa32v::RiscV32GVecEncoding,
+                                      isa32v::RiscV32GVInstructionSet>>
       decoder_;
   std::unique_ptr<isa32v::RiscV32GVecEncoding> riscv_encoding_;
   std::unique_ptr<RV32GVIsaFactory> riscv_isa_factory_;
diff --git a/riscv/riscv32gzb_vec_decoder.cc b/riscv/riscv32gzb_vec_decoder.cc
index c4e2498..e88e01e 100644
--- a/riscv/riscv32gzb_vec_decoder.cc
+++ b/riscv/riscv32gzb_vec_decoder.cc
@@ -42,7 +42,7 @@
       state, riscv_isa_factory_.get());
   riscv_encoding_ = std::make_unique<isa32gvzb::RiscV32GZBVecEncoding>(state);
   decoder_ = std::make_unique<RiscVGenericDecoder<
-      isa32gvzb::OpcodeEnum, isa32gvzb::RiscV32GZBVecEncoding,
+      RiscVState, isa32gvzb::OpcodeEnum, isa32gvzb::RiscV32GZBVecEncoding,
       isa32gvzb::RiscV32GVZBInstructionSet>>(
       state, memory, riscv_encoding_.get(), riscv_isa_.get());
 }
diff --git a/riscv/riscv32gzb_vec_decoder.h b/riscv/riscv32gzb_vec_decoder.h
index 8039cea..c0feb7e 100644
--- a/riscv/riscv32gzb_vec_decoder.h
+++ b/riscv/riscv32gzb_vec_decoder.h
@@ -70,7 +70,7 @@
  private:
   RiscVState* const state_;
   util::MemoryInterface* const memory_;
-  std::unique_ptr<RiscVGenericDecoder<isa32gvzb::OpcodeEnum,
+  std::unique_ptr<RiscVGenericDecoder<RiscVState, isa32gvzb::OpcodeEnum,
                                       isa32gvzb::RiscV32GZBVecEncoding,
                                       isa32gvzb::RiscV32GVZBInstructionSet>>
       decoder_;
diff --git a/riscv/riscv64_decoder.cc b/riscv/riscv64_decoder.cc
index 3bb579c..845dc54 100644
--- a/riscv/riscv64_decoder.cc
+++ b/riscv/riscv64_decoder.cc
@@ -42,10 +42,11 @@
       state, riscv_isa_factory_.get());
   riscv_encoding_ =
       std::make_unique<isa64::RiscV64GEncoding>(state, use_abi_names);
-  decoder_ = std::make_unique<
-      RiscVGenericDecoder<isa64::OpcodeEnum, isa64::RiscV64GEncoding,
-                          isa64::RiscV64GInstructionSet>>(
-      state, memory, riscv_encoding_.get(), riscv_isa_.get());
+  decoder_ =
+      std::make_unique<RiscVGenericDecoder<RiscVState, isa64::OpcodeEnum,
+                                           isa64::RiscV64GEncoding,
+                                           isa64::RiscV64GInstructionSet>>(
+          state, memory, riscv_encoding_.get(), riscv_isa_.get());
 }
 
 generic::Instruction* RiscV64Decoder::DecodeInstruction(uint64_t address) {
diff --git a/riscv/riscv64_decoder.h b/riscv/riscv64_decoder.h
index a109899..9918b98 100644
--- a/riscv/riscv64_decoder.h
+++ b/riscv/riscv64_decoder.h
@@ -76,9 +76,9 @@
  private:
   RiscVState* state_;
   util::MemoryInterface* memory_;
-  std::unique_ptr<
-      RiscVGenericDecoder<isa64::OpcodeEnum, isa64::RiscV64GEncoding,
-                          isa64::RiscV64GInstructionSet>>
+  std::unique_ptr<RiscVGenericDecoder<RiscVState, isa64::OpcodeEnum,
+                                      isa64::RiscV64GEncoding,
+                                      isa64::RiscV64GInstructionSet>>
       decoder_;
   std::unique_ptr<isa64::RiscV64GEncoding> riscv_encoding_;
   std::unique_ptr<RV64IsaFactory> riscv_isa_factory_;
diff --git a/riscv/riscv64g_bitmanip_decoder.cc b/riscv/riscv64g_bitmanip_decoder.cc
index c6adf3f..826a39f 100644
--- a/riscv/riscv64g_bitmanip_decoder.cc
+++ b/riscv/riscv64g_bitmanip_decoder.cc
@@ -38,10 +38,11 @@
   riscv_isa_ = std::make_unique<isa64gzb::RiscV64GZBInstructionSet>(
       state, riscv_isa_factory_.get());
   riscv_encoding_ = std::make_unique<isa64gzb::RiscV64GZBEncoding>(state);
-  decoder_ = std::make_unique<
-      RiscVGenericDecoder<isa64gzb::OpcodeEnum, isa64gzb::RiscV64GZBEncoding,
-                          isa64gzb::RiscV64GZBInstructionSet>>(
-      state, memory, riscv_encoding_.get(), riscv_isa_.get());
+  decoder_ =
+      std::make_unique<RiscVGenericDecoder<RiscVState, isa64gzb::OpcodeEnum,
+                                           isa64gzb::RiscV64GZBEncoding,
+                                           isa64gzb::RiscV64GZBInstructionSet>>(
+          state, memory, riscv_encoding_.get(), riscv_isa_.get());
 }
 
 generic::Instruction* RiscV64GBitmanipDecoder::DecodeInstruction(
diff --git a/riscv/riscv64g_bitmanip_decoder.h b/riscv/riscv64g_bitmanip_decoder.h
index 847243a..4f57d68 100644
--- a/riscv/riscv64g_bitmanip_decoder.h
+++ b/riscv/riscv64g_bitmanip_decoder.h
@@ -73,9 +73,9 @@
  private:
   RiscVState* state_;
   util::MemoryInterface* memory_;
-  std::unique_ptr<
-      RiscVGenericDecoder<isa64gzb::OpcodeEnum, isa64gzb::RiscV64GZBEncoding,
-                          isa64gzb::RiscV64GZBInstructionSet>>
+  std::unique_ptr<RiscVGenericDecoder<RiscVState, isa64gzb::OpcodeEnum,
+                                      isa64gzb::RiscV64GZBEncoding,
+                                      isa64gzb::RiscV64GZBInstructionSet>>
       decoder_;
   std::unique_ptr<isa64gzb::RiscV64GZBEncoding> riscv_encoding_;
   std::unique_ptr<RV64GZBIsaFactory> riscv_isa_factory_;
diff --git a/riscv/riscv64g_vec_decoder.cc b/riscv/riscv64g_vec_decoder.cc
index 9707e09..007c8b8 100644
--- a/riscv/riscv64g_vec_decoder.cc
+++ b/riscv/riscv64g_vec_decoder.cc
@@ -38,10 +38,11 @@
   riscv_isa_ = std::make_unique<isa64v::RiscV64GVInstructionSet>(
       state, riscv_isa_factory_.get());
   riscv_encoding_ = std::make_unique<isa64v::RiscV64GVecEncoding>(state);
-  decoder_ = std::make_unique<
-      RiscVGenericDecoder<isa64v::OpcodeEnum, isa64v::RiscV64GVecEncoding,
-                          isa64v::RiscV64GVInstructionSet>>(
-      state, memory, riscv_encoding_.get(), riscv_isa_.get());
+  decoder_ =
+      std::make_unique<RiscVGenericDecoder<RiscVState, isa64v::OpcodeEnum,
+                                           isa64v::RiscV64GVecEncoding,
+                                           isa64v::RiscV64GVInstructionSet>>(
+          state, memory, riscv_encoding_.get(), riscv_isa_.get());
 }
 
 generic::Instruction* RiscV64GVecDecoder::DecodeInstruction(uint64_t address) {
diff --git a/riscv/riscv64g_vec_decoder.h b/riscv/riscv64g_vec_decoder.h
index 0b584f1..f28222d 100644
--- a/riscv/riscv64g_vec_decoder.h
+++ b/riscv/riscv64g_vec_decoder.h
@@ -72,9 +72,9 @@
  private:
   RiscVState* const state_;
   util::MemoryInterface* const memory_;
-  std::unique_ptr<
-      RiscVGenericDecoder<isa64v::OpcodeEnum, isa64v::RiscV64GVecEncoding,
-                          isa64v::RiscV64GVInstructionSet>>
+  std::unique_ptr<RiscVGenericDecoder<RiscVState, isa64v::OpcodeEnum,
+                                      isa64v::RiscV64GVecEncoding,
+                                      isa64v::RiscV64GVInstructionSet>>
       decoder_;
   std::unique_ptr<isa64v::RiscV64GVecEncoding> riscv_encoding_;
   std::unique_ptr<RV64GVIsaFactory> riscv_isa_factory_;
diff --git a/riscv/riscv64gzb_vec_decoder.cc b/riscv/riscv64gzb_vec_decoder.cc
index bc5bbbe..f621fa3 100644
--- a/riscv/riscv64gzb_vec_decoder.cc
+++ b/riscv/riscv64gzb_vec_decoder.cc
@@ -39,7 +39,7 @@
       state, riscv_isa_factory_.get());
   riscv_encoding_ = std::make_unique<isa64gvzb::RiscV64GZBVecEncoding>(state);
   decoder_ = std::make_unique<RiscVGenericDecoder<
-      isa64gvzb::OpcodeEnum, isa64gvzb::RiscV64GZBVecEncoding,
+      RiscVState, isa64gvzb::OpcodeEnum, isa64gvzb::RiscV64GZBVecEncoding,
       isa64gvzb::RiscV64GVZBInstructionSet>>(
       state, memory, riscv_encoding_.get(), riscv_isa_.get());
 }
diff --git a/riscv/riscv64gzb_vec_decoder.h b/riscv/riscv64gzb_vec_decoder.h
index 954e56b..c04df62 100644
--- a/riscv/riscv64gzb_vec_decoder.h
+++ b/riscv/riscv64gzb_vec_decoder.h
@@ -72,7 +72,7 @@
  private:
   RiscVState* const state_;
   util::MemoryInterface* const memory_;
-  std::unique_ptr<RiscVGenericDecoder<isa64gvzb::OpcodeEnum,
+  std::unique_ptr<RiscVGenericDecoder<RiscVState, isa64gvzb::OpcodeEnum,
                                       isa64gvzb::RiscV64GZBVecEncoding,
                                       isa64gvzb::RiscV64GVZBInstructionSet>>
       decoder_;
diff --git a/riscv/riscv_generic_decoder.h b/riscv/riscv_generic_decoder.h
index 9e24d9b..a93700d 100644
--- a/riscv/riscv_generic_decoder.h
+++ b/riscv/riscv_generic_decoder.h
@@ -33,10 +33,10 @@
 
 using ::mpact::sim::generic::Instruction;
 
-template <typename OpcodeEnum, typename Encoding, typename Isa>
+template <typename State, typename OpcodeEnum, typename Encoding, typename Isa>
 class RiscVGenericDecoder {
  public:
-  RiscVGenericDecoder(RiscVState* state, util::MemoryInterface* memory,
+  RiscVGenericDecoder(State* state, util::MemoryInterface* memory,
                       Encoding* encoding, Isa* isa)
       : state_(state), memory_(memory), encoding_(encoding), isa_(isa) {
     auto res =
diff --git a/riscv/rv32g_sim.cc b/riscv/rv32g_sim.cc
index e246cc7..a45c698 100644
--- a/riscv/rv32g_sim.cc
+++ b/riscv/rv32g_sim.cc
@@ -53,6 +53,7 @@
 #include "riscv/riscv32_htif_semihost.h"
 #include "riscv/riscv32g_bitmanip_decoder.h"
 #include "riscv/riscv_arm_semihost.h"
+#include "riscv/riscv_csr.h"
 #include "riscv/riscv_fp_state.h"
 #include "riscv/riscv_register.h"
 #include "riscv/riscv_register_aliases.h"
@@ -156,6 +157,9 @@
 ABSL_FLAG(std::string, icache, "", "Instruction cache configuration");
 ABSL_FLAG(std::string, dcache, "", "Data cache configuration");
 
+// Flag to set the default value for the misa CSR.
+ABSL_FLAG(std::optional<uint64_t>, misa, std::nullopt, "misa value");
+
 constexpr char kStackEndSymbolName[] = "__stack_end";
 constexpr char kStackSizeSymbolName[] = "__stack_size";
 
@@ -295,6 +299,16 @@
         reg_name, ::mpact::sim::riscv::kFRegisterAliases[i]);
   }
 
+  if (absl::GetFlag(FLAGS_misa).has_value()) {
+    auto misa_res = rv_state.csr_set()->GetCsr(
+        static_cast<uint32_t>(::mpact::sim::riscv::RiscVCsrEnum::kMIsa));
+    if (!misa_res.ok()) {
+      LOG(FATAL) << "Failed to get misa CSR: " << misa_res.status();
+    }
+    auto misa_csr = misa_res.value();
+    misa_csr->Set(absl::GetFlag(FLAGS_misa).value());
+  }
+
   RiscVTop riscv_top("RiscV32Sim", &rv_state, rv_decoder);
 
   if (!absl::GetFlag(FLAGS_icache).empty()) {
diff --git a/riscv/rv32gv_sim.cc b/riscv/rv32gv_sim.cc
index c7cd8a9..36d52fb 100644
--- a/riscv/rv32gv_sim.cc
+++ b/riscv/rv32gv_sim.cc
@@ -53,6 +53,7 @@
 #include "riscv/riscv32g_vec_decoder.h"
 #include "riscv/riscv32gzb_vec_decoder.h"
 #include "riscv/riscv_arm_semihost.h"
+#include "riscv/riscv_csr.h"
 #include "riscv/riscv_fp_state.h"
 #include "riscv/riscv_register.h"
 #include "riscv/riscv_register_aliases.h"
@@ -157,6 +158,9 @@
 ABSL_FLAG(std::string, icache, "", "Instruction cache configuration");
 ABSL_FLAG(std::string, dcache, "", "Data cache configuration");
 
+// Flag to set the default value for the misa CSR.
+ABSL_FLAG(std::optional<uint64_t>, misa, std::nullopt, "misa value");
+
 constexpr char kStackEndSymbolName[] = "__stack_end";
 constexpr char kStackSizeSymbolName[] = "__stack_size";
 
@@ -296,6 +300,16 @@
         reg_name, ::mpact::sim::riscv::kFRegisterAliases[i]);
   }
 
+  if (absl::GetFlag(FLAGS_misa).has_value()) {
+    auto misa_res = rv_state.csr_set()->GetCsr(
+        static_cast<uint32_t>(::mpact::sim::riscv::RiscVCsrEnum::kMIsa));
+    if (!misa_res.ok()) {
+      LOG(FATAL) << "Failed to get misa CSR: " << misa_res.status();
+    }
+    auto misa_csr = misa_res.value();
+    misa_csr->Set(absl::GetFlag(FLAGS_misa).value());
+  }
+
   RiscVTop riscv_top("RiscV32GVSim", &rv_state, rv_decoder);
 
   if (absl::GetFlag(FLAGS_exit_on_ecall)) {
diff --git a/riscv/rv64g_sim.cc b/riscv/rv64g_sim.cc
index d2ac4c5..fe80fcc 100644
--- a/riscv/rv64g_sim.cc
+++ b/riscv/rv64g_sim.cc
@@ -50,6 +50,7 @@
 #include "riscv/debug_command_shell.h"
 #include "riscv/riscv64_decoder.h"
 #include "riscv/riscv_arm_semihost.h"
+#include "riscv/riscv_csr.h"
 #include "riscv/riscv_fp_state.h"
 #include "riscv/riscv_register.h"
 #include "riscv/riscv_register_aliases.h"
@@ -146,6 +147,9 @@
 // Quiet mode. Suppress informational and warning messages.
 ABSL_FLAG(bool, quiet, false, "Suppress informational and warning messages");
 
+// Flag to set the default value for the misa CSR.
+ABSL_FLAG(std::optional<uint64_t>, misa, std::nullopt, "misa value");
+
 constexpr char kStackEndSymbolName[] = "__stack_end";
 constexpr char kStackSizeSymbolName[] = "__stack_size";
 
@@ -259,6 +263,16 @@
         reg_name, ::mpact::sim::riscv::kFRegisterAliases[i]);
   }
 
+  if (absl::GetFlag(FLAGS_misa).has_value()) {
+    auto misa_res = rv_state.csr_set()->GetCsr(
+        static_cast<uint32_t>(::mpact::sim::riscv::RiscVCsrEnum::kMIsa));
+    if (!misa_res.ok()) {
+      LOG(FATAL) << "Failed to get misa CSR: " << misa_res.status();
+    }
+    auto misa_csr = misa_res.value();
+    misa_csr->Set(absl::GetFlag(FLAGS_misa).value());
+  }
+
   RiscVTop riscv_top("RiscV32Sim", &rv_state, &rv_decoder);
 
   if (absl::GetFlag(FLAGS_exit_on_ecall)) {
@@ -439,7 +453,7 @@
   std::fstream proto_file(proto_file_name.c_str(), std::ios_base::out);
   std::string serialized;
   if (!proto_file.good() || !google::protobuf::TextFormat::PrintToString(
-                                *component_proto.get(), &serialized)) {
+                                *component_proto, &serialized)) {
     LOG(ERROR) << "Failed to write proto to file";
   } else {
     proto_file << serialized;
diff --git a/riscv/rv64gv_sim.cc b/riscv/rv64gv_sim.cc
index 5a2cc15..2bac95d 100644
--- a/riscv/rv64gv_sim.cc
+++ b/riscv/rv64gv_sim.cc
@@ -52,6 +52,7 @@
 #include "riscv/riscv64g_vec_decoder.h"
 #include "riscv/riscv64gzb_vec_decoder.h"
 #include "riscv/riscv_arm_semihost.h"
+#include "riscv/riscv_csr.h"
 #include "riscv/riscv_fp_state.h"
 #include "riscv/riscv_register.h"
 #include "riscv/riscv_register_aliases.h"
@@ -151,6 +152,9 @@
 // Quiet mode. Suppress informational and warning messages.
 ABSL_FLAG(bool, quiet, false, "Suppress informational and warning messages");
 
+// Flag to set the default value for the misa CSR.
+ABSL_FLAG(std::optional<uint64_t>, misa, std::nullopt, "misa value");
+
 constexpr char kStackEndSymbolName[] = "__stack_end";
 constexpr char kStackSizeSymbolName[] = "__stack_size";
 
@@ -271,6 +275,16 @@
         reg_name, ::mpact::sim::riscv::kFRegisterAliases[i]);
   }
 
+  if (absl::GetFlag(FLAGS_misa).has_value()) {
+    auto misa_res = rv_state.csr_set()->GetCsr(
+        static_cast<uint32_t>(::mpact::sim::riscv::RiscVCsrEnum::kMIsa));
+    if (!misa_res.ok()) {
+      LOG(FATAL) << "Failed to get misa CSR: " << misa_res.status();
+    }
+    auto misa_csr = misa_res.value();
+    misa_csr->Set(absl::GetFlag(FLAGS_misa).value());
+  }
+
   RiscVTop riscv_top("RiscV32Sim", &rv_state, rv_decoder);
 
   if (absl::GetFlag(FLAGS_exit_on_ecall)) {