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 {