1
0
rocket-chip/groundtest/src/main/scala/tile.scala

126 lines
3.8 KiB
Scala
Raw Normal View History

2015-10-27 05:37:35 +01:00
package groundtest
import Chisel._
import rocket._
import uncore.tilelink._
2016-05-03 03:25:02 +02:00
import junctions._
2015-10-27 05:37:35 +01:00
import scala.util.Random
import scala.collection.mutable.ListBuffer
2015-11-19 07:54:05 +01:00
import cde.{Parameters, Field}
case object BuildGroundTest extends Field[(Int, Parameters) => GroundTest]
case object GroundTestMaxXacts extends Field[Int]
case object GroundTestCSRs extends Field[Seq[Int]]
2016-05-04 05:20:52 +02:00
case object TohostAddr extends Field[BigInt]
2015-10-27 05:37:35 +01:00
case object GroundTestCachedClients extends Field[Int]
case object GroundTestUncachedClients extends Field[Int]
case object GroundTestNPTW extends Field[Int]
trait HasGroundTestParameters extends HasAddrMapParameters {
implicit val p: Parameters
val nUncached = p(GroundTestUncachedClients)
val nCached = p(GroundTestCachedClients)
val nPTW = p(GroundTestNPTW)
val memStart = addrMap("mem").start
val memStartBlock = memStart >> p(CacheBlockOffsetBits)
}
2015-11-19 05:53:36 +01:00
class DummyPTW(n: Int)(implicit p: Parameters) extends CoreModule()(p) {
val io = new Bundle {
val requestors = Vec(n, new TLBPTWIO).flip
}
val req_arb = Module(new RRArbiter(new PTWReq, n))
req_arb.io.in <> io.requestors.map(_.req)
req_arb.io.out.ready := Bool(true)
def vpn_to_ppn(vpn: UInt): UInt = vpn(ppnBits - 1, 0)
class QueueChannel extends ParameterizedBundle()(p) {
val ppn = UInt(width = ppnBits)
val chosen = UInt(width = log2Up(n))
}
val s1_ppn = vpn_to_ppn(req_arb.io.out.bits.addr)
val s2_ppn = RegEnable(s1_ppn, req_arb.io.out.valid)
val s2_chosen = RegEnable(req_arb.io.chosen, req_arb.io.out.valid)
val s2_valid = Reg(next = req_arb.io.out.valid)
val s2_resp = Wire(new PTWResp)
s2_resp.pte.ppn := s2_ppn
s2_resp.pte.reserved_for_software := UInt(0)
2016-01-20 20:39:40 +01:00
s2_resp.pte.d := Bool(true)
2015-11-19 05:53:36 +01:00
s2_resp.pte.r := Bool(false)
2016-01-20 20:39:40 +01:00
s2_resp.pte.typ := UInt("b0101")
2015-11-19 05:53:36 +01:00
s2_resp.pte.v := Bool(true)
io.requestors.zipWithIndex.foreach { case (requestor, i) =>
requestor.resp.valid := s2_valid && s2_chosen === UInt(i)
requestor.resp.bits := s2_resp
requestor.status.vm := UInt("b01000")
requestor.status.prv := UInt(PRV.S)
requestor.invalidate := Bool(false)
2015-11-19 05:53:36 +01:00
}
}
class GroundTestIO(implicit val p: Parameters) extends ParameterizedBundle()(p)
with HasGroundTestParameters {
val cache = Vec(nCached, new HellaCacheIO)
val mem = Vec(nUncached, new ClientUncachedTileLinkIO)
val ptw = Vec(nPTW, new TLBPTWIO)
2015-11-19 07:54:05 +01:00
val finished = Bool(OUTPUT)
}
2016-05-03 03:25:02 +02:00
abstract class GroundTest(implicit val p: Parameters) extends Module
with HasGroundTestParameters {
2015-11-19 07:54:05 +01:00
val io = new GroundTestIO
}
2015-11-19 07:54:05 +01:00
class GroundTestTile(id: Int, resetSignal: Bool)
(implicit val p: Parameters)
extends Tile(resetSignal = resetSignal)(p)
with HasGroundTestParameters {
2015-10-27 05:37:35 +01:00
2015-11-19 07:54:05 +01:00
val test = p(BuildGroundTest)(id, dcacheParams)
2015-11-19 05:53:36 +01:00
val ptwPorts = ListBuffer.empty ++= test.io.ptw
val memPorts = ListBuffer.empty ++= test.io.mem
if (nCached > 0) {
val dcache = Module(new HellaCache()(dcacheParams))
val dcacheArb = Module(new HellaCacheArbiter(nCached)(dcacheParams))
dcacheArb.io.requestor.zip(test.io.cache).foreach {
case (requestor, cache) =>
val dcacheIF = Module(new SimpleHellaCacheIF()(dcacheParams))
dcacheIF.io.requestor <> cache
requestor <> dcacheIF.io.cache
}
dcache.io.cpu <> dcacheArb.io.mem
io.cached.head <> dcache.io.mem
2015-10-27 05:37:35 +01:00
// SimpleHellaCacheIF leaves invalidate_lr dangling, so we wire it to false
dcache.io.cpu.invalidate_lr := Bool(false)
ptwPorts += dcache.io.ptw
}
2016-05-03 03:25:02 +02:00
// Only Tile 0 needs to write tohost
if (id == 0) {
2016-06-23 21:16:37 +02:00
when (test.io.finished) {
stop()
}
}
2016-05-03 03:25:02 +02:00
if (ptwPorts.size > 0) {
val ptw = Module(new DummyPTW(ptwPorts.size))
ptw.io.requestors <> ptwPorts
}
require(memPorts.size == io.uncached.size)
if (memPorts.size > 0) {
io.uncached <> memPorts
}
2015-10-27 05:37:35 +01:00
}