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;