Connect xsat to CSR. Change-Id: Ic87075412de4b8645aee82bb58d4d0ab2841f566
diff --git a/hdl/chisel/src/kelvin/rvv/RvvCore.scala b/hdl/chisel/src/kelvin/rvv/RvvCore.scala index f039c91..24ded3a 100644 --- a/hdl/chisel/src/kelvin/rvv/RvvCore.scala +++ b/hdl/chisel/src/kelvin/rvv/RvvCore.scala
@@ -100,6 +100,7 @@ moduleInterface += """ output vcsr_valid, | output [VSTART_LEN:0] vcsr_vstart, | output [1:0] vcsr_xrm, + | output vcsr_vxsat, | input vcsr_ready, |""".stripMargin.replaceAll("VSTART_LEN", (log2Ceil(vlen) - 1).toString) @@ -215,6 +216,7 @@ coreInstantiation += """ RVVConfigState vector_csr; | assign vcsr_vstart = vector_csr.vstart; | assign vcsr_xrm = vector_csr.xrm; + | assign vcsr_vxsat = vector_csr.xsat; |""".stripMargin // RVV Config State temp output coreInstantiation += """ RVVConfigState config_state; @@ -308,6 +310,7 @@ val vcsr_valid = Output(Bool()) val vcsr_vstart = Output(UInt(7.W)) val vcsr_xrm = Output(UInt(2.W)) + val vcsr_vxsat = Output(Bool()) val vcsr_ready = Input(Bool()) // TODO(derekjchow): Parameterize @@ -394,6 +397,7 @@ val vstart = RegInit(0.U(log2Ceil(p.rvvVlen).W)) val vxrm = RegInit(0.U(2.W)) + val vxsat = RegInit(false.B) val rstn = (!reset.asBool).asAsyncReset val rvvCoreWrapper = Module(new RvvCoreWrapper(p)) @@ -405,10 +409,11 @@ rvvCoreWrapper.io.async_rd <> io.async_rd rvvCoreWrapper.io.vstart := Mux( - io.csr.csr_vstart.valid, io.csr.csr_vstart.bits, vstart) + io.csr.vstart_write.valid, io.csr.vstart_write.bits, vstart) rvvCoreWrapper.io.vxrm := Mux( - io.csr.csr_vxrm.valid, io.csr.csr_vxrm.bits, vxrm) - rvvCoreWrapper.io.vxsat := 0.U + io.csr.vxrm_write.valid, io.csr.vxrm_write.bits, vxrm) + rvvCoreWrapper.io.vxsat := Mux( + io.csr.vxsat_write.valid, io.csr.vxsat_write.bits, vxsat) rvvCoreWrapper.io.vcsr_ready := true.B io.rvv2lsu <> rvvCoreWrapper.io.rvv2lsu @@ -427,17 +432,24 @@ val vstart_wdata = MuxCase(vstart, Seq( rvvCoreWrapper.io.vcsr_valid -> rvvCoreWrapper.io.vcsr_vstart, - io.csr.csr_vstart.valid -> io.csr.csr_vstart.bits, + io.csr.vstart_write.valid -> io.csr.vstart_write.bits, )) vstart := vstart_wdata val vxrm_wdata = MuxCase(vxrm, Seq( rvvCoreWrapper.io.vcsr_valid -> rvvCoreWrapper.io.vcsr_xrm, - io.csr.csr_vxrm.valid -> io.csr.csr_vxrm.bits, + io.csr.vxrm_write.valid -> io.csr.vxrm_write.bits, )) vxrm := vxrm_wdata + val vxsat_wdata = MuxCase(vxsat, Seq( + rvvCoreWrapper.io.vcsr_valid -> rvvCoreWrapper.io.vcsr_vxsat, + io.csr.vxsat_write.valid -> io.csr.vxsat_write.bits, + )) + vxsat := vxsat_wdata + io.csr.vstart := vstart io.csr.vxrm := vxrm + io.csr.vxsat := vxsat }
diff --git a/hdl/chisel/src/kelvin/rvv/RvvInterface.scala b/hdl/chisel/src/kelvin/rvv/RvvInterface.scala index babad57..1f6e8e5 100644 --- a/hdl/chisel/src/kelvin/rvv/RvvInterface.scala +++ b/hdl/chisel/src/kelvin/rvv/RvvInterface.scala
@@ -74,6 +74,8 @@ class RvvCsrIO(p: Parameters) extends Bundle { val vstart = Output(UInt(log2Ceil(p.rvvVlen).W)) val vxrm = Output(UInt(2.W)) - val csr_vstart = Input(Valid(UInt(log2Ceil(p.rvvVlen).W))) - val csr_vxrm = Input(Valid(UInt(2.W))) + val vxsat = Output(Bool()) + val vstart_write = Input(Valid(UInt(log2Ceil(p.rvvVlen).W))) + val vxrm_write = Input(Valid(UInt(2.W))) + val vxsat_write = Input(Valid(Bool())) } \ 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 2b92bfd..80a4f26 100644 --- a/hdl/chisel/src/kelvin/scalar/Csr.scala +++ b/hdl/chisel/src/kelvin/scalar/Csr.scala
@@ -22,9 +22,11 @@ // To Csr from RvvCore val vstart = Input(UInt(log2Ceil(p.rvvVlen).W)) val vxrm = Input(UInt(2.W)) + val vxsat = Input(Bool()) // From Csr to RvvCore val vstart_write = Output(Valid(UInt(log2Ceil(p.rvvVlen).W))) val vxrm_write = Output(Valid(UInt(2.W))) + val vxsat_write = Output(Valid(Bool())) } object Csr { @@ -38,7 +40,8 @@ val FRM = Value(0x002.U(12.W)) val FCSR = Value(0x003.U(12.W)) val VSTART = Value(0x008.U(12.W)) - val VXRM = Value(0x009.U(12.W)) + val VXSAT = Value(0x009.U(12.W)) + val VXRM = Value(0x00A.U(12.W)) val MSTATUS = Value(0x300.U(12.W)) val MISA = Value(0x301.U(12.W)) val MIE = Value(0x304.U(12.W)) @@ -297,6 +300,7 @@ val fcsrEn = csr_address === CsrAddress.FCSR val vstartEn = Option.when(p.enableRvv) { csr_address === CsrAddress.VSTART } val vxrmEn = Option.when(p.enableRvv) { csr_address === CsrAddress.VXRM } + val vxsatEn = Option.when(p.enableRvv) { csr_address === CsrAddress.VXSAT } val mstatusEn = csr_address === CsrAddress.MSTATUS val misaEn = csr_address === CsrAddress.MISA val mieEn = csr_address === CsrAddress.MIE @@ -406,6 +410,7 @@ Seq( vstartEn.get -> io.rvv.get.vstart, vxrmEn.get -> io.rvv.get.vxrm, + vxsatEn.get -> io.rvv.get.vxsat, vlenbEn.get -> 16.U(32.W), // Vector length in Bytes ) }.getOrElse(Seq()) @@ -465,6 +470,8 @@ io.rvv.get.vstart_write.bits := wdata(log2Ceil(p.rvvVlen)-1, 0) io.rvv.get.vxrm_write.valid := req.valid && vxrmEn.get io.rvv.get.vxrm_write.bits := wdata(1,0) + io.rvv.get.vxsat_write.valid := req.valid && vxsatEn.get + io.rvv.get.vxsat_write.bits := wdata(0) } // mcycle implementation
diff --git a/hdl/chisel/src/kelvin/scalar/SCore.scala b/hdl/chisel/src/kelvin/scalar/SCore.scala index 68bfdd3..7a46f36 100644 --- a/hdl/chisel/src/kelvin/scalar/SCore.scala +++ b/hdl/chisel/src/kelvin/scalar/SCore.scala
@@ -428,10 +428,12 @@ // Register inputs io.rvvcore.get.rs := regfile.io.readData - io.rvvcore.get.csr.csr_vstart <> csr.io.rvv.get.vstart_write - io.rvvcore.get.csr.csr_vxrm <> csr.io.rvv.get.vxrm_write + io.rvvcore.get.csr.vstart_write <> csr.io.rvv.get.vstart_write + io.rvvcore.get.csr.vxrm_write <> csr.io.rvv.get.vxrm_write + io.rvvcore.get.csr.vxsat_write <> csr.io.rvv.get.vxsat_write csr.io.rvv.get.vstart := io.rvvcore.get.csr.vstart csr.io.rvv.get.vxrm := io.rvvcore.get.csr.vxrm + csr.io.rvv.get.vxsat := io.rvvcore.get.csr.vxsat } // ---------------------------------------------------------------------------
diff --git a/hdl/verilog/rvv/design/RvvFrontEnd.sv b/hdl/verilog/rvv/design/RvvFrontEnd.sv index 428b252..d69c93c 100644 --- a/hdl/verilog/rvv/design/RvvFrontEnd.sv +++ b/hdl/verilog/rvv/design/RvvFrontEnd.sv
@@ -126,7 +126,7 @@ inst_config_state[0] = config_state_q; inst_config_state[0].vstart = vstart_i; inst_config_state[0].xrm = RVVXRM'(vxrm_i); - //inst_config_state[0].xsat = vxsat_i; + inst_config_state[0].xsat = vxsat_i; for (int i = 0; i < N; i++) begin inst_config_state[i+1] = inst_config_state[i]; is_setvl[i] = 0;
diff --git a/hdl/verilog/rvv/inc/rvv_backend.svh b/hdl/verilog/rvv/inc/rvv_backend.svh index 671b33b..170478b 100755 --- a/hdl/verilog/rvv/inc/rvv_backend.svh +++ b/hdl/verilog/rvv/inc/rvv_backend.svh
@@ -46,7 +46,7 @@ logic [`VTYPE_VMA_WIDTH-1:0] ma; // 0:inactive element undisturbed, 1:inactive element agnostic logic [`VTYPE_VTA_WIDTH-1:0] ta; // 0:tail undisturbed, 1:tail agnostic RVVXRM xrm; - //logic [`VCSR_VXSAT_WIDTH-1:0] xsat; // rvv dont need this bit, but output this to rvs + logic [`VCSR_VXSAT_WIDTH-1:0] xsat; // rvv dont need this bit, but output this to rvs RVVSEW sew; RVVLMUL lmul; } RVVConfigState;