Add custom chiptop+iocell example
This commit is contained in:
@@ -126,3 +126,9 @@ class MulticlockAXIOverSerialConfig extends Config(
|
|||||||
new freechips.rocketchip.subsystem.WithNBigCores(2) ++
|
new freechips.rocketchip.subsystem.WithNBigCores(2) ++
|
||||||
new chipyard.config.AbstractConfig)
|
new chipyard.config.AbstractConfig)
|
||||||
// DOC include end: MulticlockAXIOverSerialConfig
|
// DOC include end: MulticlockAXIOverSerialConfig
|
||||||
|
|
||||||
|
class CustomIOChipTopRocketConfig extends Config(
|
||||||
|
new chipyard.example.WithCustomChipTop ++
|
||||||
|
new chipyard.example.WithCustomIOCells ++
|
||||||
|
new freechips.rocketchip.subsystem.WithNBigCores(1) ++ // single rocket-core
|
||||||
|
new chipyard.config.AbstractConfig)
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
package chipyard.example
|
||||||
|
|
||||||
|
import chisel3._
|
||||||
|
import chipyard.iobinders._
|
||||||
|
|
||||||
|
import freechips.rocketchip.config._
|
||||||
|
import freechips.rocketchip.diplomacy.{InModuleBody}
|
||||||
|
import barstools.iocell.chisel._
|
||||||
|
import chipyard._
|
||||||
|
|
||||||
|
// A "custom" IOCell with additional I/O
|
||||||
|
// The IO don't do anything here in this example
|
||||||
|
class CustomDigitalInIOCellBundle extends DigitalInIOCellBundle {
|
||||||
|
val custom_out = Output(Bool())
|
||||||
|
val custom_in = Input(Bool())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Using a custom digital in iocell instead of the default one
|
||||||
|
class CustomDigitalInIOCell extends RawModule with DigitalInIOCell {
|
||||||
|
val io = IO(new CustomDigitalInIOCellBundle)
|
||||||
|
io.i := io.pad
|
||||||
|
io.custom_out := io.pad
|
||||||
|
}
|
||||||
|
|
||||||
|
case class CustomIOCellParams() extends IOCellTypeParams {
|
||||||
|
def analog() = Module(new GenericAnalogIOCell)
|
||||||
|
def gpio() = Module(new GenericDigitalGPIOCell)
|
||||||
|
def input() = Module(new CustomDigitalInIOCell)
|
||||||
|
def output() = Module(new GenericDigitalOutIOCell)
|
||||||
|
}
|
||||||
|
|
||||||
|
class CustomChipTop(implicit p: Parameters) extends ChipTop {
|
||||||
|
// making the module name ChipTop instead of CustomChipTop means
|
||||||
|
// we don't have to set the TOP make variable to CustomChipTop
|
||||||
|
override lazy val desiredName = "ChipTop"
|
||||||
|
|
||||||
|
// InModuleBody blocks are executed within the LazyModuleImp of this block
|
||||||
|
InModuleBody {
|
||||||
|
iocellMap.foreach { case (interface, cells) => {
|
||||||
|
cells.foreach { _ match {
|
||||||
|
case c: CustomDigitalInIOCell => {
|
||||||
|
c.io.custom_in := false.B
|
||||||
|
}
|
||||||
|
case c: GenericDigitalOutIOCell => {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
case c => {
|
||||||
|
require(false, "Unsupported iocell type ${c.getClass}")
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
|
||||||
|
// demonstrate accessing the iocellMap directly
|
||||||
|
val serialTLIOCells = iocellMap("interface testchipip.CanHavePeripheryTLSerial")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class WithCustomIOCells extends Config((site, here, up) => {
|
||||||
|
case IOCellKey => CustomIOCellParams()
|
||||||
|
})
|
||||||
|
|
||||||
|
class WithCustomChipTop extends Config((site, here, up) => {
|
||||||
|
case BuildTop => (p: Parameters) => new CustomChipTop()(p)
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user