Got the MMU refilling itself with datacache cached memory access instead of io accesses
This commit is contained in:
parent
8be40e637b
commit
066f562c5e
|
@ -257,7 +257,7 @@ class DBusCachedPlugin(config : DataCacheConfig,
|
||||||
cache.io.cpu.execute.args.wr := dBusAccess.cmd.write
|
cache.io.cpu.execute.args.wr := dBusAccess.cmd.write
|
||||||
cache.io.cpu.execute.args.data := dBusAccess.cmd.data
|
cache.io.cpu.execute.args.data := dBusAccess.cmd.data
|
||||||
cache.io.cpu.execute.args.size := dBusAccess.cmd.size
|
cache.io.cpu.execute.args.size := dBusAccess.cmd.size
|
||||||
cache.io.cpu.execute.args.forceUncachedAccess := True //TODO Cached and redo management
|
cache.io.cpu.execute.args.forceUncachedAccess := False
|
||||||
if(genAtomic) cache.io.cpu.execute.args.isAtomic := False
|
if(genAtomic) cache.io.cpu.execute.args.isAtomic := False
|
||||||
cache.io.cpu.execute.address := dBusAccess.cmd.address //Will only be 12 muxes
|
cache.io.cpu.execute.address := dBusAccess.cmd.address //Will only be 12 muxes
|
||||||
forceDatapath := True
|
forceDatapath := True
|
||||||
|
@ -269,16 +269,19 @@ class DBusCachedPlugin(config : DataCacheConfig,
|
||||||
mmuBus.cmd.bypassTranslation setWhen(memory.input(IS_DBUS_SHARING))
|
mmuBus.cmd.bypassTranslation setWhen(memory.input(IS_DBUS_SHARING))
|
||||||
cache.io.cpu.memory.isValid setWhen(memory.input(IS_DBUS_SHARING))
|
cache.io.cpu.memory.isValid setWhen(memory.input(IS_DBUS_SHARING))
|
||||||
cache.io.cpu.writeBack.isValid setWhen(writeBack.input(IS_DBUS_SHARING))
|
cache.io.cpu.writeBack.isValid setWhen(writeBack.input(IS_DBUS_SHARING))
|
||||||
dBusAccess.rsp.valid := writeBack.input(IS_DBUS_SHARING) && !cache.io.cpu.writeBack.isWrite && !cache.io.cpu.writeBack.haltIt
|
dBusAccess.rsp.valid := writeBack.input(IS_DBUS_SHARING) && !cache.io.cpu.writeBack.isWrite && (cache.io.cpu.redo || !cache.io.cpu.writeBack.haltIt)
|
||||||
dBusAccess.rsp.data := cache.io.cpu.writeBack.data
|
dBusAccess.rsp.data := cache.io.cpu.writeBack.data
|
||||||
dBusAccess.rsp.error := cache.io.cpu.writeBack.unalignedAccess || cache.io.cpu.writeBack.accessError
|
dBusAccess.rsp.error := cache.io.cpu.writeBack.unalignedAccess || cache.io.cpu.writeBack.accessError
|
||||||
|
dBusAccess.rsp.redo := cache.io.cpu.redo
|
||||||
component.addPrePopTask{() =>
|
component.addPrePopTask{() =>
|
||||||
when(forceDatapath){
|
when(forceDatapath){
|
||||||
execute.output(REGFILE_WRITE_DATA) := dBusAccess.cmd.address.asBits
|
execute.output(REGFILE_WRITE_DATA) := dBusAccess.cmd.address.asBits
|
||||||
}
|
}
|
||||||
memory.input(IS_DBUS_SHARING) init(False)
|
memory.input(IS_DBUS_SHARING) init(False)
|
||||||
writeBack.input(IS_DBUS_SHARING) init(False)
|
writeBack.input(IS_DBUS_SHARING) init(False)
|
||||||
|
when(dBusAccess.rsp.valid){
|
||||||
|
writeBack.input(IS_DBUS_SHARING).getDrivingReg := False
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -497,6 +497,7 @@ class DBusSimplePlugin(catchAddressMisaligned : Boolean = false,
|
||||||
dBusAccess.rsp.valid := False
|
dBusAccess.rsp.valid := False
|
||||||
dBusAccess.rsp.data := dBus.rsp.data
|
dBusAccess.rsp.data := dBus.rsp.data
|
||||||
dBusAccess.rsp.error := dBus.rsp.error
|
dBusAccess.rsp.error := dBus.rsp.error
|
||||||
|
dBusAccess.rsp.redo := False
|
||||||
|
|
||||||
switch(state){
|
switch(state){
|
||||||
is(0){
|
is(0){
|
||||||
|
|
|
@ -21,6 +21,7 @@ case class DBusAccessCmd() extends Bundle {
|
||||||
case class DBusAccessRsp() extends Bundle {
|
case class DBusAccessRsp() extends Bundle {
|
||||||
val data = Bits(32 bits)
|
val data = Bits(32 bits)
|
||||||
val error = Bool()
|
val error = Bool()
|
||||||
|
val redo = Bool()
|
||||||
}
|
}
|
||||||
|
|
||||||
case class DBusAccess() extends Bundle {
|
case class DBusAccess() extends Bundle {
|
||||||
|
@ -161,7 +162,7 @@ class MmuPlugin(virtualRange : UInt => Bool,
|
||||||
val leaf = pte.R || pte.X
|
val leaf = pte.R || pte.X
|
||||||
}
|
}
|
||||||
|
|
||||||
val pteBuffer = RegNextWhen(dBusRsp.pte, dBusAccess.rsp.valid)
|
val pteBuffer = RegNextWhen(dBusRsp.pte, dBusAccess.rsp.valid && !dBusAccess.rsp.redo)
|
||||||
|
|
||||||
dBusAccess.cmd.valid := False
|
dBusAccess.cmd.valid := False
|
||||||
dBusAccess.cmd.write := False
|
dBusAccess.cmd.write := False
|
||||||
|
@ -190,10 +191,12 @@ class MmuPlugin(virtualRange : UInt => Bool,
|
||||||
}
|
}
|
||||||
is(State.L1_RSP){
|
is(State.L1_RSP){
|
||||||
when(dBusAccess.rsp.valid){
|
when(dBusAccess.rsp.valid){
|
||||||
|
state := State.L0_CMD
|
||||||
when(dBusRsp.leaf || dBusRsp.exception){
|
when(dBusRsp.leaf || dBusRsp.exception){
|
||||||
state := State.IDLE
|
state := State.IDLE
|
||||||
} otherwise {
|
}
|
||||||
state := State.L0_CMD
|
when(dBusAccess.rsp.redo){
|
||||||
|
state := State.L1_CMD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -207,11 +210,14 @@ class MmuPlugin(virtualRange : UInt => Bool,
|
||||||
is(State.L0_RSP){
|
is(State.L0_RSP){
|
||||||
when(dBusAccess.rsp.valid) {
|
when(dBusAccess.rsp.valid) {
|
||||||
state := State.IDLE
|
state := State.IDLE
|
||||||
|
when(dBusAccess.rsp.redo){
|
||||||
|
state := State.L0_CMD
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
when(dBusAccess.rsp.valid && (dBusRsp.leaf || dBusRsp.exception)){
|
when(dBusAccess.rsp.valid && !dBusAccess.rsp.redo && (dBusRsp.leaf || dBusRsp.exception)){
|
||||||
for(port <- ports){
|
for(port <- ports){
|
||||||
when(portId === port.id) {
|
when(portId === port.id) {
|
||||||
port.entryToReplace.increment()
|
port.entryToReplace.increment()
|
||||||
|
|
Loading…
Reference in New Issue