From 2e5f6d8427c6d0b421d408a66ce9bbeb8ddb0dc7 Mon Sep 17 00:00:00 2001 From: Hansung Kim Date: Tue, 23 Jan 2024 16:24:55 -0800 Subject: [PATCH] Support RoCC instantiation in VortexTile --- src/main/scala/radiance/tile/VortexTile.scala | 54 ++++++++++++------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/src/main/scala/radiance/tile/VortexTile.scala b/src/main/scala/radiance/tile/VortexTile.scala index b8f6616..8d5b0ba 100644 --- a/src/main/scala/radiance/tile/VortexTile.scala +++ b/src/main/scala/radiance/tile/VortexTile.scala @@ -133,23 +133,6 @@ class VortexTile private ( regNode := TLFragmenter(4, 64) := tlSlaveXbar.node - // val dmemDevice = new SimpleDevice("dtim", Seq("sifive,dtim0")) - /*val dmemNode = TLManagerNode(Seq(TLSlavePortParameters.v1( - Seq(TLSlaveParameters.v1( - address = AddressSet.misaligned(tileParams.dcache.get.scratch.getOrElse(0), - tileParams.dcache.get.nSets * tileParams.dcache.get.blockBytes), - resources = dmemDevice.reg("mem"), - regionType = RegionType.IDEMPOTENT, - executable = true, - supportsArithmetic = /*if (usingAtomics) TransferSizes(4, coreDataBytes) else*/ TransferSizes.none, - supportsLogical = /*if (usingAtomics) TransferSizes(4, coreDataBytes) else*/ TransferSizes.none, - supportsPutPartial = TransferSizes(1, lazyCoreParamsView.coreDataBytes), - supportsPutFull = TransferSizes(1, lazyCoreParamsView.coreDataBytes), - supportsGet = TransferSizes(1, lazyCoreParamsView.coreDataBytes), - fifoId = Some(0))), // requests handled in FIFO order - beatBytes = lazyCoreParamsView.coreDataBytes, - minLatency = 1)))*/ - require( p(SIMTCoreKey).isDefined, "SIMTCoreKey not defined; make sure to use WithSimtLanes when using VortexTile" @@ -358,6 +341,11 @@ class VortexTile private ( tlMasterXbar.node :=* dcacheNode } + // ROCC + val roccs = p(BuildRoCC).map(_(p)) + roccs.map(_.atlNode).foreach { atl => tlMasterXbar.node :=* atl } + roccs.map(_.tlNode).foreach { tl => tlOtherMastersNode :=* tl } + /* below are copied from rocket */ // val bus_error_unit = vortexParams.beuAddr map { a => @@ -390,9 +378,7 @@ class VortexTile private ( val itimProperty = Nil // frontend.icache.itimProperty.toSeq.flatMap(p => Map("sifive,itim" -> p)) - // val beuProperty = bus_error_unit - // .map(d => Map("sifive,buserror" -> d.device.asProperty)) - // .getOrElse(Nil) + // missing bus_error_unit val cpuDevice: SimpleDevice = new SimpleDevice( "cpu", @@ -679,6 +665,34 @@ class VortexTileModuleImp(outer: VortexTile) extends BaseTileModuleImp(outer) { // TODO: generalize for useVxCache if (!outer.vortexParams.useVxCache) {} + + // RoCC + if (outer.roccs.size > 0) { + val (respArb, cmdRouter) = { + val respArb = Module(new RRArbiter(new RoCCResponse()(outer.p), outer.roccs.size)) + val cmdRouter = Module(new RoccCommandRouter(outer.roccs.map(_.opcodes))(outer.p)) + outer.roccs.zipWithIndex.foreach { case (rocc, i) => + // ptwPorts ++= rocc.module.io.ptw + rocc.module.io.ptw <> DontCare + rocc.module.io.mem <> DontCare + rocc.module.io.cmd <> cmdRouter.io.out(i) + respArb.io.in(i) <> Queue(rocc.module.io.resp) + } + // Create this FPU just for RoCC + // val nFPUPorts = outer.roccs.filter(_.usesFPU).size + val fp_rocc_ios = outer.roccs.map(_.module.io) + fp_rocc_ios.map{ io => + io.fpu_req.ready := false.B + io.fpu_resp.valid := false.B + io.fpu_resp.bits := DontCare + } + (respArb, cmdRouter) + } + + cmdRouter.io.in <> DontCare + outer.roccs.foreach(_.module.io.exception := DontCare) + respArb.io.out <> DontCare + } } // Some @copypaste from CoalescerSourceGen.