Add CSR tracing to RVVI

Change-Id: Ifc0239c8ffdb4bb149c30e78555614e4c9ef5ba6
diff --git a/hdl/chisel/src/kelvin/Interfaces.scala b/hdl/chisel/src/kelvin/Interfaces.scala
index 1e0f890..f6c9a09 100644
--- a/hdl/chisel/src/kelvin/Interfaces.scala
+++ b/hdl/chisel/src/kelvin/Interfaces.scala
@@ -285,3 +285,9 @@
   val float_rs = Option.when(p.enableFloat)(new FRegfileRead)
   val debug_mode = Output(Bool())
 }
+
+class CsrTraceIO(p: Parameters) extends Bundle {
+  val valid = Bool()
+  val addr = UInt(12.W)
+  val data = UInt(32.W)
+}
diff --git a/hdl/chisel/src/kelvin/RvviTrace.scala b/hdl/chisel/src/kelvin/RvviTrace.scala
index faf2a9a..fb72ee3 100644
--- a/hdl/chisel/src/kelvin/RvviTrace.scala
+++ b/hdl/chisel/src/kelvin/RvviTrace.scala
@@ -142,6 +142,7 @@
 class RvviTrace(p: Parameters) extends Module {
     val io = IO(new Bundle {
         val rb = Input(new RetirementBufferDebugIO(p))
+        val csr = Input(new CsrTraceIO(p))
     })
     val x_wdata = Wire(Vec(p.retirementBufferSize, Vec(32, UInt(32.W))))
     val x_wb = Wire(Vec(p.retirementBufferSize, Vec(32, Bool())))
@@ -207,12 +208,10 @@
             v_wb(i)(j) := false.B
         }
 
-        ///////////////////////////////////
-        // TODO(atv): This is just generally not tracked.
-        ///////////////////////////////////
         for (j <- 0 until 4096) {
-            csr(i)(j) := 0.U.asTypeOf(csr(i)(j))
-            csr_wb(i)(j) := false.B
+            val csr_wb_valid = valid && io.csr.valid && (io.csr.addr === j.U)
+            csr(i)(j) := MuxOR(csr_wb_valid, io.csr.data)
+            csr_wb(i)(j) := csr_wb_valid
         }
     }
-}
\ No newline at end of file
+}
diff --git a/hdl/chisel/src/kelvin/scalar/Csr.scala b/hdl/chisel/src/kelvin/scalar/Csr.scala
index e8c4040..2b92bfd 100644
--- a/hdl/chisel/src/kelvin/scalar/Csr.scala
+++ b/hdl/chisel/src/kelvin/scalar/Csr.scala
@@ -203,6 +203,7 @@
       val dcsr_step = Output(Bool())
       val next_pc = Input(UInt(32.W))
     })
+    val trace = Option.when(p.useRetirementBuffer)(Output(new CsrTraceIO(p)))
   })
 
   def LegalizeTdata1(wdata: UInt): Tdata1 = {
@@ -577,6 +578,12 @@
   io.rd.bits.addr  := req.bits.addr
   io.rd.bits.data  := rdata
 
+  if (p.useRetirementBuffer) {
+    io.trace.get.valid := req.valid
+    io.trace.get.addr := req.bits.index
+    io.trace.get.data := wdata
+  }
+
   // Assertions.
   assert(!(req.valid && !io.rs1.valid))
 }
diff --git a/hdl/chisel/src/kelvin/scalar/SCore.scala b/hdl/chisel/src/kelvin/scalar/SCore.scala
index 23a2048..68bfdd3 100644
--- a/hdl/chisel/src/kelvin/scalar/SCore.scala
+++ b/hdl/chisel/src/kelvin/scalar/SCore.scala
@@ -531,6 +531,7 @@
     io.debug.rb.get := retirement_buffer.get.io.debug
     val rvvi = Module(new RvviTrace(p))
     rvvi.io.rb := retirement_buffer.get.io.debug
+    rvvi.io.csr := csr.io.trace.get
   }
 }