Add support for RVV for kelvin simulator

Also some minor clean-ups.

Change-Id: I091bd299ac49a2d19ecab0c1b7ee0b6435a5d264
diff --git a/hw_sim/BUILD b/hw_sim/BUILD
index e79024f..ba3360b 100644
--- a/hw_sim/BUILD
+++ b/hw_sim/BUILD
@@ -23,8 +23,8 @@
         "hw_primitives.h",
     ],
     deps = [
-        "//hdl/chisel/src/kelvin:core_mini_axi_cc_library_cc",
         "@com_google_absl//absl/types:span",
+        "@verilator//:libverilator",
     ],
 )
 
@@ -36,6 +36,8 @@
     ],
     deps = [
         ":hw_primitives",
+        "//hdl/chisel/src/kelvin:core_mini_axi_cc_library_cc",
+        "//hdl/chisel/src/kelvin:rvv_core_mini_axi_cc_library_cc",
     ],
 )
 
@@ -50,35 +52,38 @@
     deps = [
         ":core_mini_axi_wrapper",
         "//tests/verilator_sim:elf",
-        "//hdl/chisel/src/kelvin:core_mini_axi_cc_library_cc",
-        "@com_google_absl//absl/types:span",
     ],
 )
 
 cc_library(
-  name = "kelvin_simulator_headers",
-  hdrs = [
-    "kelvin_simulator.h",
-    "mailbox.h",
-  ],
+    name = "kelvin_simulator_headers",
+    hdrs = [
+        "kelvin_simulator.h",
+        "mailbox.h",
+    ],
 )
 
 cc_library(
-  name = "core_mini_axi_simulator",
-  srcs = ["core_mini_axi_simulator.cc"],
-  deps = [
-    ":core_mini_axi_wrapper",
-    ":kelvin_simulator_headers",
-  ],
-  linkstatic = True,
-  alwayslink = True,
-)
-
-cc_shared_library(
-    name = "core_mini_axi_sim",
+    name = "core_mini_axi_simulator",
+    srcs = ["core_mini_axi_simulator.cc"],
+    linkstatic = True,
     deps = [
-        ":core_mini_axi_simulator",
+        ":core_mini_axi_wrapper",
+        ":kelvin_simulator_headers",
     ],
+    alwayslink = True,
+)
+
+cc_library(
+    name = "core_mini_axi_simulator_rvv",
+    srcs = ["core_mini_axi_simulator.cc"],
+    copts = ["-DENABLE_RVV"],
+    linkstatic = True,
+    deps = [
+        ":core_mini_axi_wrapper",
+        ":kelvin_simulator_headers",
+    ],
+    alwayslink = True,
 )
 
 kelvin_v2_binary(
@@ -99,13 +104,20 @@
     deps = [
         ":core_mini_axi_simulator",
         "//tests/verilator_sim:elf",
-        "@com_google_absl//absl/types:span",
     ],
 )
 
+# generate libraries for external projects
 cc_binary(
     name = "libkelvin_simulator.so",
-    linkshared = 1,
+    linkshared = True,
     visibility = ["//visibility:public"],
     deps = [":core_mini_axi_simulator"],
 )
+
+cc_binary(
+    name = "libkelvin_simulator_rvv.so",
+    linkshared = True,
+    visibility = ["//visibility:public"],
+    deps = [":core_mini_axi_simulator_rvv"],
+)
diff --git a/hw_sim/core_mini_axi_simulator.cc b/hw_sim/core_mini_axi_simulator.cc
index d1f181e..356c2a7 100644
--- a/hw_sim/core_mini_axi_simulator.cc
+++ b/hw_sim/core_mini_axi_simulator.cc
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include <vector>
+
 #include "hw_sim/core_mini_axi_wrapper.h"
 #include "hw_sim/kelvin_simulator.h"
 
@@ -89,7 +91,7 @@
 
   AxiWResp resp;
   resp.write_resp_bits_id = addr.addr_bits_id;
-  resp.write_resp_bits_resp = 1;
+  resp.write_resp_bits_resp = 0;
   return resp;
 }
 
diff --git a/hw_sim/core_mini_axi_simulator_example.cc b/hw_sim/core_mini_axi_simulator_example.cc
index 73c9f43..6ede961 100644
--- a/hw_sim/core_mini_axi_simulator_example.cc
+++ b/hw_sim/core_mini_axi_simulator_example.cc
@@ -17,16 +17,9 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
-#include <bitset>
 #include <cstdint>
-#include <future>
 #include <iostream>
-#include <memory>
-#include <optional>
-#include <queue>
-#include <vector>
 
