cleanup mmu interface
This commit is contained in:
parent
6323caf265
commit
fc0f3a2020
|
@ -68,24 +68,24 @@ case class MemoryTranslatorCmd() extends Bundle{
|
||||||
val virtualAddress = UInt(32 bits)
|
val virtualAddress = UInt(32 bits)
|
||||||
val bypassTranslation = Bool
|
val bypassTranslation = Bool
|
||||||
}
|
}
|
||||||
case class MemoryTranslatorRsp(wayCount : Int) extends Bundle{
|
case class MemoryTranslatorRsp(p : MemoryTranslatorBusParameter) extends Bundle{
|
||||||
val physicalAddress = UInt(32 bits)
|
val physicalAddress = UInt(32 bits)
|
||||||
val isIoAccess = Bool
|
val isIoAccess = Bool
|
||||||
val allowRead, allowWrite, allowExecute = Bool
|
val allowRead, allowWrite, allowExecute = Bool
|
||||||
val exception = Bool
|
val exception = Bool
|
||||||
val refilling = Bool
|
val refilling = Bool
|
||||||
val bypassTranslation = Bool
|
val bypassTranslation = Bool
|
||||||
val ways = Vec(MemoryTranslatorRspWay(), wayCount)
|
val ways = Vec(MemoryTranslatorRspWay(), p.wayCount)
|
||||||
}
|
}
|
||||||
case class MemoryTranslatorRspWay() extends Bundle{
|
case class MemoryTranslatorRspWay() extends Bundle{
|
||||||
val sel = Bool()
|
val sel = Bool()
|
||||||
val physical = UInt(32 bits)
|
val physical = UInt(32 bits)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case class MemoryTranslatorBusParameter(wayCount : Int)
|
||||||
case class MemoryTranslatorBus(wayCount : Int) extends Bundle with IMasterSlave{
|
case class MemoryTranslatorBus(p : MemoryTranslatorBusParameter) extends Bundle with IMasterSlave{
|
||||||
val cmd = MemoryTranslatorCmd()
|
val cmd = MemoryTranslatorCmd()
|
||||||
val rsp = MemoryTranslatorRsp(wayCount)
|
val rsp = MemoryTranslatorRsp(p)
|
||||||
val end = Bool
|
val end = Bool
|
||||||
val busy = Bool
|
val busy = Bool
|
||||||
|
|
||||||
|
|
|
@ -125,13 +125,13 @@ case class DataCacheCpuExecuteArgs(p : DataCacheConfig) extends Bundle{
|
||||||
val totalyConsistent = Bool() //Only for AMO/LRSC
|
val totalyConsistent = Bool() //Only for AMO/LRSC
|
||||||
}
|
}
|
||||||
|
|
||||||
case class DataCacheCpuMemory(p : DataCacheConfig, tlbWayCount : Int) extends Bundle with IMasterSlave{
|
case class DataCacheCpuMemory(p : DataCacheConfig, mmu : MemoryTranslatorBusParameter) extends Bundle with IMasterSlave{
|
||||||
val isValid = Bool
|
val isValid = Bool
|
||||||
val isStuck = Bool
|
val isStuck = Bool
|
||||||
val isRemoved = Bool
|
val isRemoved = Bool
|
||||||
val isWrite = Bool
|
val isWrite = Bool
|
||||||
val address = UInt(p.addressWidth bit)
|
val address = UInt(p.addressWidth bit)
|
||||||
val mmuBus = MemoryTranslatorBus(tlbWayCount)
|
val mmuBus = MemoryTranslatorBus(mmu)
|
||||||
|
|
||||||
override def asMaster(): Unit = {
|
override def asMaster(): Unit = {
|
||||||
out(isValid, isStuck, isRemoved, address)
|
out(isValid, isStuck, isRemoved, address)
|
||||||
|
@ -175,9 +175,9 @@ case class DataCacheCpuWriteBack(p : DataCacheConfig) extends Bundle with IMaste
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case class DataCacheCpuBus(p : DataCacheConfig, tlbWayCount : Int) extends Bundle with IMasterSlave{
|
case class DataCacheCpuBus(p : DataCacheConfig, mmu : MemoryTranslatorBusParameter) extends Bundle with IMasterSlave{
|
||||||
val execute = DataCacheCpuExecute(p)
|
val execute = DataCacheCpuExecute(p)
|
||||||
val memory = DataCacheCpuMemory(p, tlbWayCount)
|
val memory = DataCacheCpuMemory(p, mmu)
|
||||||
val writeBack = DataCacheCpuWriteBack(p)
|
val writeBack = DataCacheCpuWriteBack(p)
|
||||||
|
|
||||||
val redo = Bool()
|
val redo = Bool()
|
||||||
|
@ -423,11 +423,11 @@ object DataCacheExternalAmoStates extends SpinalEnum{
|
||||||
}
|
}
|
||||||
|
|
||||||
//If external amo, mem rsp should stay
|
//If external amo, mem rsp should stay
|
||||||
class DataCache(val p : DataCacheConfig, tlbWayCount : Int) extends Component{
|
class DataCache(val p : DataCacheConfig, mmuParameter : MemoryTranslatorBusParameter) extends Component{
|
||||||
import p._
|
import p._
|
||||||
|
|
||||||
val io = new Bundle{
|
val io = new Bundle{
|
||||||
val cpu = slave(DataCacheCpuBus(p, tlbWayCount))
|
val cpu = slave(DataCacheCpuBus(p, mmuParameter))
|
||||||
val mem = master(DataCacheMemBus(p))
|
val mem = master(DataCacheMemBus(p))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,7 +104,7 @@ trait InstructionCacheCommons{
|
||||||
val cacheMiss, error, mmuRefilling, mmuException, isUser : Bool
|
val cacheMiss, error, mmuRefilling, mmuException, isUser : Bool
|
||||||
}
|
}
|
||||||
|
|
||||||
case class InstructionCacheCpuFetch(p : InstructionCacheConfig, tlbWayCount : Int) extends Bundle with IMasterSlave with InstructionCacheCommons {
|
case class InstructionCacheCpuFetch(p : InstructionCacheConfig, mmuParameter : MemoryTranslatorBusParameter) extends Bundle with IMasterSlave with InstructionCacheCommons {
|
||||||
val isValid = Bool()
|
val isValid = Bool()
|
||||||
val isStuck = Bool()
|
val isStuck = Bool()
|
||||||
val isRemoved = Bool()
|
val isRemoved = Bool()
|
||||||
|
@ -112,7 +112,7 @@ case class InstructionCacheCpuFetch(p : InstructionCacheConfig, tlbWayCount : In
|
||||||
val data = Bits(p.cpuDataWidth bits)
|
val data = Bits(p.cpuDataWidth bits)
|
||||||
val dataBypassValid = p.bypassGen generate Bool()
|
val dataBypassValid = p.bypassGen generate Bool()
|
||||||
val dataBypass = p.bypassGen generate Bits(p.cpuDataWidth bits)
|
val dataBypass = p.bypassGen generate Bits(p.cpuDataWidth bits)
|
||||||
val mmuBus = MemoryTranslatorBus(tlbWayCount)
|
val mmuBus = MemoryTranslatorBus(mmuParameter)
|
||||||
val physicalAddress = UInt(p.addressWidth bits)
|
val physicalAddress = UInt(p.addressWidth bits)
|
||||||
val cacheMiss, error, mmuRefilling, mmuException, isUser = ifGen(!p.twoCycleCache)(Bool)
|
val cacheMiss, error, mmuRefilling, mmuException, isUser = ifGen(!p.twoCycleCache)(Bool)
|
||||||
val haltIt = Bool() //Used to wait on the MMU rsp busy
|
val haltIt = Bool() //Used to wait on the MMU rsp busy
|
||||||
|
@ -141,9 +141,9 @@ case class InstructionCacheCpuDecode(p : InstructionCacheConfig) extends Bundle
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case class InstructionCacheCpuBus(p : InstructionCacheConfig, tlbWayCount : Int) extends Bundle with IMasterSlave{
|
case class InstructionCacheCpuBus(p : InstructionCacheConfig, mmuParameter : MemoryTranslatorBusParameter) extends Bundle with IMasterSlave{
|
||||||
val prefetch = InstructionCacheCpuPrefetch(p)
|
val prefetch = InstructionCacheCpuPrefetch(p)
|
||||||
val fetch = InstructionCacheCpuFetch(p, tlbWayCount)
|
val fetch = InstructionCacheCpuFetch(p, mmuParameter)
|
||||||
val decode = InstructionCacheCpuDecode(p)
|
val decode = InstructionCacheCpuDecode(p)
|
||||||
val fill = Flow(UInt(p.addressWidth bits))
|
val fill = Flow(UInt(p.addressWidth bits))
|
||||||
|
|
||||||
|
@ -277,11 +277,11 @@ case class InstructionCacheFlushBus() extends Bundle with IMasterSlave{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class InstructionCache(p : InstructionCacheConfig, tlbWayCount : Int) extends Component{
|
class InstructionCache(p : InstructionCacheConfig, mmuParameter : MemoryTranslatorBusParameter) extends Component{
|
||||||
import p._
|
import p._
|
||||||
val io = new Bundle{
|
val io = new Bundle{
|
||||||
val flush = in Bool()
|
val flush = in Bool()
|
||||||
val cpu = slave(InstructionCacheCpuBus(p, tlbWayCount))
|
val cpu = slave(InstructionCacheCpuBus(p, mmuParameter))
|
||||||
val mem = master(InstructionCacheMemBus(p))
|
val mem = master(InstructionCacheMemBus(p))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -175,7 +175,7 @@ class DBusCachedPlugin(val config : DataCacheConfig,
|
||||||
this.config.copy(
|
this.config.copy(
|
||||||
mergeExecuteMemory = writeBack == null
|
mergeExecuteMemory = writeBack == null
|
||||||
),
|
),
|
||||||
tlbWayCount = mmuBus.rsp.wayCount
|
mmuParameter = mmuBus.p
|
||||||
)
|
)
|
||||||
|
|
||||||
//Interconnect the plugin dBus with the cache dBus with some optional pipelining
|
//Interconnect the plugin dBus with the cache dBus with some optional pipelining
|
||||||
|
|
|
@ -392,7 +392,7 @@ class DBusSimplePlugin(catchAddressMisaligned : Boolean = false,
|
||||||
import pipeline._
|
import pipeline._
|
||||||
import pipeline.config._
|
import pipeline.config._
|
||||||
|
|
||||||
object MMU_RSP extends Stageable(MemoryTranslatorRsp(mmuBus.rsp.wayCount))
|
object MMU_RSP extends Stageable(MemoryTranslatorRsp(mmuBus.p))
|
||||||
|
|
||||||
dBus = master(DBusSimpleBus()).setName("dBus")
|
dBus = master(DBusSimpleBus()).setName("dBus")
|
||||||
|
|
||||||
|
|
|
@ -124,7 +124,7 @@ class IBusCachedPlugin(resetVector : BigInt = 0x80000000l,
|
||||||
import pipeline.config._
|
import pipeline.config._
|
||||||
|
|
||||||
pipeline plug new FetchArea(pipeline) {
|
pipeline plug new FetchArea(pipeline) {
|
||||||
val cache = new InstructionCache(IBusCachedPlugin.this.config.copy(bypassGen = tightlyGen), mmuBus.rsp.wayCount)
|
val cache = new InstructionCache(IBusCachedPlugin.this.config.copy(bypassGen = tightlyGen), mmuBus.p)
|
||||||
iBus = master(new InstructionCacheMemBus(IBusCachedPlugin.this.config)).setName("iBus")
|
iBus = master(new InstructionCacheMemBus(IBusCachedPlugin.this.config)).setName("iBus")
|
||||||
iBus <> cache.io.mem
|
iBus <> cache.io.mem
|
||||||
iBus.cmd.address.allowOverride := cache.io.mem.cmd.address
|
iBus.cmd.address.allowOverride := cache.io.mem.cmd.address
|
||||||
|
|
|
@ -23,7 +23,7 @@ class MemoryTranslatorPlugin(tlbSize : Int,
|
||||||
|
|
||||||
override def newTranslationPort(priority : Int,args : Any): MemoryTranslatorBus = {
|
override def newTranslationPort(priority : Int,args : Any): MemoryTranslatorBus = {
|
||||||
val config = args.asInstanceOf[MemoryTranslatorPortConfig]
|
val config = args.asInstanceOf[MemoryTranslatorPortConfig]
|
||||||
val port = MemoryTranslatorPort(MemoryTranslatorBus(0),priority, config/*,exceptionBus*/)
|
val port = MemoryTranslatorPort(MemoryTranslatorBus(MemoryTranslatorBusParameter(wayCount = 0)),priority, config/*,exceptionBus*/)
|
||||||
portsInfo += port
|
portsInfo += port
|
||||||
port.bus
|
port.bus
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ class MmuPlugin(ioRange : UInt => Bool,
|
||||||
|
|
||||||
override def newTranslationPort(priority : Int,args : Any): MemoryTranslatorBus = {
|
override def newTranslationPort(priority : Int,args : Any): MemoryTranslatorBus = {
|
||||||
val config = args.asInstanceOf[MmuPortConfig]
|
val config = args.asInstanceOf[MmuPortConfig]
|
||||||
val port = MmuPort(MemoryTranslatorBus(config.portTlbSize),priority, config, portsInfo.length)
|
val port = MmuPort(MemoryTranslatorBus(MemoryTranslatorBusParameter(wayCount = config.portTlbSize)),priority, config, portsInfo.length)
|
||||||
portsInfo += port
|
portsInfo += port
|
||||||
port.bus
|
port.bus
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ class StaticMemoryTranslatorPlugin(ioRange : UInt => Bool) extends Plugin[VexRis
|
||||||
val portsInfo = ArrayBuffer[StaticMemoryTranslatorPort]()
|
val portsInfo = ArrayBuffer[StaticMemoryTranslatorPort]()
|
||||||
|
|
||||||
override def newTranslationPort(priority : Int,args : Any): MemoryTranslatorBus = {
|
override def newTranslationPort(priority : Int,args : Any): MemoryTranslatorBus = {
|
||||||
val port = StaticMemoryTranslatorPort(MemoryTranslatorBus(0),priority)
|
val port = StaticMemoryTranslatorPort(MemoryTranslatorBus(MemoryTranslatorBusParameter(wayCount = 0)),priority)
|
||||||
portsInfo += port
|
portsInfo += port
|
||||||
port.bus
|
port.bus
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue