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 {