2017-02-09 22:59:09 +01:00
|
|
|
// 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
|
2017-03-24 22:49:12 +01:00
|
|
|
val nLocalInterrupts: Int
|
2017-02-09 22:59:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
2017-03-15 09:18:39 +01:00
|
|
|
val coreDataBits = xLen max fLen
|
2017-02-09 22:59:09 +01:00
|
|
|
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
|
2017-03-25 06:30:18 +01:00
|
|
|
val paddrBits = p(PAddrBits)
|
2017-02-09 22:59:09 +01:00
|
|
|
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
|
2017-02-27 23:27:19 +01:00
|
|
|
val maxPAddrBits = xLen match { case 32 => 34; case 64 => 56 }
|
2017-02-09 22:59:09 +01:00
|
|
|
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
|
|
|
|
}
|
|
|
|
}
|