This commit is contained in:
Charles Papon 2017-03-31 11:06:40 +02:00
parent 19fe998a52
commit 26597f78cd
2 changed files with 35 additions and 36 deletions

View file

@ -18,8 +18,8 @@ case class InstructionCacheConfig( cacheSize : Int,
class IBusCachedPlugin(config : InstructionCacheConfig) extends Plugin[VexRiscv]{
class IBusCachedPlugin(catchAccessFault : Boolean, cacheConfig : InstructionCacheConfig) extends Plugin[VexRiscv]{ import config._
var iBus : InstructionCacheMemBus = null var iBus : InstructionCacheMemBus = null
object IBUS_ACCESS_ERROR extends Stageable(Bool) object IBUS_ACCESS_ERROR extends Stageable(Bool)
@ -37,29 +37,29 @@ class IBusCachedPlugin(catchAccessFault : Boolean, cacheConfig : InstructionCach
import pipeline._ import pipeline._
import pipeline.config._ import pipeline.config._
val cache = new InstructionCache(cacheConfig) val cache = new InstructionCache(this.config)
iBus = master(new InstructionCacheMemBus(cacheConfig)).setName("iBus") iBus = master(new InstructionCacheMemBus(this.config)).setName("iBus")
iBus <> cache.io.mem iBus <> cache.io.mem
//Connect prefetch cache side //Connect prefetch cache side
cache.io.cpu.cmd.isValid := prefetch.arbitration.isValid cache.io.cpu.prefetch.isValid := prefetch.arbitration.isValid
cache.io.cpu.cmd.isFiring := prefetch.arbitration.isFiring cache.io.cpu.prefetch.isFiring := prefetch.arbitration.isFiring
cache.io.cpu.cmd.address := prefetch.output(PC) cache.io.cpu.prefetch.address := prefetch.output(PC)
prefetch.arbitration.haltIt setWhen(cache.io.cpu.cmd.haltIt) prefetch.arbitration.haltIt setWhen(cache.io.cpu.prefetch.haltIt)
//Connect fetch cache side //Connect fetch cache side
cache.io.cpu.rsp.isValid := fetch.arbitration.isValid cache.io.cpu.fetch.isValid := fetch.arbitration.isValid
cache.io.cpu.rsp.isStuck := fetch.arbitration.isStuck cache.io.cpu.fetch.isStuck := fetch.arbitration.isStuck
cache.io.cpu.rsp.address := fetch.output(PC) cache.io.cpu.fetch.address := fetch.output(PC)
fetch.arbitration.haltIt setWhen(cache.io.cpu.rsp.haltIt) fetch.arbitration.haltIt setWhen(cache.io.cpu.fetch.haltIt)
fetch.insert(INSTRUCTION) := cache.io.cpu.rsp.data fetch.insert(INSTRUCTION) := cache.io.cpu.fetch.data
cache.io.flush.cmd.valid := False cache.io.flush.cmd.valid := False
if(catchAccessFault){ if(catchAccessFault){
fetch.insert(IBUS_ACCESS_ERROR) := cache.io.cpu.rsp.error fetch.insert(IBUS_ACCESS_ERROR) := cache.io.cpu.fetch.error
decodeExceptionPort.valid := decode.arbitration.isValid && decode.input(IBUS_ACCESS_ERROR) decodeExceptionPort.valid := decode.arbitration.isValid && decode.input(IBUS_ACCESS_ERROR)
decodeExceptionPort.code := 1 decodeExceptionPort.code := 1
@ -99,12 +99,12 @@ case class InstructionCacheCpuRsp(p : InstructionCacheConfig) extends Bundle wit
case class InstructionCacheCpuBus(p : InstructionCacheConfig) extends Bundle with IMasterSlave{ case class InstructionCacheCpuBus(p : InstructionCacheConfig) extends Bundle with IMasterSlave{
val cmd = InstructionCacheCpuCmd(p) val prefetch = InstructionCacheCpuCmd(p)
val rsp = InstructionCacheCpuRsp(p) val fetch = InstructionCacheCpuRsp(p)
override def asMaster(): Unit = { override def asMaster(): Unit = {
master(cmd) master(prefetch)
master(rsp) master(fetch)
} }
} }
@ -191,7 +191,7 @@ class InstructionCache(p : InstructionCacheConfig) extends Component{
}) })
io.cpu.cmd.haltIt := False io.cpu.prefetch.haltIt := False
val lineLoader = new Area{ val lineLoader = new Area{
val requestIn = Stream(wrap(new Bundle{ val requestIn = Stream(wrap(new Bundle{
@ -207,15 +207,15 @@ class InstructionCache(p : InstructionCacheConfig) extends Component{
val flushCounter = Reg(UInt(log2Up(wayLineCount) + 1 bit)) init(0) val flushCounter = Reg(UInt(log2Up(wayLineCount) + 1 bit)) init(0)
when(!flushCounter.msb){ when(!flushCounter.msb){
io.cpu.cmd.haltIt := True io.cpu.prefetch.haltIt := True
flushCounter := flushCounter + 1 flushCounter := flushCounter + 1
} }
when(!RegNext(flushCounter.msb)){ when(!RegNext(flushCounter.msb)){
io.cpu.cmd.haltIt := True io.cpu.prefetch.haltIt := True
} }
val flushFromInterface = RegInit(False) val flushFromInterface = RegInit(False)
when(io.flush.cmd.valid){ when(io.flush.cmd.valid){
io.cpu.cmd.haltIt := True io.cpu.prefetch.haltIt := True
when(io.flush.cmd.ready){ when(io.flush.cmd.ready){
flushCounter := 0 flushCounter := 0
flushFromInterface := True flushFromInterface := True
@ -281,7 +281,7 @@ class InstructionCache(p : InstructionCacheConfig) extends Component{
// waysHitWord.assignDontCare() // waysHitWord.assignDontCare()
val waysRead = for(way <- ways) yield new Area{ val waysRead = for(way <- ways) yield new Area{
val readAddress = Mux(io.cpu.rsp.isStuck,io.cpu.rsp.address,io.cpu.cmd.address) val readAddress = Mux(io.cpu.fetch.isStuck,io.cpu.fetch.address,io.cpu.prefetch.address)
val tag = way.tags.readSync(readAddress(lineRange)) val tag = way.tags.readSync(readAddress(lineRange))
val data = way.datas.readSync(readAddress(lineRange.high downto wordRange.low)) val data = way.datas.readSync(readAddress(lineRange.high downto wordRange.low))
// val readAddress = request.address // val readAddress = request.address
@ -290,29 +290,29 @@ class InstructionCache(p : InstructionCacheConfig) extends Component{
// way.tags.add(new AttributeString("ramstyle","no_rw_check")) // way.tags.add(new AttributeString("ramstyle","no_rw_check"))
// way.datas.add(new AttributeString("ramstyle","no_rw_check")) // way.datas.add(new AttributeString("ramstyle","no_rw_check"))
waysHitWord := data //Not applicable to multi way waysHitWord := data //Not applicable to multi way
when(tag.valid && tag.address === io.cpu.rsp.address(tagRange)) { when(tag.valid && tag.address === io.cpu.fetch.address(tagRange)) {
waysHitValid := True waysHitValid := True
if(catchAccessFault) waysHitError := tag.error if(catchAccessFault) waysHitError := tag.error
} }
when(lineLoader.request.valid && lineLoader.request.addr(lineRange) === io.cpu.rsp.address(lineRange)){ when(lineLoader.request.valid && lineLoader.request.addr(lineRange) === io.cpu.fetch.address(lineRange)){
waysHitValid := False //Not applicable to multi way waysHitValid := False //Not applicable to multi way
} }
} }
val loaderHitValid = lineLoader.request.valid && lineLoader.request.addr(tagLineRange) === io.cpu.rsp.address(tagLineRange) val loaderHitValid = lineLoader.request.valid && lineLoader.request.addr(tagLineRange) === io.cpu.fetch.address(tagLineRange)
val loaderHitReady = lineLoader.loadedWordsReadable(io.cpu.rsp.address(wordRange)) val loaderHitReady = lineLoader.loadedWordsReadable(io.cpu.fetch.address(wordRange))
io.cpu.rsp.haltIt := io.cpu.rsp.isValid && !(waysHitValid || (loaderHitValid && loaderHitReady)) io.cpu.fetch.haltIt := io.cpu.fetch.isValid && !(waysHitValid || (loaderHitValid && loaderHitReady))
io.cpu.rsp.data := waysHitWord //TODO io.cpu.fetch.data := waysHitWord //TODO
if(catchAccessFault) io.cpu.rsp.error := (waysHitValid && waysHitError) || (loaderHitValid && loaderHitReady && lineLoader.loadingWithErrorReg) if(catchAccessFault) io.cpu.fetch.error := (waysHitValid && waysHitError) || (loaderHitValid && loaderHitReady && lineLoader.loadingWithErrorReg)
lineLoader.requestIn.valid := io.cpu.rsp.isValid && ! waysHitValid lineLoader.requestIn.valid := io.cpu.fetch.isValid && ! waysHitValid
lineLoader.requestIn.addr := io.cpu.rsp.address lineLoader.requestIn.addr := io.cpu.fetch.address
} }
io.flush.cmd.ready := !(lineLoader.request.valid || io.cpu.rsp.isValid) io.flush.cmd.ready := !(lineLoader.request.valid || io.cpu.fetch.isValid)
} }
object InstructionCacheMain{ object InstructionCacheMain{

View file

@ -84,8 +84,7 @@ object TopLevel {
// catchAccessFault = true // catchAccessFault = true
// ), // ),
new IBusCachedPlugin( new IBusCachedPlugin(
catchAccessFault = true,//DUPLICATION config = InstructionCacheConfig(
cacheConfig = InstructionCacheConfig(
cacheSize =4096, cacheSize =4096,
bytePerLine =32, bytePerLine =32,
wayCount = 1, wayCount = 1,
@ -93,7 +92,7 @@ object TopLevel {
addressWidth = 32, addressWidth = 32,
cpuDataWidth = 32, cpuDataWidth = 32,
memDataWidth = 32, memDataWidth = 32,
catchAccessFault = true //DUPLICATION catchAccessFault = true
) )
), ),
new DecoderSimplePlugin( new DecoderSimplePlugin(