89 lines
2.5 KiB
Scala
89 lines
2.5 KiB
Scala
|
// See LICENSE.SiFive for license details.
|
||
|
|
||
|
package tile
|
||
|
|
||
|
import Chisel._
|
||
|
import config._
|
||
|
import rocket._
|
||
|
import util._
|
||
|
|
||
|
case object BuildCore extends Field[Parameters => CoreModule with HasCoreIO]
|
||
|
case object XLen extends Field[Int]
|
||
|
|
||
|
// These parameters can be varied per-core
|
||
|
trait CoreParams {
|
||
|
val useVM: Boolean
|
||
|
val useUser: Boolean
|
||
|
val useDebug: Boolean
|
||
|
val useAtomics: Boolean
|
||
|
val useCompressed: Boolean
|
||
|
val mulDiv: Option[MulDivParams]
|
||
|
val fpu: Option[FPUParams]
|
||
|
val fetchWidth: Int
|
||
|
val decodeWidth: Int
|
||
|
val retireWidth: Int
|
||
|
val instBits: Int
|
||
|
}
|
||
|
|
||
|
trait HasCoreParameters extends HasTileParameters {
|
||
|
val coreParams: CoreParams = tileParams.core
|
||
|
|
||
|
val xLen = p(XLen)
|
||
|
val fLen = xLen // TODO relax this
|
||
|
require(xLen == 32 || xLen == 64)
|
||
|
|
||
|
val usingMulDiv = coreParams.mulDiv.nonEmpty
|
||
|
val usingFPU = coreParams.fpu.nonEmpty
|
||
|
val usingAtomics = coreParams.useAtomics
|
||
|
val usingCompressed = coreParams.useCompressed
|
||
|
|
||
|
val retireWidth = coreParams.retireWidth
|
||
|
val fetchWidth = coreParams.fetchWidth
|
||
|
val decodeWidth = coreParams.decodeWidth
|
||
|
|
||
|
val coreInstBits = coreParams.instBits
|
||
|
val coreInstBytes = coreInstBits/8
|
||
|
val coreDataBits = xLen
|
||
|
val coreDataBytes = coreDataBits/8
|
||
|
|
||
|
val coreDCacheReqTagBits = 6
|
||
|
val dcacheReqTagBits = coreDCacheReqTagBits + log2Ceil(dcacheArbPorts)
|
||
|
|
||
|
def pgIdxBits = 12
|
||
|
def pgLevelBits = 10 - log2Ceil(xLen / 32)
|
||
|
def vaddrBits = pgIdxBits + pgLevels * pgLevelBits
|
||
|
val paddrBits = 32//p(PAddrBits)
|
||
|
def ppnBits = paddrBits - pgIdxBits
|
||
|
def vpnBits = vaddrBits - pgIdxBits
|
||
|
val pgLevels = p(PgLevels)
|
||
|
val asIdBits = p(ASIdBits)
|
||
|
val vpnBitsExtended = vpnBits + (vaddrBits < xLen).toInt
|
||
|
val vaddrBitsExtended = vpnBitsExtended + pgIdxBits
|
||
|
val coreMaxAddrBits = paddrBits max vaddrBitsExtended
|
||
|
val maxPAddrBits = xLen match { case 32 => 34; case 64 => 50 }
|
||
|
require(paddrBits <= maxPAddrBits)
|
||
|
|
||
|
// Print out log of committed instructions and their writeback values.
|
||
|
// Requires post-processing due to out-of-order writebacks.
|
||
|
val enableCommitLog = false
|
||
|
}
|
||
|
|
||
|
abstract class CoreModule(implicit val p: Parameters) extends Module
|
||
|
with HasCoreParameters
|
||
|
|
||
|
abstract class CoreBundle(implicit val p: Parameters) extends ParameterizedBundle()(p)
|
||
|
with HasCoreParameters
|
||
|
|
||
|
trait HasCoreIO {
|
||
|
implicit val p: Parameters
|
||
|
val io = new Bundle {
|
||
|
val interrupts = new TileInterrupts().asInput
|
||
|
val hartid = UInt(INPUT, p(XLen))
|
||
|
val imem = new FrontendIO()(p)
|
||
|
val dmem = new HellaCacheIO()(p)
|
||
|
val ptw = new DatapathPTWIO().flip
|
||
|
val fpu = new FPUCoreIO().flip
|
||
|
val rocc = new RoCCCoreIO().flip
|
||
|
}
|
||
|
}
|