Add mcycle CSR
Change-Id: I37b12c7d85f17aa264b5000be33fb01b50bf3996
diff --git a/hdl/chisel/src/kelvin/scalar/Csr.scala b/hdl/chisel/src/kelvin/scalar/Csr.scala
index 6d5311e..346c9dc 100644
--- a/hdl/chisel/src/kelvin/scalar/Csr.scala
+++ b/hdl/chisel/src/kelvin/scalar/Csr.scala
@@ -130,6 +130,9 @@
val mepc = RegInit(0.U(32.W))
val mhartid = RegInit(0.U(32.W))
+
+ val mcycle = RegInit(0.U(64.W))
+
// 32-bit MXLEN, I,M,X extensions
val misa = RegInit(0x40801100.U(32.W))
// Kelvin-specific ISA register.
@@ -165,6 +168,10 @@
val mcontext7En = index === 0x7C7.U
val mpcEn = index === 0x7E0.U
val mspEn = index === 0x7E1.U
+ // M-mode performance CSRs.
+ val mcycleEn = index === 0xB00.U
+ val mcyclehEn = index === 0xB80.U
+ // M-mode information CSRs.
val mvendoridEn = index === 0xF11.U
val marchidEn = index === 0xF12.U
val mimpidEn = index === 0xF13.U
@@ -222,6 +229,8 @@
MuxOR(mcontext7En, mcontext7) |
MuxOR(mpcEn, mpc) |
MuxOR(mspEn, msp) |
+ MuxOR(mcycleEn, mcycle(31,0)) |
+ MuxOR(mcyclehEn, mcycle(63,32)) |
MuxOR(mvendoridEn, mvendorid) |
MuxOR(marchidEn, marchid) |
MuxOR(mimpidEn, mimpid) |
@@ -255,6 +264,16 @@
when (mcontext7En) { mcontext7 := wdata }
}
+ // mcycle implementation
+ // If one of the enable signals for
+ // the register are true, overwrite the enabled half
+ // of the register.
+ // Increment the value of mcycle by 1.
+ val mcycle_th = Mux(mcyclehEn, wdata, mcycle(63,32))
+ val mcycle_tl = Mux(mcycleEn, wdata, mcycle(31,0))
+ val mcycle_t = Cat(mcycle_th, mcycle_tl)
+ mcycle := Mux(valid, mcycle_t, mcycle) + 1.U
+
when (io.bru.in.mode.valid) {
mode := io.bru.in.mode.bits
}