Kelvin MluTest Added

Add basic MLU test to provide some test coverage for mlu

Change-Id: I9c27012a626ce4a7a383ac2cb5bad65764845506
diff --git a/hdl/chisel/src/kelvin/BUILD b/hdl/chisel/src/kelvin/BUILD
index 9873eed..a1c550e 100644
--- a/hdl/chisel/src/kelvin/BUILD
+++ b/hdl/chisel/src/kelvin/BUILD
@@ -12,19 +12,21 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-load("@kelvin_hw//rules:chisel.bzl",
+load(
+    "@kelvin_hw//rules:chisel.bzl",
     "chisel_binary",
     "chisel_cc_library",
     "chisel_library",
-    "chisel_test")
+    "chisel_test",
+)
 
 package(default_visibility = ["//visibility:public"])
 
 chisel_library(
     name = "kelvin_float",
     srcs = [
-        "scalar/Fpu.scala",
         "scalar/FRegfile.scala",
+        "scalar/Fpu.scala",
     ],
     deps = [
         ":kelvin",
@@ -36,8 +38,8 @@
 chisel_test(
     name = "kelvin_float_tests",
     srcs = [
-        "scalar/FpuTest.scala",
         "scalar/FRegfileTest.scala",
+        "scalar/FpuTest.scala",
     ],
     deps = [
         ":kelvin",
@@ -46,6 +48,16 @@
     ],
 )
 
+chisel_test(
+    name = "kelvin_scalar_tests",
+    srcs = [
+        "scalar/MluTest.scala",
+    ],
+    deps = [
+        ":kelvin",
+    ],
+)
+
 chisel_library(
     name = "kelvin",
     srcs = [
@@ -72,16 +84,16 @@
         "scalar/Regfile.scala",
         "scalar/SCore.scala",
         "scalar/SLog.scala",
-        "vector/VAluInt.scala",
         "vector/VAlu.scala",
+        "vector/VAluInt.scala",
         "vector/VCmdq.scala",
         "vector/VCommon.scala",
         "vector/VConvAlu.scala",
         "vector/VConvCtrl.scala",
         "vector/VCore.scala",
+        "vector/VDecode.scala",
         "vector/VDecodeInstruction.scala",
         "vector/VDecodeOp.scala",
-        "vector/VDecode.scala",
         "vector/VDot.scala",
         "vector/VEncodeOp.scala",
         "vector/VInst.scala",
@@ -92,7 +104,7 @@
         "vector/VSt.scala",
     ],
     deps = [
-        "//hdl/chisel/src/common:common",
+        "//hdl/chisel/src/common",
     ],
 )
 
@@ -226,10 +238,10 @@
 
 chisel_binary(
     name = "emit_parameters_header",
+    main_class = "kelvin.EmitParametersHeader",
     deps = [
         ":kelvin",
     ],
-    main_class = "kelvin.EmitParametersHeader",
 )
 
 genrule(
@@ -237,7 +249,7 @@
     outs = [
         "kelvin_parameters.h",
     ],
-    tools = [":emit_parameters_header"],
     cmd = "$(location :emit_parameters_header) > $(location kelvin_parameters.h)",
+    tools = [":emit_parameters_header"],
     visibility = ["//visibility:public"],
 )
diff --git a/hdl/chisel/src/kelvin/scalar/MluTest.scala b/hdl/chisel/src/kelvin/scalar/MluTest.scala
new file mode 100644
index 0000000..80f11c4
--- /dev/null
+++ b/hdl/chisel/src/kelvin/scalar/MluTest.scala
@@ -0,0 +1,60 @@
+// Copyright 2024 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package kelvin
+
+import chisel3._
+import chisel3.util._
+import chiseltest._
+import org.scalatest.freespec.AnyFreeSpec
+import chisel3.experimental.BundleLiterals._
+
+
+class MluSpec extends AnyFreeSpec with ChiselScalatestTester {
+  val p = new Parameters
+
+  "Initialization" in {
+    test(new Mlu(p)) { dut =>
+      assertResult(0) { dut.io.rd.valid.peekInt() }
+    }
+  }
+
+  "Multiply" in {
+    test(new Mlu(p)) { dut =>
+        dut.io.req(0).bits.addr.poke(13)
+        dut.io.req(0).bits.op.poke(MluOp.MUL)
+        dut.io.req(0).valid.poke(true.B)
+        dut.io.req(1).valid.poke(false.B)
+        dut.io.req(2).valid.poke(false.B)
+        dut.io.req(3).valid.poke(false.B)
+        for(i <- 0 until 4){
+            dut.io.rs1(i).valid.poke(true.B)
+            dut.io.rs1(i).data.poke(i + 2)
+            dut.io.rs2(i).valid.poke(true.B)
+            dut.io.rs2(i).data.poke(i + 2)
+        }
+
+        dut.clock.step()
+        dut.io.req(0).valid.poke(false.B)
+
+        dut.clock.step()
+        assertResult(1) { dut.io.rd.valid.peekInt() }
+        assertResult(13) { dut.io.rd.addr.peekInt() }
+        assertResult(4) { dut.io.rd.data.peekInt() }
+
+        dut.clock.step()
+        assertResult(0) { dut.io.rd.valid.peekInt() }
+    }
+  }
+}