Add debug_req and matcha parameters
Change-Id: I8fd35c702530093d396ce289e8d058ee6ea6fa01
diff --git a/hdl/chisel/src/chai/ChAI.scala b/hdl/chisel/src/chai/ChAI.scala
index 97ce896..cfd1ba6 100644
--- a/hdl/chisel/src/chai/ChAI.scala
+++ b/hdl/chisel/src/chai/ChAI.scala
@@ -70,6 +70,7 @@
u_kelvin.ml_reset := 0.U
u_kelvin.pc_start := 0.U
u_kelvin.volt_sel := 0.U
+ u_kelvin.debug_req := 0.U
io.finish := u_kelvin.finish
io.fault := u_kelvin.fault
diff --git a/hdl/chisel/src/kelvin/Core.scala b/hdl/chisel/src/kelvin/Core.scala
index ee59964..100078c 100644
--- a/hdl/chisel/src/kelvin/Core.scala
+++ b/hdl/chisel/src/kelvin/Core.scala
@@ -30,6 +30,7 @@
val csr = new CsrInOutIO(p)
val halted = Output(Bool())
val fault = Output(Bool())
+ val debug_req = Input(Bool())
val ibus = new IBusIO(p)
val dbus = new DBusIO(p)
diff --git a/hdl/chisel/src/kelvin/Parameters.scala b/hdl/chisel/src/kelvin/Parameters.scala
index 7c4b983..5b4b14e 100644
--- a/hdl/chisel/src/kelvin/Parameters.scala
+++ b/hdl/chisel/src/kelvin/Parameters.scala
@@ -31,7 +31,7 @@
}
-case class Parameters(m: Seq[MemoryRegion] = Seq()) {
+case class Parameters(m: Seq[MemoryRegion] = Seq(), hartId: UInt = 0.U(32.W)) {
case object Core {
val tiny = 0
val little = 1
diff --git a/hdl/chisel/src/kelvin/scalar/Csr.scala b/hdl/chisel/src/kelvin/scalar/Csr.scala
index 9536f11..b7c2315 100644
--- a/hdl/chisel/src/kelvin/scalar/Csr.scala
+++ b/hdl/chisel/src/kelvin/scalar/Csr.scala
@@ -139,7 +139,7 @@
val mscratch = RegInit(0.U(32.W))
val mepc = RegInit(0.U(32.W))
- val mhartid = RegInit(0.U(32.W))
+ val mhartid = RegInit(p.hartId)
val mcycle = RegInit(0.U(64.W))
val minstret = RegInit(0.U(64.W))
diff --git a/hdl/chisel/src/matcha/BUILD b/hdl/chisel/src/matcha/BUILD
index eb4ab1b..ebbc792 100644
--- a/hdl/chisel/src/matcha/BUILD
+++ b/hdl/chisel/src/matcha/BUILD
@@ -22,6 +22,7 @@
"Axi2Sram.scala",
"Crossbar.scala",
"Kelvin.scala",
+ "MatchaParameters.scala",
],
deps = [
"//hdl/chisel/src/common:common",
diff --git a/hdl/chisel/src/matcha/Kelvin.scala b/hdl/chisel/src/matcha/Kelvin.scala
index b8ed6cf..5fd07aa 100644
--- a/hdl/chisel/src/matcha/Kelvin.scala
+++ b/hdl/chisel/src/matcha/Kelvin.scala
@@ -49,6 +49,7 @@
val ml_reset = IO(Input(Bool()))
val pc_start = IO(Input(UInt(32.W)))
val volt_sel = IO(Input(Bool()))
+ val debug_req = IO(Input(Bool()))
val finish = IO(Output(Bool()))
val host_req = IO(Output(Bool()))
@@ -104,6 +105,10 @@
slog := core.io.slog
// -------------------------------------------------------------------------
+ // Debug Request.
+ core.io.debug_req := debug_req
+
+ // -------------------------------------------------------------------------
// L1Cache.
l1d.io.dbus <> core.io.dbus
l1d.io.flush <> core.io.dflush
@@ -144,6 +149,6 @@
}
object EmitKelvin extends App {
- val p = new kelvin.Parameters(Seq())
+ val p = new kelvin.MatchaParameters
ChiselStage.emitSystemVerilogFile(new Kelvin(p), args)
}
diff --git a/hdl/chisel/src/matcha/MatchaParameters.scala b/hdl/chisel/src/matcha/MatchaParameters.scala
new file mode 100644
index 0000000..7b5e6cf
--- /dev/null
+++ b/hdl/chisel/src/matcha/MatchaParameters.scala
@@ -0,0 +1,29 @@
+// 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._
+
+class MatchaParameters(m: Seq[MemoryRegion] = Seq(),
+ hartId: UInt = 2.U(32.W)) extends Parameters(m) {
+
+ // Debug
+ // tl_main_pkg::ADDR_SPACE_DBG + dm::HaltAddress
+ val dbgBase = 0x4000
+ val haltAddress = 0x800
+ val dmHaltAddress = dbgBase + haltAddress
+
+}
diff --git a/tests/verilator_sim/kelvin/core_tb.cc b/tests/verilator_sim/kelvin/core_tb.cc
index 9836dc6..969e361 100644
--- a/tests/verilator_sim/kelvin/core_tb.cc
+++ b/tests/verilator_sim/kelvin/core_tb.cc
@@ -45,6 +45,7 @@
sc_signal<bool> io_halted;
sc_signal<bool> io_fault;
+ sc_signal<bool> io_debug_req;
sc_signal<bool> io_ibus_valid;
sc_signal<bool> io_ibus_ready;
sc_signal<bool> io_dbus_valid;
@@ -150,6 +151,7 @@
core.reset(tb.reset);
core.io_halted(io_halted);
core.io_fault(io_fault);
+ core.io_debug_req(io_debug_req);
core.io_ibus_valid(io_ibus_valid);
core.io_ibus_ready(io_ibus_ready);
core.io_dbus_valid(io_dbus_valid);
diff --git a/tests/verilator_sim/matcha/kelvin_tb.cc b/tests/verilator_sim/matcha/kelvin_tb.cc
index 5211117..5304184 100644
--- a/tests/verilator_sim/matcha/kelvin_tb.cc
+++ b/tests/verilator_sim/matcha/kelvin_tb.cc
@@ -42,6 +42,7 @@
sc_signal<bool> clk_freeze;
sc_signal<bool> ml_reset;
sc_signal<bool> volt_sel;
+ sc_signal<bool> debug_req;
sc_signal<bool> slog_valid;
sc_signal<sc_bv<5> > slog_addr;
sc_signal<sc_bv<32> > slog_data;
@@ -61,6 +62,7 @@
clk_freeze = 0;
pc_start = 0x00000000;
volt_sel = 0;
+ debug_req = 0;
tb.io_halted(finish);
tb.io_fault(fault);
@@ -74,6 +76,7 @@
core.finish(finish);
core.fault(fault);
core.host_req(host_req);
+ core.host_req(debug_req);
core.slog_valid(slog_valid);
core.slog_addr(slog_addr);
core.slog_data(slog_data);