package chipyard.fpga.vc707 import sys.process._ import org.chipsalliance.cde.config.{Config, Parameters} import freechips.rocketchip.subsystem.{SystemBusKey, PeripheryBusKey, ControlBusKey, ExtMem} import freechips.rocketchip.devices.debug.{DebugModuleKey, ExportDebug, JTAG} import freechips.rocketchip.devices.tilelink.{DevNullParams, BootROMLocated} import freechips.rocketchip.diplomacy.{DTSModel, DTSTimebase, RegionType, AddressSet} import freechips.rocketchip.tile.{XLen} import sifive.blocks.devices.spi.{PeripherySPIKey, SPIParams} import sifive.blocks.devices.uart.{PeripheryUARTKey, UARTParams} import sifive.fpgashells.shell.{DesignKey} import sifive.fpgashells.shell.xilinx.{VC7074GDDRSize} import testchipip.serdes.{SerialTLKey} import chipyard.{BuildSystem, ExtTLMem} import chipyard.harness._ class WithDefaultPeripherals extends Config((site, here, up) => { case PeripheryUARTKey => List(UARTParams(address = BigInt(0x64000000L))) case PeripherySPIKey => List(SPIParams(rAddress = BigInt(0x64001000L))) }) class WithSystemModifications extends Config((site, here, up) => { case DTSTimebase => BigInt{(1e6).toLong} case BootROMLocated(x) => up(BootROMLocated(x), site).map { p => // invoke makefile for sdboot val freqMHz = (site(SystemBusKey).dtsFrequency.get / (1000 * 1000)).toLong val make = s"make -C fpga/src/main/resources/vc707/sdboot PBUS_CLK=${freqMHz} bin" require (make.! == 0, "Failed to build bootrom") p.copy(hang = 0x10000, contentFileName = s"./fpga/src/main/resources/vc707/sdboot/build/sdboot.bin") } case ExtMem => up(ExtMem, site).map(x => x.copy(master = x.master.copy(size = site(VC7074GDDRSize)))) // set extmem to DDR size (note the size) case SerialTLKey => Nil // remove serialized tl port }) class WithVC707Tweaks extends Config ( // clocking new chipyard.harness.WithAllClocksFromHarnessClockInstantiator ++ new chipyard.clocking.WithPassthroughClockGenerator ++ new chipyard.config.WithMemoryBusFrequency(50.0) ++ new chipyard.config.WithSystemBusFrequency(50.0) ++ new chipyard.config.WithPeripheryBusFrequency(50.0) ++ new chipyard.config.WithControlBusFrequency(50.0) ++ new chipyard.config.WithFrontBusFrequency(50.0) ++ new chipyard.harness.WithHarnessBinderClockFreqMHz(50) ++ new WithFPGAFrequency(50) ++ // default 50MHz freq // harness binders new chipyard.harness.WithAllClocksFromHarnessClockInstantiator ++ new WithVC707UARTHarnessBinder ++ new WithVC707SPISDCardHarnessBinder ++ new WithVC707DDRMemHarnessBinder ++ // other configuration new WithDefaultPeripherals ++ new chipyard.config.WithTLBackingMemory ++ // use TL backing memory new WithSystemModifications ++ // setup busses, use sdboot bootrom, setup ext. mem. size new chipyard.config.WithNoDebug ++ // remove debug module new freechips.rocketchip.subsystem.WithoutTLMonitors ++ new freechips.rocketchip.subsystem.WithNMemoryChannels(1) ) class RocketVC707Config extends Config ( new WithVC707Tweaks ++ new chipyard.RocketConfig ) class BoomVC707Config extends Config ( new WithFPGAFrequency(50) ++ new WithVC707Tweaks ++ new chipyard.MegaBoomV3Config ) class WithFPGAFrequency(fMHz: Double) extends Config ( new chipyard.config.WithPeripheryBusFrequency(fMHz) ++ new chipyard.config.WithMemoryBusFrequency(fMHz) ++ new chipyard.config.WithSystemBusFrequency(fMHz) ++ new chipyard.config.WithControlBusFrequency(fMHz) ++ new chipyard.config.WithFrontBusFrequency(fMHz) ) class WithFPGAFreq25MHz extends WithFPGAFrequency(25) class WithFPGAFreq50MHz extends WithFPGAFrequency(50) class WithFPGAFreq75MHz extends WithFPGAFrequency(75) class WithFPGAFreq100MHz extends WithFPGAFrequency(100)