Interrupts: Less Pessimistic Synchronization (#714)
* interrupts: Less pessimistic synchronization for the different interrupt types. There are some issues with the interrupt number assignments. * interrupts: Allow an option to NOT synchronize all the external interrupts coming into PLIC * interrupts: ExampleRocketChipTop uses PeripheryAsyncExtInterrupts. Realized 'abstract' doesn't do what I thought in Scala. * interrupts: use consistent async/periph/core ordering * interrupts: Properly condition on 0 External interrupts * interrupts: CLINT is also synchronous to periph clock
This commit is contained in:
@ -9,7 +9,7 @@ import rocketchip._
|
||||
|
||||
/** Example Top with Periphery (w/o coreplex) */
|
||||
abstract class ExampleTop(implicit p: Parameters) extends BaseTop
|
||||
with PeripheryExtInterrupts
|
||||
with PeripheryAsyncExtInterrupts
|
||||
with PeripheryMasterAXI4Mem
|
||||
with PeripheryMasterAXI4MMIO
|
||||
with PeripherySlaveAXI4 {
|
||||
|
@ -47,8 +47,7 @@ trait HasPeripheryParameters {
|
||||
}
|
||||
|
||||
/////
|
||||
|
||||
trait PeripheryExtInterrupts {
|
||||
abstract trait PeripheryExtInterrupts {
|
||||
this: HasTopLevelNetworks =>
|
||||
|
||||
private val device = new Device with DeviceInterrupts {
|
||||
@ -60,11 +59,6 @@ trait PeripheryExtInterrupts {
|
||||
val nExtInterrupts = p(NExtTopInterrupts)
|
||||
val extInterrupts = IntInternalInputNode(IntSourcePortSimple(num = nExtInterrupts, resources = device.int))
|
||||
|
||||
if (nExtInterrupts > 0) {
|
||||
val extInterruptXing = LazyModule(new IntXing)
|
||||
intBus.intnode := extInterruptXing.intnode
|
||||
extInterruptXing.intnode := extInterrupts
|
||||
}
|
||||
}
|
||||
|
||||
trait PeripheryExtInterruptsBundle {
|
||||
@ -82,8 +76,35 @@ trait PeripheryExtInterruptsModule {
|
||||
outer.extInterrupts.bundleIn.flatten.zipWithIndex.foreach { case(o, i) => o := io.interrupts(i) }
|
||||
}
|
||||
|
||||
// This trait should be used if the External Interrupts have NOT
|
||||
// already been synchronized
|
||||
// to the Periphery (PLIC) Clock.
|
||||
|
||||
trait PeripheryAsyncExtInterrupts extends PeripheryExtInterrupts {
|
||||
this: HasTopLevelNetworks =>
|
||||
|
||||
if (nExtInterrupts > 0) {
|
||||
val extInterruptXing = LazyModule(new IntXing)
|
||||
intBus.intnode := extInterruptXing.intnode
|
||||
extInterruptXing.intnode := extInterrupts
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// This trait can be used if the External Interrupts have already been synchronized
|
||||
// to the Periphery (PLIC) Clock.
|
||||
|
||||
trait PeripherySyncExtInterrupts extends PeripheryExtInterrupts {
|
||||
this: HasTopLevelNetworks =>
|
||||
|
||||
if (nExtInterrupts > 0) {
|
||||
intBus.intnode := extInterrupts
|
||||
}
|
||||
}
|
||||
|
||||
/////
|
||||
|
||||
|
||||
trait PeripheryMasterAXI4Mem {
|
||||
this: HasTopLevelNetworks =>
|
||||
val module: PeripheryMasterAXI4MemModule
|
||||
|
Reference in New Issue
Block a user