300 lines
10 KiB
Scala
300 lines
10 KiB
Scala
// See LICENSE for license details.
|
|
package sifive.freedom.unleashed.u500vc707devkit
|
|
|
|
import Chisel._
|
|
import config._
|
|
import util._
|
|
import junctions._
|
|
import diplomacy._
|
|
import uncore.tilelink._
|
|
import uncore.devices._
|
|
import uncore.util._
|
|
import uncore.converters._
|
|
import rocket._
|
|
import coreplex._
|
|
import rocketchip._
|
|
|
|
import sifive.blocks.devices.xilinxvc707mig._
|
|
import sifive.blocks.devices.xilinxvc707pciex1._
|
|
import sifive.blocks.devices.gpio.{GPIOConfig, PeripheryGPIO, PeripheryGPIOBundle, PeripheryGPIOModule}
|
|
import sifive.blocks.devices.spi.{SPIConfig, PeripherySPI, PeripherySPIBundle, PeripherySPIModule}
|
|
import sifive.blocks.devices.uart._
|
|
import sifive.blocks.util.ResetCatchAndSync
|
|
|
|
trait PeripheryConfigs {
|
|
val uartConfigs = List(UARTConfig(address = BigInt(0x54000000L)))
|
|
val spiConfigs = List(SPIConfig(rAddress = BigInt(0x54001000L)))
|
|
val gpioConfig = GPIOConfig(address = BigInt(0x54002000L), width = 4)
|
|
}
|
|
|
|
class U500VC707DevKitSystem(implicit p: Parameters) extends BaseTop
|
|
with PeripheryConfigs
|
|
with PeripheryBootROM
|
|
with PeripheryDebug
|
|
with PeripheryCounter
|
|
with PeripheryUART
|
|
with PeripherySPI
|
|
with PeripheryGPIO
|
|
with PeripheryXilinxVC707MIG
|
|
with PeripheryXilinxVC707PCIeX1
|
|
with HardwiredResetVector
|
|
with RocketPlexMaster {
|
|
override lazy val module = new U500VC707DevKitSystemModule(this, () => new U500VC707DevKitSystemBundle(this))
|
|
|
|
// scalastyle:off method.length
|
|
ConfigStringOutput.contents = Some {
|
|
"""platform {
|
|
| vendor ucb;
|
|
| arch spike;
|
|
|};
|
|
|plic {
|
|
| interface "plic";
|
|
| ndevs 9;
|
|
| priority { mem { 0x0c000000 0x0c00ffff; }; };
|
|
| pending { mem { 0x0c001000 0x0c00107f; }; };
|
|
| 0 {
|
|
| 0 {
|
|
| m {
|
|
| ie { mem { 0x0c002000 0x0c00207f; }; };
|
|
| ctl { mem { 0x0c200000 0x0c200007; }; };
|
|
| };
|
|
| s {
|
|
| ie { mem { 0x0c002080 0x0c0020ff; }; };
|
|
| ctl { mem { 0x0c201000 0x0c201007; }; };
|
|
| };
|
|
| };
|
|
| };
|
|
|};
|
|
|pcie {
|
|
| interface "xilinx-pcie-rv";
|
|
| bus {
|
|
| mem { 0x60000000 0x7fffffff; } { 0x200000000 0x3ffffffff; };
|
|
| bus { 1 63; };
|
|
| };
|
|
| bridge {
|
|
| mem { 0x50000000 0x53ffffff; };
|
|
| bus 0;
|
|
| irq 6;
|
|
| };
|
|
|};
|
|
|leds {
|
|
| interface "gpio";
|
|
| ngpio 4;
|
|
| mem { 0x54002000 0x54002003; };
|
|
|};
|
|
|rtc {
|
|
| addr 0x200bff8;
|
|
|};
|
|
|ram {
|
|
| 0 {
|
|
| addr 0x80000000;
|
|
| size 0x10000000;
|
|
| };
|
|
|};
|
|
|uart {
|
|
| addr 0x54000000;
|
|
|};
|
|
|core {
|
|
| 0 {
|
|
| 0 {
|
|
| isa rv64ima;
|
|
| timecmp 0x02004000;
|
|
| ipi 0x02000000;
|
|
| };
|
|
| };
|
|
|};
|
|
|\u0000""".stripMargin
|
|
}
|
|
// scalastyle:on method.length
|
|
}
|
|
|
|
class U500VC707DevKitSystemBundle[+L <: U500VC707DevKitSystem](_outer: L) extends BaseTopBundle(_outer)
|
|
with PeripheryConfigs
|
|
with PeripheryBootROMBundle
|
|
with PeripheryDebugBundle
|
|
with PeripheryCounterBundle
|
|
with PeripheryUARTBundle
|
|
with PeripherySPIBundle
|
|
with PeripheryGPIOBundle
|
|
with PeripheryXilinxVC707MIGBundle
|
|
with PeripheryXilinxVC707PCIeX1Bundle
|
|
with HardwiredResetVectorBundle
|
|
with RocketPlexMasterBundle
|
|
|
|
class U500VC707DevKitSystemModule[+L <: U500VC707DevKitSystem, +B <: U500VC707DevKitSystemBundle[L]](_outer: L, _io: () => B) extends BaseTopModule(_outer, _io)
|
|
with PeripheryConfigs
|
|
with PeripheryBootROMModule
|
|
with PeripheryDebugModule
|
|
with PeripheryCounterModule
|
|
with PeripheryUARTModule
|
|
with PeripherySPIModule
|
|
with PeripheryGPIOModule
|
|
with PeripheryXilinxVC707MIGModule
|
|
with PeripheryXilinxVC707PCIeX1Module
|
|
with HardwiredResetVectorModule
|
|
with RocketPlexMasterModule
|
|
|
|
/////
|
|
|
|
class ResetDone extends Module {
|
|
//unused - in future io.resetdone can set rocketchip STOP_COND/PRINTF_COND
|
|
val io = new Bundle{
|
|
val reset = Bool(INPUT)
|
|
val resetdone = Bool(OUTPUT)
|
|
}
|
|
val resetdonereg = Reg(init = Bool(false))
|
|
val resetff = Reg(init = Bool(false))
|
|
resetff := io.reset;
|
|
resetdonereg := Mux( ((!io.reset)&&resetff), UInt("b1"), resetdonereg)
|
|
io.resetdone := resetdonereg
|
|
}
|
|
|
|
/////
|
|
|
|
class U500VC707DevKitIO(implicit val p: Parameters) extends Bundle
|
|
with PeripheryConfigs
|
|
with PeripheryUARTBundle
|
|
with PeripherySPIBundle
|
|
with PeripheryGPIOBundle
|
|
{
|
|
val debug = (!p(IncludeJtagDTM)).option(new DebugBusIO()(p).flip)
|
|
val jtag = p(IncludeJtagDTM).option(new JTAGIO(true).flip)
|
|
//MIG
|
|
val xilinxvc707mig = new XilinxVC707MIGPads
|
|
//PCIe
|
|
val xilinxvc707pcie = new XilinxVC707PCIeX1Pads
|
|
//Clocks
|
|
val sys_clk_n = Bool(INPUT)
|
|
val sys_clk_p = Bool(INPUT)
|
|
val pcie_refclk_p = Bool(INPUT)
|
|
val pcie_refclk_n = Bool(INPUT)
|
|
//Reset
|
|
val sys_reset = Bool(INPUT)
|
|
//Misc outputs used in system.v
|
|
val core_reset = Bool(OUTPUT)
|
|
val core_clock = Clock(OUTPUT)
|
|
}
|
|
|
|
/////
|
|
|
|
class U500VC707DevKitTop(implicit val p: Parameters) extends Module {
|
|
|
|
// ------------------------------------------------------------
|
|
// Instantiate U500 VC707 Dev Kit system (sys)
|
|
// ------------------------------------------------------------
|
|
val sys = Module(LazyModule(new U500VC707DevKitSystem).module)
|
|
val io = new U500VC707DevKitIO
|
|
|
|
// ------------------------------------------------------------
|
|
// Clock and Reset
|
|
// ------------------------------------------------------------
|
|
val mig_mmcm_locked = Wire(Bool())
|
|
val mig_sys_reset = Wire(Bool())
|
|
val init_calib_complete = Wire(Bool())
|
|
val mmcm_lock_pcie = Wire(Bool())
|
|
val do_reset = Wire(Bool())
|
|
val mig_clock = Wire(Clock())
|
|
val mig_resetn = Wire(Bool())
|
|
val top_resetn = Wire(Bool())
|
|
val pcie_dat_reset = Wire(Bool())
|
|
val pcie_dat_resetn = Wire(Bool())
|
|
val pcie_cfg_reset = Wire(Bool())
|
|
val pcie_cfg_resetn = Wire(Bool())
|
|
val pcie_dat_clock = Wire(Clock())
|
|
val pcie_cfg_clock = Wire(Clock())
|
|
val top_clock = Wire(Clock())
|
|
val top_reset = Wire(Bool())
|
|
val mig_reset = Wire(Bool())
|
|
|
|
do_reset := !mig_mmcm_locked || !mmcm_lock_pcie || mig_sys_reset
|
|
mig_resetn := !mig_reset
|
|
top_resetn := !top_reset
|
|
pcie_dat_resetn := !pcie_dat_reset
|
|
pcie_cfg_resetn := !pcie_cfg_reset
|
|
// For now, run the CPU synchronous to the PCIe data bus
|
|
top_clock := pcie_dat_clock
|
|
val safe_reset = Module(new vc707reset)
|
|
safe_reset.io.areset := do_reset
|
|
safe_reset.io.clock1 := mig_clock
|
|
mig_reset := safe_reset.io.reset1
|
|
safe_reset.io.clock2 := pcie_dat_clock
|
|
pcie_dat_reset := safe_reset.io.reset2
|
|
safe_reset.io.clock3 := pcie_cfg_clock
|
|
pcie_cfg_reset := safe_reset.io.reset3
|
|
safe_reset.io.clock4 := top_clock
|
|
top_reset := safe_reset.io.reset4
|
|
|
|
sys.clock := top_clock
|
|
sys.reset := top_reset
|
|
|
|
// ------------------------------------------------------------
|
|
// UART
|
|
// ------------------------------------------------------------
|
|
io.uarts <> sys.io.uarts
|
|
|
|
// ------------------------------------------------------------
|
|
// SPI
|
|
// ------------------------------------------------------------
|
|
io.spis <> sys.io.spis
|
|
|
|
// ------------------------------------------------------------
|
|
// GPIO
|
|
// ------------------------------------------------------------
|
|
io.gpio <> sys.io.gpio
|
|
|
|
// ------------------------------------------------------------
|
|
// MIG
|
|
// ------------------------------------------------------------
|
|
sys.io.xilinxvc707mig.sys_clk_p := io.sys_clk_p
|
|
sys.io.xilinxvc707mig.sys_clk_n := io.sys_clk_n
|
|
mig_clock := sys.io.xilinxvc707mig.ui_clk
|
|
mig_sys_reset := sys.io.xilinxvc707mig.ui_clk_sync_rst
|
|
mig_mmcm_locked := sys.io.xilinxvc707mig.mmcm_locked
|
|
sys.io.xilinxvc707mig.aresetn := mig_resetn
|
|
init_calib_complete := sys.io.xilinxvc707mig.init_calib_complete
|
|
sys.io.xilinxvc707mig.sys_rst := io.sys_reset
|
|
//the below bundle assignment is dangerous and relies on matching signal names
|
|
// io.xilinxvc707 is of type XilinxVC707MIGPads
|
|
// sys.io.xilinxvc707mig is of type XilinxVC707MIGIO
|
|
io.xilinxvc707mig <> sys.io.xilinxvc707mig
|
|
|
|
// ------------------------------------------------------------
|
|
// PCIe
|
|
// ------------------------------------------------------------
|
|
sys.io.xilinxvc707pcie.axi_aresetn := pcie_dat_resetn
|
|
pcie_dat_clock := sys.io.xilinxvc707pcie.axi_aclk_out
|
|
pcie_cfg_clock := sys.io.xilinxvc707pcie.axi_ctl_aclk_out
|
|
mmcm_lock_pcie := sys.io.xilinxvc707pcie.mmcm_lock
|
|
sys.io.xilinxvc707pcie.axi_ctl_aresetn := pcie_dat_resetn
|
|
sys.io.xilinxvc707pcie.REFCLK_rxp := io.pcie_refclk_p
|
|
sys.io.xilinxvc707pcie.REFCLK_rxn := io.pcie_refclk_n
|
|
//another dangerous bundle assignment which relies on matching signal names
|
|
// io.xilinxvc707pcie is of type XilinxVC707PCIeX1Pads
|
|
// sys.io.xilinxvc707pcie is of type XilinxVC707PCIeX1IO
|
|
io.xilinxvc707pcie <> sys.io.xilinxvc707pcie
|
|
|
|
// ------------------------------------------------------------
|
|
// Debug
|
|
// ------------------------------------------------------------
|
|
if (p(IncludeJtagDTM)) {
|
|
sys.io.jtag.get <> io.jtag.get
|
|
//Override TRST to reset this logic IFF the core is in reset.
|
|
// This will require 3 ticks of TCK before the debug logic
|
|
// comes out of reset, but JTAG needs 5 ticks anyway.
|
|
// This means that the "real" TRST is never actually used.
|
|
sys.io.jtag.get.TRST := ResetCatchAndSync(sys.io.jtag.get.TCK, top_reset)
|
|
}else{
|
|
// SimDTM; only for simulation use
|
|
sys.io.debug.get := io.debug.get
|
|
// test_mode_clk shouldn't be used for simulation
|
|
//sys.io.test_mode_clk := Bool(false).asClock
|
|
}
|
|
|
|
// ------------------------------------------------------------
|
|
// Misc outputs used in system.v
|
|
// ------------------------------------------------------------
|
|
io.core_clock := top_clock
|
|
io.core_reset := top_reset
|
|
|
|
}
|