Merge pull request #1023 from freechipsproject/csr-cleanup
Generalize CSR file to support simpler cores
This commit is contained in:
commit
5a84564203
@ -63,7 +63,7 @@ class DCSR extends Bundle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class MIP(implicit p: Parameters) extends CoreBundle()(p)
|
class MIP(implicit p: Parameters) extends CoreBundle()(p)
|
||||||
with HasRocketCoreParameters {
|
with HasCoreParameters {
|
||||||
val lip = Vec(coreParams.nLocalInterrupts, Bool())
|
val lip = Vec(coreParams.nLocalInterrupts, Bool())
|
||||||
val zero2 = Bool()
|
val zero2 = Bool()
|
||||||
val debug = Bool() // keep in sync with CSR.debugIntCause
|
val debug = Bool() // keep in sync with CSR.debugIntCause
|
||||||
@ -144,7 +144,7 @@ object CSR
|
|||||||
}
|
}
|
||||||
|
|
||||||
class PerfCounterIO(implicit p: Parameters) extends CoreBundle
|
class PerfCounterIO(implicit p: Parameters) extends CoreBundle
|
||||||
with HasRocketCoreParameters {
|
with HasCoreParameters {
|
||||||
val eventSel = UInt(OUTPUT, xLen)
|
val eventSel = UInt(OUTPUT, xLen)
|
||||||
val inc = UInt(INPUT, log2Ceil(1+retireWidth))
|
val inc = UInt(INPUT, log2Ceil(1+retireWidth))
|
||||||
}
|
}
|
||||||
@ -161,7 +161,7 @@ class TracedInstruction(implicit p: Parameters) extends CoreBundle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class CSRFileIO(implicit p: Parameters) extends CoreBundle
|
class CSRFileIO(implicit p: Parameters) extends CoreBundle
|
||||||
with HasRocketCoreParameters {
|
with HasCoreParameters {
|
||||||
val interrupts = new TileInterrupts().asInput
|
val interrupts = new TileInterrupts().asInput
|
||||||
val hartid = UInt(INPUT, hartIdLen)
|
val hartid = UInt(INPUT, hartIdLen)
|
||||||
val rw = new Bundle {
|
val rw = new Bundle {
|
||||||
@ -190,7 +190,6 @@ class CSRFileIO(implicit p: Parameters) extends CoreBundle
|
|||||||
val evec = UInt(OUTPUT, vaddrBitsExtended)
|
val evec = UInt(OUTPUT, vaddrBitsExtended)
|
||||||
val exception = Bool(INPUT)
|
val exception = Bool(INPUT)
|
||||||
val retire = UInt(INPUT, log2Up(1+retireWidth))
|
val retire = UInt(INPUT, log2Up(1+retireWidth))
|
||||||
val custom_mrw_csrs = Vec(nCustomMrwCsrs, UInt(INPUT, xLen))
|
|
||||||
val cause = UInt(INPUT, xLen)
|
val cause = UInt(INPUT, xLen)
|
||||||
val pc = UInt(INPUT, vaddrBitsExtended)
|
val pc = UInt(INPUT, vaddrBitsExtended)
|
||||||
val badaddr = UInt(INPUT, vaddrBitsExtended)
|
val badaddr = UInt(INPUT, vaddrBitsExtended)
|
||||||
@ -208,7 +207,7 @@ class CSRFileIO(implicit p: Parameters) extends CoreBundle
|
|||||||
}
|
}
|
||||||
|
|
||||||
class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Parameters) extends CoreModule()(p)
|
class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Parameters) extends CoreModule()(p)
|
||||||
with HasRocketCoreParameters {
|
with HasCoreParameters {
|
||||||
val io = new CSRFileIO
|
val io = new CSRFileIO
|
||||||
|
|
||||||
val reset_mstatus = Wire(init=new MStatus().fromBits(0))
|
val reset_mstatus = Wire(init=new MStatus().fromBits(0))
|
||||||
@ -223,7 +222,6 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
|||||||
reset_dcsr.xdebugver := 1
|
reset_dcsr.xdebugver := 1
|
||||||
reset_dcsr.prv := PRV.M
|
reset_dcsr.prv := PRV.M
|
||||||
val reg_dcsr = Reg(init=reset_dcsr)
|
val reg_dcsr = Reg(init=reset_dcsr)
|
||||||
val reg_debugint = Reg(Bool())
|
|
||||||
|
|
||||||
val (supported_interrupts, delegable_interrupts) = {
|
val (supported_interrupts, delegable_interrupts) = {
|
||||||
val sup = Wire(new MIP)
|
val sup = Wire(new MIP)
|
||||||
@ -305,13 +303,17 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
|||||||
val hpm_mask = reg_mcounteren & Mux((!usingVM).B || reg_mstatus.prv === PRV.S, delegable_counters.U, reg_scounteren)
|
val hpm_mask = reg_mcounteren & Mux((!usingVM).B || reg_mstatus.prv === PRV.S, delegable_counters.U, reg_scounteren)
|
||||||
|
|
||||||
val mip = Wire(init=reg_mip)
|
val mip = Wire(init=reg_mip)
|
||||||
|
mip.lip := (io.interrupts.lip: Seq[Bool])
|
||||||
|
mip.mtip := io.interrupts.mtip
|
||||||
|
mip.msip := io.interrupts.msip
|
||||||
|
mip.meip := io.interrupts.meip
|
||||||
// seip is the OR of reg_mip.seip and the actual line from the PLIC
|
// seip is the OR of reg_mip.seip and the actual line from the PLIC
|
||||||
io.interrupts.seip.foreach { mip.seip := reg_mip.seip || RegNext(_) }
|
io.interrupts.seip.foreach { mip.seip := reg_mip.seip || RegNext(_) }
|
||||||
mip.rocc := io.rocc_interrupt
|
mip.rocc := io.rocc_interrupt
|
||||||
val read_mip = mip.asUInt & supported_interrupts
|
val read_mip = mip.asUInt & supported_interrupts
|
||||||
|
|
||||||
val pending_interrupts = read_mip & reg_mie
|
val pending_interrupts = read_mip & reg_mie
|
||||||
val d_interrupts = reg_debugint << CSR.debugIntCause
|
val d_interrupts = io.interrupts.debug << CSR.debugIntCause
|
||||||
val m_interrupts = Mux(reg_mstatus.prv <= PRV.S || (reg_mstatus.prv === PRV.M && reg_mstatus.mie), pending_interrupts & ~reg_mideleg, UInt(0))
|
val m_interrupts = Mux(reg_mstatus.prv <= PRV.S || (reg_mstatus.prv === PRV.M && reg_mstatus.mie), pending_interrupts & ~reg_mideleg, UInt(0))
|
||||||
val s_interrupts = Mux(reg_mstatus.prv < PRV.S || (reg_mstatus.prv === PRV.S && reg_mstatus.sie), pending_interrupts & reg_mideleg, UInt(0))
|
val s_interrupts = Mux(reg_mstatus.prv < PRV.S || (reg_mstatus.prv === PRV.S && reg_mstatus.sie), pending_interrupts & reg_mideleg, UInt(0))
|
||||||
val (anyInterrupt, whichInterrupt) = chooseInterrupt(Seq(s_interrupts, m_interrupts, d_interrupts))
|
val (anyInterrupt, whichInterrupt) = chooseInterrupt(Seq(s_interrupts, m_interrupts, d_interrupts))
|
||||||
@ -343,8 +345,6 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
|||||||
CSRs.mimpid -> UInt(0),
|
CSRs.mimpid -> UInt(0),
|
||||||
CSRs.marchid -> UInt(0),
|
CSRs.marchid -> UInt(0),
|
||||||
CSRs.mvendorid -> UInt(0),
|
CSRs.mvendorid -> UInt(0),
|
||||||
CSRs.mcycle -> reg_cycle,
|
|
||||||
CSRs.minstret -> reg_instret,
|
|
||||||
CSRs.misa -> reg_misa,
|
CSRs.misa -> reg_misa,
|
||||||
CSRs.mstatus -> read_mstatus,
|
CSRs.mstatus -> read_mstatus,
|
||||||
CSRs.mtvec -> reg_mtvec,
|
CSRs.mtvec -> reg_mtvec,
|
||||||
@ -372,14 +372,34 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
|||||||
if (usingFPU)
|
if (usingFPU)
|
||||||
read_mapping ++= fp_csrs
|
read_mapping ++= fp_csrs
|
||||||
|
|
||||||
for (((e, c), i) <- (reg_hpmevent.padTo(CSR.nHPM, UInt(0))
|
if (coreParams.haveBasicCounters) {
|
||||||
zip reg_hpmcounter.map(x => x: UInt).padTo(CSR.nHPM, UInt(0))) zipWithIndex) {
|
read_mapping += CSRs.mcycle -> reg_cycle
|
||||||
read_mapping += (i + CSR.firstHPE) -> e // mhpmeventN
|
read_mapping += CSRs.minstret -> reg_instret
|
||||||
read_mapping += (i + CSR.firstMHPC) -> c // mhpmcounterN
|
|
||||||
if (usingUser) read_mapping += (i + CSR.firstHPC) -> c // hpmcounterN
|
for (((e, c), i) <- (reg_hpmevent.padTo(CSR.nHPM, UInt(0))
|
||||||
|
zip reg_hpmcounter.map(x => x: UInt).padTo(CSR.nHPM, UInt(0))) zipWithIndex) {
|
||||||
|
read_mapping += (i + CSR.firstHPE) -> e // mhpmeventN
|
||||||
|
read_mapping += (i + CSR.firstMHPC) -> c // mhpmcounterN
|
||||||
|
if (usingUser) read_mapping += (i + CSR.firstHPC) -> c // hpmcounterN
|
||||||
|
if (xLen == 32) {
|
||||||
|
read_mapping += (i + CSR.firstMHPCH) -> c // mhpmcounterNh
|
||||||
|
if (usingUser) read_mapping += (i + CSR.firstHPCH) -> c // hpmcounterNh
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (usingUser) {
|
||||||
|
read_mapping += CSRs.mcounteren -> reg_mcounteren
|
||||||
|
read_mapping += CSRs.cycle -> reg_cycle
|
||||||
|
read_mapping += CSRs.instret -> reg_instret
|
||||||
|
}
|
||||||
|
|
||||||
if (xLen == 32) {
|
if (xLen == 32) {
|
||||||
read_mapping += (i + CSR.firstMHPCH) -> c // mhpmcounterNh
|
read_mapping += CSRs.mcycleh -> (reg_cycle >> 32)
|
||||||
if (usingUser) read_mapping += (i + CSR.firstHPCH) -> c // hpmcounterNh
|
read_mapping += CSRs.minstreth -> (reg_instret >> 32)
|
||||||
|
if (usingUser) {
|
||||||
|
read_mapping += CSRs.cycleh -> (reg_cycle >> 32)
|
||||||
|
read_mapping += CSRs.instreth -> (reg_instret >> 32)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -412,21 +432,6 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
|||||||
read_mapping += CSRs.medeleg -> reg_medeleg
|
read_mapping += CSRs.medeleg -> reg_medeleg
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usingUser) {
|
|
||||||
read_mapping += CSRs.mcounteren -> reg_mcounteren
|
|
||||||
read_mapping += CSRs.cycle -> reg_cycle
|
|
||||||
read_mapping += CSRs.instret -> reg_instret
|
|
||||||
}
|
|
||||||
|
|
||||||
if (xLen == 32) {
|
|
||||||
read_mapping += CSRs.mcycleh -> (reg_cycle >> 32)
|
|
||||||
read_mapping += CSRs.minstreth -> (reg_instret >> 32)
|
|
||||||
if (usingUser) {
|
|
||||||
read_mapping += CSRs.cycleh -> (reg_cycle >> 32)
|
|
||||||
read_mapping += CSRs.instreth -> (reg_instret >> 32)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val pmpCfgPerCSR = xLen / new PMPConfig().getWidth
|
val pmpCfgPerCSR = xLen / new PMPConfig().getWidth
|
||||||
def pmpCfgIndex(i: Int) = (xLen / 32) * (i / pmpCfgPerCSR)
|
def pmpCfgIndex(i: Int) = (xLen / 32) * (i / pmpCfgPerCSR)
|
||||||
if (reg_pmp.nonEmpty) {
|
if (reg_pmp.nonEmpty) {
|
||||||
@ -438,13 +443,6 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
|||||||
read_mapping += (CSRs.pmpaddr0 + i) -> pmp.addr
|
read_mapping += (CSRs.pmpaddr0 + i) -> pmp.addr
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i <- 0 until nCustomMrwCsrs) {
|
|
||||||
val addr = 0xff0 + i
|
|
||||||
require(addr < (1 << CSR.ADDRSZ))
|
|
||||||
require(!read_mapping.contains(addr), "custom MRW CSR address " + i + " is already in use")
|
|
||||||
read_mapping += addr -> io.custom_mrw_csrs(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
val decoded_addr = read_mapping map { case (k, v) => k -> (io.rw.addr === k) }
|
val decoded_addr = read_mapping map { case (k, v) => k -> (io.rw.addr === k) }
|
||||||
val wdata = readModifyWriteCSR(io.rw.cmd, io.rw.rdata, io.rw.wdata)
|
val wdata = readModifyWriteCSR(io.rw.cmd, io.rw.rdata, io.rw.wdata)
|
||||||
|
|
||||||
@ -511,7 +509,7 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
|||||||
assert(PopCount(insn_ret :: insn_call :: insn_break :: io.exception :: Nil) <= 1, "these conditions must be mutually exclusive")
|
assert(PopCount(insn_ret :: insn_call :: insn_break :: io.exception :: Nil) <= 1, "these conditions must be mutually exclusive")
|
||||||
|
|
||||||
when (insn_wfi && !io.singleStep && !reg_debug) { reg_wfi := true }
|
when (insn_wfi && !io.singleStep && !reg_debug) { reg_wfi := true }
|
||||||
when (pending_interrupts.orR || exception || reg_debugint) { reg_wfi := false }
|
when (pending_interrupts.orR || exception || io.interrupts.debug) { reg_wfi := false }
|
||||||
assert(!reg_wfi || io.retire === UInt(0))
|
assert(!reg_wfi || io.retire === UInt(0))
|
||||||
|
|
||||||
when (io.retire(0) || exception) { reg_singleStepped := true }
|
when (io.retire(0) || exception) { reg_singleStepped := true }
|
||||||
@ -611,7 +609,8 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
|||||||
when (decoded_addr(CSRs.misa)) {
|
when (decoded_addr(CSRs.misa)) {
|
||||||
val mask = UInt(isaStringToMask(isaMaskString), xLen)
|
val mask = UInt(isaStringToMask(isaMaskString), xLen)
|
||||||
val f = wdata('f' - 'a')
|
val f = wdata('f' - 'a')
|
||||||
reg_misa := ~(~wdata | (!f << ('d' - 'a'))) & mask | reg_misa & ~mask
|
if (coreParams.misaWritable)
|
||||||
|
reg_misa := ~(~wdata | (!f << ('d' - 'a'))) & mask | reg_misa & ~mask
|
||||||
}
|
}
|
||||||
when (decoded_addr(CSRs.mip)) {
|
when (decoded_addr(CSRs.mip)) {
|
||||||
// MIP should be modified based on the value in reg_mip, not the value
|
// MIP should be modified based on the value in reg_mip, not the value
|
||||||
@ -637,8 +636,10 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
|||||||
writeCounter(i + CSR.firstMHPC, c, wdata)
|
writeCounter(i + CSR.firstMHPC, c, wdata)
|
||||||
when (decoded_addr(i + CSR.firstHPE)) { e := perfEventSets.maskEventSelector(wdata) }
|
when (decoded_addr(i + CSR.firstHPE)) { e := perfEventSets.maskEventSelector(wdata) }
|
||||||
}
|
}
|
||||||
writeCounter(CSRs.mcycle, reg_cycle, wdata)
|
if (coreParams.haveBasicCounters) {
|
||||||
writeCounter(CSRs.minstret, reg_instret, wdata)
|
writeCounter(CSRs.mcycle, reg_cycle, wdata)
|
||||||
|
writeCounter(CSRs.minstret, reg_instret, wdata)
|
||||||
|
}
|
||||||
|
|
||||||
if (usingFPU) {
|
if (usingFPU) {
|
||||||
when (decoded_addr(CSRs.fflags)) { reg_fflags := wdata }
|
when (decoded_addr(CSRs.fflags)) { reg_fflags := wdata }
|
||||||
@ -721,12 +722,6 @@ class CSRFile(perfEventSets: EventSets = new EventSets(Seq()))(implicit p: Param
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reg_mip.lip := (io.interrupts.lip: Seq[Bool])
|
|
||||||
reg_mip.mtip := io.interrupts.mtip
|
|
||||||
reg_mip.msip := io.interrupts.msip
|
|
||||||
reg_mip.meip := io.interrupts.meip
|
|
||||||
reg_debugint := io.interrupts.debug
|
|
||||||
|
|
||||||
if (!usingVM) {
|
if (!usingVM) {
|
||||||
reg_mideleg := 0
|
reg_mideleg := 0
|
||||||
reg_medeleg := 0
|
reg_medeleg := 0
|
||||||
|
@ -75,7 +75,6 @@ class FrontendModule(outer: Frontend) extends LazyModuleImp(outer)
|
|||||||
val icache = outer.icache.module
|
val icache = outer.icache.module
|
||||||
require(fetchWidth*coreInstBytes == outer.icacheParams.fetchBytes)
|
require(fetchWidth*coreInstBytes == outer.icacheParams.fetchBytes)
|
||||||
|
|
||||||
val fetchBytes = coreInstBytes * fetchWidth
|
|
||||||
val tlb = Module(new TLB(true, log2Ceil(fetchBytes), nTLBEntries))
|
val tlb = Module(new TLB(true, log2Ceil(fetchBytes), nTLBEntries))
|
||||||
val fq = withReset(reset || io.cpu.req.valid) { Module(new ShiftQueue(new FrontendResp, 5, flow = true)) }
|
val fq = withReset(reset || io.cpu.req.valid) { Module(new ShiftQueue(new FrontendResp, 5, flow = true)) }
|
||||||
|
|
||||||
|
@ -127,7 +127,7 @@ class PMPHomogeneityChecker(pmps: Seq[PMP])(implicit p: Parameters) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class PMPChecker(lgMaxSize: Int)(implicit p: Parameters) extends CoreModule()(p)
|
class PMPChecker(lgMaxSize: Int)(implicit p: Parameters) extends CoreModule()(p)
|
||||||
with HasRocketCoreParameters {
|
with HasCoreParameters {
|
||||||
val io = new Bundle {
|
val io = new Bundle {
|
||||||
val prv = UInt(INPUT, PRV.SZ)
|
val prv = UInt(INPUT, PRV.SZ)
|
||||||
val pmp = Vec(nPMPs, new PMP).asInput
|
val pmp = Vec(nPMPs, new PMP).asInput
|
||||||
|
@ -24,7 +24,7 @@ class PTWResp(implicit p: Parameters) extends CoreBundle()(p) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class TLBPTWIO(implicit p: Parameters) extends CoreBundle()(p)
|
class TLBPTWIO(implicit p: Parameters) extends CoreBundle()(p)
|
||||||
with HasRocketCoreParameters {
|
with HasCoreParameters {
|
||||||
val req = Decoupled(new PTWReq)
|
val req = Decoupled(new PTWReq)
|
||||||
val resp = Valid(new PTWResp).flip
|
val resp = Valid(new PTWResp).flip
|
||||||
val ptbr = new PTBR().asInput
|
val ptbr = new PTBR().asInput
|
||||||
@ -37,7 +37,7 @@ class PTWPerfEvents extends Bundle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class DatapathPTWIO(implicit p: Parameters) extends CoreBundle()(p)
|
class DatapathPTWIO(implicit p: Parameters) extends CoreBundle()(p)
|
||||||
with HasRocketCoreParameters {
|
with HasCoreParameters {
|
||||||
val ptbr = new PTBR().asInput
|
val ptbr = new PTBR().asInput
|
||||||
val sfence = Valid(new SFenceReq).flip
|
val sfence = Valid(new SFenceReq).flip
|
||||||
val status = new MStatus().asInput
|
val status = new MStatus().asInput
|
||||||
|
@ -23,7 +23,8 @@ case class RocketCoreParams(
|
|||||||
nBreakpoints: Int = 1,
|
nBreakpoints: Int = 1,
|
||||||
nPMPs: Int = 8,
|
nPMPs: Int = 8,
|
||||||
nPerfCounters: Int = 0,
|
nPerfCounters: Int = 0,
|
||||||
nCustomMRWCSRs: Int = 0,
|
haveBasicCounters: Boolean = true,
|
||||||
|
misaWritable: Boolean = true,
|
||||||
nL2TLBEntries: Int = 0,
|
nL2TLBEntries: Int = 0,
|
||||||
mtvecInit: Option[BigInt] = Some(BigInt(0)),
|
mtvecInit: Option[BigInt] = Some(BigInt(0)),
|
||||||
mtvecWritable: Boolean = true,
|
mtvecWritable: Boolean = true,
|
||||||
@ -46,12 +47,6 @@ trait HasRocketCoreParameters extends HasCoreParameters {
|
|||||||
|
|
||||||
val fastLoadWord = rocketParams.fastLoadWord
|
val fastLoadWord = rocketParams.fastLoadWord
|
||||||
val fastLoadByte = rocketParams.fastLoadByte
|
val fastLoadByte = rocketParams.fastLoadByte
|
||||||
val nBreakpoints = rocketParams.nBreakpoints
|
|
||||||
val nPMPs = rocketParams.nPMPs
|
|
||||||
val nPerfCounters = rocketParams.nPerfCounters
|
|
||||||
val nCustomMrwCsrs = rocketParams.nCustomMRWCSRs
|
|
||||||
val mtvecInit = rocketParams.mtvecInit
|
|
||||||
val mtvecWritable = rocketParams.mtvecWritable
|
|
||||||
|
|
||||||
val mulDivParams = rocketParams.mulDiv.getOrElse(MulDivParams()) // TODO ask andrew about this
|
val mulDivParams = rocketParams.mulDiv.getOrElse(MulDivParams()) // TODO ask andrew about this
|
||||||
|
|
||||||
|
@ -25,7 +25,14 @@ trait CoreParams {
|
|||||||
val retireWidth: Int
|
val retireWidth: Int
|
||||||
val instBits: Int
|
val instBits: Int
|
||||||
val nLocalInterrupts: Int
|
val nLocalInterrupts: Int
|
||||||
|
val nPMPs: Int
|
||||||
|
val nBreakpoints: Int
|
||||||
|
val nPerfCounters: Int
|
||||||
|
val haveBasicCounters: Boolean
|
||||||
|
val misaWritable: Boolean
|
||||||
val nL2TLBEntries: Int
|
val nL2TLBEntries: Int
|
||||||
|
val mtvecInit: Option[BigInt]
|
||||||
|
val mtvecWritable: Boolean
|
||||||
val jumpInFrontend: Boolean
|
val jumpInFrontend: Boolean
|
||||||
val tileControlAddr: Option[BigInt]
|
val tileControlAddr: Option[BigInt]
|
||||||
|
|
||||||
@ -47,12 +54,19 @@ trait HasCoreParameters extends HasTileParameters {
|
|||||||
val fetchWidth = coreParams.fetchWidth
|
val fetchWidth = coreParams.fetchWidth
|
||||||
val decodeWidth = coreParams.decodeWidth
|
val decodeWidth = coreParams.decodeWidth
|
||||||
|
|
||||||
|
val fetchBytes = coreParams.fetchBytes
|
||||||
val coreInstBits = coreParams.instBits
|
val coreInstBits = coreParams.instBits
|
||||||
val coreInstBytes = coreInstBits/8
|
val coreInstBytes = coreInstBits/8
|
||||||
val coreDataBits = xLen max fLen
|
val coreDataBits = xLen max fLen
|
||||||
val coreDataBytes = coreDataBits/8
|
val coreDataBytes = coreDataBits/8
|
||||||
val coreMaxAddrBits = paddrBits max vaddrBitsExtended
|
val coreMaxAddrBits = paddrBits max vaddrBitsExtended
|
||||||
|
|
||||||
|
val nBreakpoints = coreParams.nBreakpoints
|
||||||
|
val nPMPs = coreParams.nPMPs
|
||||||
|
val nPerfCounters = coreParams.nPerfCounters
|
||||||
|
val mtvecInit = coreParams.mtvecInit
|
||||||
|
val mtvecWritable = coreParams.mtvecWritable
|
||||||
|
|
||||||
val coreDCacheReqTagBits = 6
|
val coreDCacheReqTagBits = 6
|
||||||
val dcacheReqTagBits = coreDCacheReqTagBits + log2Ceil(dcacheArbPorts)
|
val dcacheReqTagBits = coreDCacheReqTagBits + log2Ceil(dcacheArbPorts)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user