-#include "absl/types/span.h"
 #include "hw_sim/kelvin_simulator.h"
 #include "tests/verilator_sim/elf.h"
 
diff --git a/hw_sim/core_mini_axi_wrapper.h b/hw_sim/core_mini_axi_wrapper.h
index 16efc56..3f8a24f 100644
--- a/hw_sim/core_mini_axi_wrapper.h
+++ b/hw_sim/core_mini_axi_wrapper.h
@@ -15,9 +15,19 @@
 #ifndef HW_SIM_CORE_MINI_AXI_WRAPPER_H_
 #define HW_SIM_CORE_MINI_AXI_WRAPPER_H_
 
+#include <algorithm>
+#include <memory>
+#include <vector>
+
 #include "hw_sim/hw_primitives.h"
 #include "hw_sim/mailbox.h"
 
+#ifdef ENABLE_RVV
+#include "VRvvCoreMiniAxi.h"
+#else
+#include "VCoreMiniAxi.h"
+#endif
+
 class CoreMiniAxiWrapper {
  public:
   explicit CoreMiniAxiWrapper(VerilatedContext* context)
@@ -208,7 +218,11 @@
  private:
   VerilatedContext* const context_;
   KelvinMailbox mailbox_;
+#ifdef ENABLE_RVV
+  VRvvCoreMiniAxi core_;
+#else
   VCoreMiniAxi core_;
+#endif
   Clock clock_;
   AxiSlaveWriteDriver slave_write_driver_;
   AxiSlaveReadDriver slave_read_driver_;
diff --git a/hw_sim/core_mini_axi_wrapper_example.cc b/hw_sim/core_mini_axi_wrapper_example.cc
index 740f6cd..f7b6132 100644
--- a/hw_sim/core_mini_axi_wrapper_example.cc
+++ b/hw_sim/core_mini_axi_wrapper_example.cc
@@ -17,16 +17,9 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
-#include <bitset>
 #include <cstdint>
-#include <future>
 #include <iostream>
-#include <memory>
-#include <optional>
-#include <queue>
-#include <vector>
-
-#include "absl/types/span.h"
+#
 #include "hw_sim/core_mini_axi_wrapper.h"
 #include "tests/verilator_sim/elf.h"
 
diff --git a/hw_sim/hw_primitives.h b/hw_sim/hw_primitives.h
index b8f4316..dc2ea18 100644
--- a/hw_sim/hw_primitives.h
+++ b/hw_sim/hw_primitives.h
@@ -15,13 +15,15 @@
 #ifndef HW_SIM_HW_PRIMITIVES_H_
 #define HW_SIM_HW_PRIMITIVES_H_
 
-#include <functional>
+#include <verilated.h>
+
+#include <algorithm>
+#include <map>
+#include <memory>
 #include <queue>
 #include <vector>
 
 #include "absl/types/span.h"
-#include "VCoreMiniAxi.h"
-
 
 // A class that wraps and controls a verilator clock signal. Also provides an
 // observer mechanism
@@ -548,9 +550,8 @@
         write_resp_bits_id_(write_resp_bits_id),
         write_resp_bits_resp_(write_resp_bits_resp),
         write_resp_ready_(write_resp_ready) {
-    // Always ready to accept address and data
-    *write_addr_ready_ = 1;
-    *write_data_ready_ = 1;
+    *write_addr_ready_ = 0;
+    *write_data_ready_ = 0;
   }
   ~AxiMasterWriteDriver() final = default;
 
@@ -595,12 +596,17 @@
     }
 
     if (*write_addr_valid_ && *write_data_valid_) {
+      *write_addr_ready_ = 1;
+      *write_data_ready_ = 1;
       if (write_cb_) {
         AxiWResp resp_result = write_cb_(axi_addr_, axi_data_);
         resp_queue_.push(resp_result);
       } else {
         assert(false && "Write callback is empty!");
       }
+    } else {
+      *write_addr_ready_ = 0;
+      *write_data_ready_ = 0;
     }
   }
 
diff --git a/hw_sim/kelvin_simulator.h b/hw_sim/kelvin_simulator.h
index f512490..73eee7d 100644
--- a/hw_sim/kelvin_simulator.h
+++ b/hw_sim/kelvin_simulator.h
@@ -15,8 +15,6 @@
 #ifndef HW_SIM_KELVIN_SIMULATOR_H_
 #define HW_SIM_KELVIN_SIMULATOR_H_
 
-#include <cstdlib>
-
 #include "hw_sim/mailbox.h"
 
 class KelvinSimulator {