1
0

Merge pull request #1177 from freechipsproject/dont-touch-2

Make more use of chisel3.experimental.DontTouch
This commit is contained in:
Henry Cook 2018-01-09 15:13:55 -08:00 committed by GitHub
commit f5211765e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 26 additions and 15 deletions

View File

@ -3,6 +3,7 @@
package freechips.rocketchip.coreplex package freechips.rocketchip.coreplex
import Chisel._ import Chisel._
import chisel3.experimental.dontTouch
import freechips.rocketchip.config.Parameters import freechips.rocketchip.config.Parameters
import freechips.rocketchip.diplomacy._ import freechips.rocketchip.diplomacy._
import freechips.rocketchip.interrupts._ import freechips.rocketchip.interrupts._
@ -37,9 +38,9 @@ trait HasTilesModuleImp extends LazyModuleImp
vectors.head.getWidth vectors.head.getWidth
} }
val tile_inputs = Wire(Vec(outer.nTiles, new ClockedTileInputs()(p.alterPartial { val tile_inputs = dontTouch(Wire(Vec(outer.nTiles, new ClockedTileInputs()(p.alterPartial {
case SharedMemoryTLEdge => outer.sharedMemoryTLEdge case SharedMemoryTLEdge => outer.sharedMemoryTLEdge
}))) })))) // dontTouch keeps constant prop from sucking these signals into the tile
// Unconditionally wire up the non-diplomatic tile inputs // Unconditionally wire up the non-diplomatic tile inputs
outer.tiles.map(_.module).zip(tile_inputs).foreach { case(tile, wire) => outer.tiles.map(_.module).zip(tile_inputs).foreach { case(tile, wire) =>

View File

@ -118,18 +118,14 @@ trait HasRocketTiles extends HasTiles
def tileSlaveBuffering: TLInwardNode = rocket { def tileSlaveBuffering: TLInwardNode = rocket {
val slaveBuffer = LazyModule(new TLBuffer(BufferParams.flow, BufferParams.none, BufferParams.none, BufferParams.none, BufferParams.none)) val slaveBuffer = LazyModule(new TLBuffer(BufferParams.flow, BufferParams.none, BufferParams.none, BufferParams.none, BufferParams.none))
crossing.crossingType match { crossing.crossingType match {
case _: SynchronousCrossing => rocket.slaveNode // requirement already checked case RationalCrossing(_) if (tp.boundaryBuffers) => rocket.slaveNode :*= slaveBuffer.node
case _: AsynchronousCrossing => rocket.slaveNode case _ => rocket.slaveNode
case _: RationalCrossing =>
if (tp.boundaryBuffers) {
DisableMonitors { implicit p => rocket.slaveNode :*= slaveBuffer.node }
} else {
rocket.slaveNode
}
} }
} }
pbus.toTile(tp.name) { implicit p => crossing.slave.adapt(this)(tileSlaveBuffering :*= rocket.crossTLIn) } pbus.toTile(tp.name) { implicit p => crossing.slave.adapt(this)( DisableMonitors { implicit p =>
tileSlaveBuffering :*= rocket.crossTLIn
})}
// Handle all the different types of interrupts crossing to or from the tile: // Handle all the different types of interrupts crossing to or from the tile:
// 1. Debug interrupt is definitely asynchronous in all cases. // 1. Debug interrupt is definitely asynchronous in all cases.
@ -151,7 +147,7 @@ trait HasRocketTiles extends HasTiles
if (tp.core.useVM) periphIntNode := plic.intnode // seip if (tp.core.useVM) periphIntNode := plic.intnode // seip
// 3. local interrupts never cross // 3. local interrupts never cross
// this.intInwardNode is wired up externally // lip // rocket.intInwardNode is wired up externally // lip
// 4. conditional crossing from core to PLIC // 4. conditional crossing from core to PLIC
FlipRendering { implicit p => FlipRendering { implicit p =>

View File

@ -4,6 +4,7 @@
package freechips.rocketchip.rocket package freechips.rocketchip.rocket
import Chisel._ import Chisel._
import chisel3.experimental.dontTouch
import freechips.rocketchip.config.{Parameters, Field} import freechips.rocketchip.config.{Parameters, Field}
import freechips.rocketchip.coreplex._ import freechips.rocketchip.coreplex._
import freechips.rocketchip.diplomacy._ import freechips.rocketchip.diplomacy._
@ -184,6 +185,7 @@ class HellaCacheModule(outer: HellaCache) extends LazyModuleImp(outer)
implicit val edge = outer.node.edges.out(0) implicit val edge = outer.node.edges.out(0)
val (tl_out, _) = outer.node.out(0) val (tl_out, _) = outer.node.out(0)
val io = IO(new HellaCacheBundle(outer)) val io = IO(new HellaCacheBundle(outer))
dontTouch(io.cpu.resp) // Users like to monitor these fields even if the core ignores some signals
private val fifoManagers = edge.manager.managers.filter(TLFIFOFixer.allUncacheable) private val fifoManagers = edge.manager.managers.filter(TLFIFOFixer.allUncacheable)
fifoManagers.foreach { m => fifoManagers.foreach { m =>

View File

@ -135,7 +135,6 @@ abstract class BaseTile(tileParams: TileParams, val crossing: CoreplexClockCross
protected val tlMasterXbar = LazyModule(new TLXbar) protected val tlMasterXbar = LazyModule(new TLXbar)
protected val tlSlaveXbar = LazyModule(new TLXbar) protected val tlSlaveXbar = LazyModule(new TLXbar)
protected val intXbar = LazyModule(new IntXbar) protected val intXbar = LazyModule(new IntXbar)
protected val intSinkNode = IntSinkNode(IntSinkPortSimple())
def connectTLSlave(node: TLNode, bytes: Int) { def connectTLSlave(node: TLNode, bytes: Int) {
DisableMonitors { implicit p => DisableMonitors { implicit p =>

View File

@ -22,6 +22,7 @@ class TileInterrupts(implicit p: Parameters) extends CoreBundle()(p) {
trait HasExternalInterrupts { this: BaseTile => trait HasExternalInterrupts { this: BaseTile =>
val intInwardNode = intXbar.intnode val intInwardNode = intXbar.intnode
protected val intSinkNode = IntSinkNode(IntSinkPortSimple())
intSinkNode := intXbar.intnode intSinkNode := intXbar.intnode
val intcDevice = new Device { val intcDevice = new Device {

View File

@ -66,7 +66,7 @@ class RocketTile(
// TODO: this doesn't block other masters, e.g. RoCCs // TODO: this doesn't block other masters, e.g. RoCCs
tlOtherMastersNode := tile_master_blocker.map { _.node := tlMasterXbar.node } getOrElse { tlMasterXbar.node } tlOtherMastersNode := tile_master_blocker.map { _.node := tlMasterXbar.node } getOrElse { tlMasterXbar.node }
masterNode :=* tlOtherMastersNode masterNode :=* tlOtherMastersNode
tlSlaveXbar.node :*= slaveNode DisableMonitors { implicit p => tlSlaveXbar.node :*= slaveNode }
def findScratchpadFromICache: Option[AddressSet] = dtim_adapter.map { s => def findScratchpadFromICache: Option[AddressSet] = dtim_adapter.map { s =>
val finalNode = frontend.masterNode.edges.out.head.manager.managers.find(_.nodePath.last == s.node) val finalNode = frontend.masterNode.edges.out.head.manager.managers.find(_.nodePath.last == s.node)

View File

@ -4,7 +4,7 @@
package freechips.rocketchip.util package freechips.rocketchip.util
import Chisel._ import Chisel._
import chisel3.experimental.{dontTouch, RawModule} import chisel3.experimental.{ChiselAnnotation, RawModule}
import freechips.rocketchip.config.Parameters import freechips.rocketchip.config.Parameters
import scala.math._ import scala.math._
@ -26,6 +26,13 @@ class ParameterizedBundle(implicit p: Parameters) extends Bundle {
trait DontTouch { trait DontTouch {
self: RawModule => self: RawModule =>
def dontTouch(data: Data): Unit = data match {
case agg: Aggregate =>
agg.getElements.foreach(dontTouch)
case elt: Element =>
annotate(ChiselAnnotation(elt, classOf[firrtl.Transform], "DONTtouch!"))
}
/** Marks every port as don't touch /** Marks every port as don't touch
* *
* @note This method can only be called after the Module has been fully constructed * @note This method can only be called after the Module has been fully constructed
@ -35,6 +42,11 @@ trait DontTouch {
self.getModulePorts.foreach(dontTouch(_)) self.getModulePorts.foreach(dontTouch(_))
self self
} }
def dontTouchPortsExcept(f: Data => Boolean): this.type = {
self.getModulePorts.filterNot(f).foreach(dontTouch(_))
self
}
} }
trait Clocked extends Bundle { trait Clocked extends Bundle {