Add new type of IOBinder macro
This commit is contained in:
@@ -18,8 +18,31 @@ import tracegen.{HasTraceGenTilesModuleImp}
|
|||||||
|
|
||||||
import scala.reflect.{ClassTag, classTag}
|
import scala.reflect.{ClassTag, classTag}
|
||||||
|
|
||||||
|
// System for instantiating binders based
|
||||||
|
// on the scala type of the Target (_not_ its IO). This avoids needing to
|
||||||
|
// duplicate harnesses (essentially test harnesses) for each target.
|
||||||
|
//
|
||||||
|
// You could just as well create a custom harness module that instantiates
|
||||||
|
// bridges explicitly, or add methods to
|
||||||
|
// your target traits that instantiate the bridge there (i.e., akin to
|
||||||
|
// SimAXI4Mem). Since cake traits live in Rocket Chip it was easiest to match
|
||||||
|
// on the types rather than change trait code.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// A map of partial functions that match on the type the DUT (_not_ it's
|
||||||
|
// IO) to generate an appropriate bridge. You can add your own binder by adding
|
||||||
|
// a new (key, fn) pair. You should override existing pairs in this map when
|
||||||
|
// using a custom IOBinder
|
||||||
|
|
||||||
|
// Since we also want to compose this structure like the existing config system,
|
||||||
|
// use the scala string representation of the matched trait as a key
|
||||||
|
|
||||||
case object IOBinders extends Field[Map[String, (Clock, Bool, Bool, Any) => Seq[Any]]](Map())
|
case object IOBinders extends Field[Map[String, (Clock, Bool, Bool, Any) => Seq[Any]]](Map())
|
||||||
|
|
||||||
|
|
||||||
|
// This macro overrides previous matches on some Top mixin. This is useful for
|
||||||
|
// binders which modify IO, since those typically cannot be composed
|
||||||
class RegisterIOBinder[T](fn: => (Clock, Bool, Bool, T) => Seq[Any])(implicit tag: ClassTag[T]) extends Config((site, here, up) => {
|
class RegisterIOBinder[T](fn: => (Clock, Bool, Bool, T) => Seq[Any])(implicit tag: ClassTag[T]) extends Config((site, here, up) => {
|
||||||
case IOBinders => up(IOBinders, site) + (tag.runtimeClass.toString ->
|
case IOBinders => up(IOBinders, site) + (tag.runtimeClass.toString ->
|
||||||
((clock: Clock, reset: Bool, success: Bool, t: Any) => {
|
((clock: Clock, reset: Bool, success: Bool, t: Any) => {
|
||||||
@@ -31,6 +54,19 @@ class RegisterIOBinder[T](fn: => (Clock, Bool, Bool, T) => Seq[Any])(implicit ta
|
|||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// This macro composes with previous matches on some Top mixin. This is useful for
|
||||||
|
// annotation-like binders, since those can typically be composed
|
||||||
|
class RegisterBinder[T](fn: => (Clock, Bool, Bool, T) => Seq[Any])(implicit tag: ClassTag[T]) extends Config((site, here, up) => {
|
||||||
|
case IOBinders => up(IOBinders, site) + (tag.runtimeClass.toString ->
|
||||||
|
((clock: Clock, reset: Bool, success: Bool, t: Any) => {
|
||||||
|
t match {
|
||||||
|
case top: T => fn(clock, reset, success, top) ++
|
||||||
|
up(IOBinders, site).getOrElse(tag.runtimeClass.toString, (c: Clock, r: Bool, s: Bool, t: Any) => Nil)(clock, reset, success, top)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
class WithGPIOTiedOff extends RegisterIOBinder({
|
class WithGPIOTiedOff extends RegisterIOBinder({
|
||||||
(c, r, s, top: HasPeripheryGPIOModuleImp) => top.gpio.map(gpio => gpio.pins.map(p => p.i.ival := false.B)); Nil
|
(c, r, s, top: HasPeripheryGPIOModuleImp) => top.gpio.map(gpio => gpio.pins.map(p => p.i.ival := false.B)); Nil
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import tracegen.HasTraceGenTilesModuleImp
|
|||||||
|
|
||||||
import boom.common.{BoomTile}
|
import boom.common.{BoomTile}
|
||||||
|
|
||||||
import chipyard.iobinders.{IOBinders, RegisterIOBinder}
|
import chipyard.iobinders.{IOBinders, RegisterIOBinder, RegisterBinder}
|
||||||
import chipyard.HasBoomAndRocketTilesModuleImp
|
import chipyard.HasBoomAndRocketTilesModuleImp
|
||||||
|
|
||||||
class WithSerialBridge extends RegisterIOBinder({
|
class WithSerialBridge extends RegisterIOBinder({
|
||||||
@@ -66,7 +66,7 @@ class WithTraceGenBridge extends RegisterIOBinder({
|
|||||||
(c, r, s, target: HasTraceGenTilesModuleImp) => Seq(GroundTestBridge(target.success)(target.p))
|
(c, r, s, target: HasTraceGenTilesModuleImp) => Seq(GroundTestBridge(target.success)(target.p))
|
||||||
})
|
})
|
||||||
|
|
||||||
class WithFireSimMultiCycleRegfile extends RegisterIOBinder({
|
class WithFireSimMultiCycleRegfile extends RegisterBinder({
|
||||||
(c, r, s, target: HasBoomAndRocketTilesModuleImp) => {
|
(c, r, s, target: HasBoomAndRocketTilesModuleImp) => {
|
||||||
target.outer.tiles.map {
|
target.outer.tiles.map {
|
||||||
case r: RocketTile => {
|
case r: RocketTile => {
|
||||||
|
|||||||
Reference in New Issue
Block a user