MachineCsr add mcycle and minstret
This commit is contained in:
parent
94770f8e0b
commit
de4c2470c8
|
@ -33,8 +33,9 @@ case class MachineCsrConfig(
|
||||||
mepcAccess : CsrAccess,
|
mepcAccess : CsrAccess,
|
||||||
mscratchGen : Boolean,
|
mscratchGen : Boolean,
|
||||||
mcauseAccess : CsrAccess,
|
mcauseAccess : CsrAccess,
|
||||||
mbadaddrAccess : CsrAccess
|
mbadaddrAccess : CsrAccess,
|
||||||
|
mcycleAccess : CsrAccess,
|
||||||
|
minstretAccess : CsrAccess
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -54,11 +55,6 @@ case class CsrMapping(){
|
||||||
def r [T <: Data](csrAddress : Int, thats : (Int, Data)*) : Unit = for(that <- thats) r(csrAddress,that._1, that._2)
|
def r [T <: Data](csrAddress : Int, thats : (Int, Data)*) : Unit = for(that <- thats) r(csrAddress,that._1, that._2)
|
||||||
def rw[T <: Data](csrAddress : Int, that : T): Unit = rw(csrAddress,0,that)
|
def rw[T <: Data](csrAddress : Int, that : T): Unit = rw(csrAddress,0,that)
|
||||||
def r [T <: Data](csrAddress : Int, that : T): Unit = r(csrAddress,0,that)
|
def r [T <: Data](csrAddress : Int, that : T): Unit = r(csrAddress,0,that)
|
||||||
def rx [T <: Data](csrAddress : Int, thats : (Int, Data)*)(writable : Boolean) : Unit =
|
|
||||||
if(writable)
|
|
||||||
for(that <- thats) rw(csrAddress,that._1, that._2)
|
|
||||||
else
|
|
||||||
for(that <- thats) r(csrAddress,that._1, that._2)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -135,6 +131,7 @@ class MachineCsr(config : MachineCsrConfig) extends Plugin[VexRiscv] with Except
|
||||||
pluginExceptionPort.valid := False
|
pluginExceptionPort.valid := False
|
||||||
pluginExceptionPort.payload.assignDontCare()
|
pluginExceptionPort.payload.assignDontCare()
|
||||||
}
|
}
|
||||||
|
|
||||||
def xlen = 32
|
def xlen = 32
|
||||||
override def build(pipeline: VexRiscv): Unit = {
|
override def build(pipeline: VexRiscv): Unit = {
|
||||||
import pipeline._
|
import pipeline._
|
||||||
|
@ -147,7 +144,7 @@ class MachineCsr(config : MachineCsrConfig) extends Plugin[VexRiscv] with Except
|
||||||
}
|
}
|
||||||
|
|
||||||
pipeline plug new Area{
|
pipeline plug new Area{
|
||||||
//Define CSR registers
|
//Define CSR mapping utilities
|
||||||
val csrMapping = new CsrMapping()
|
val csrMapping = new CsrMapping()
|
||||||
implicit class CsrAccessPimper(csrAccess : CsrAccess){
|
implicit class CsrAccessPimper(csrAccess : CsrAccess){
|
||||||
def apply(csrAddress : Int, thats : (Int, Data)*) : Unit = csrAccess match{
|
def apply(csrAddress : Int, thats : (Int, Data)*) : Unit = csrAccess match{
|
||||||
|
@ -160,6 +157,8 @@ class MachineCsr(config : MachineCsrConfig) extends Plugin[VexRiscv] with Except
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Define CSR registers
|
//Define CSR registers
|
||||||
val mtvec = RegInit(U(mtvecInit,xlen bits))
|
val mtvec = RegInit(U(mtvecInit,xlen bits))
|
||||||
val mepc = Reg(UInt(xlen bits))
|
val mepc = Reg(UInt(xlen bits))
|
||||||
|
@ -178,6 +177,10 @@ class MachineCsr(config : MachineCsrConfig) extends Plugin[VexRiscv] with Except
|
||||||
val exceptionCode = Reg(UInt(exceptionCodeWidth bits))
|
val exceptionCode = Reg(UInt(exceptionCodeWidth bits))
|
||||||
}
|
}
|
||||||
val mbadaddr = Reg(UInt(xlen bits))
|
val mbadaddr = Reg(UInt(xlen bits))
|
||||||
|
val mcycle = Reg(UInt(64 bits)) randBoot()
|
||||||
|
val minstret = Reg(UInt(64 bits)) randBoot()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Define CSR registers accessibility
|
//Define CSR registers accessibility
|
||||||
if(mvendorid != null) READ_ONLY(CSR.MVENDORID, U(mvendorid))
|
if(mvendorid != null) READ_ONLY(CSR.MVENDORID, U(mvendorid))
|
||||||
|
@ -195,6 +198,18 @@ class MachineCsr(config : MachineCsrConfig) extends Plugin[VexRiscv] with Except
|
||||||
if(mscratchGen) READ_WRITE(CSR.MSCRATCH, mscratch)
|
if(mscratchGen) READ_WRITE(CSR.MSCRATCH, mscratch)
|
||||||
mcauseAccess(CSR.MCAUSE, xlen-1 -> mcause.interrupt, 0 -> mcause.exceptionCode)
|
mcauseAccess(CSR.MCAUSE, xlen-1 -> mcause.interrupt, 0 -> mcause.exceptionCode)
|
||||||
mbadaddrAccess(CSR.MBADADDR, mbadaddr)
|
mbadaddrAccess(CSR.MBADADDR, mbadaddr)
|
||||||
|
mcycleAccess(CSR.MCYCLE, mcycle(31 downto 0))
|
||||||
|
mcycleAccess(CSR.MCYCLEH, mcycle(63 downto 32))
|
||||||
|
minstretAccess(CSR.MINSTRET, minstret(31 downto 0))
|
||||||
|
minstretAccess(CSR.MINSTRETH, minstret(63 downto 32))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Manage counters
|
||||||
|
mcycle := mcycle + 1
|
||||||
|
when(writeBack.arbitration.isFiring) {
|
||||||
|
minstret := minstret + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -100,5 +100,15 @@ object Riscv{
|
||||||
def MCAUSE = 0x342 // MRW Machine trap cause.
|
def MCAUSE = 0x342 // MRW Machine trap cause.
|
||||||
def MBADADDR = 0x343 // MRW Machine bad address.
|
def MBADADDR = 0x343 // MRW Machine bad address.
|
||||||
def MIP = 0x344 // MRW Machine interrupt pending.
|
def MIP = 0x344 // MRW Machine interrupt pending.
|
||||||
|
def MBASE = 0x380 // MRW Base register.
|
||||||
|
def MBOUND = 0x381 // MRW Bound register.
|
||||||
|
def MIBASE = 0x382 // MRW Instruction base register.
|
||||||
|
def MIBOUND = 0x383 // MRW Instruction bound register.
|
||||||
|
def MDBASE = 0x384 // MRW Data base register.
|
||||||
|
def MDBOUND = 0x385 // MRW Data bound register.
|
||||||
|
def MCYCLE = 0xB00 // MRW Machine cycle counter.
|
||||||
|
def MINSTRET = 0xB02 // MRW Machine instructions-retired counter.
|
||||||
|
def MCYCLEH = 0xB80 // MRW Upper 32 bits of mcycle, RV32I only.
|
||||||
|
def MINSTRETH = 0xB82 // MRW Upper 32 bits of minstret, RV32I only.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,9 @@ object TopLevel {
|
||||||
mepcAccess = READ_WRITE,
|
mepcAccess = READ_WRITE,
|
||||||
mscratchGen = true,
|
mscratchGen = true,
|
||||||
mcauseAccess = READ_WRITE,
|
mcauseAccess = READ_WRITE,
|
||||||
mbadaddrAccess = READ_WRITE
|
mbadaddrAccess = READ_WRITE,
|
||||||
|
mcycleAccess = READ_WRITE,
|
||||||
|
minstretAccess = READ_WRITE
|
||||||
)
|
)
|
||||||
|
|
||||||
config.plugins ++= List(
|
config.plugins ++= List(
|
||||||
|
|
Loading…
Reference in New Issue