This commit is contained in:
Charles Papon 2017-06-15 11:16:11 +02:00
parent f8678698fc
commit 835dd4ad50
1 changed files with 142 additions and 106 deletions

View File

@ -60,11 +60,12 @@ class Briey(config: BrieyConfig) extends Component{
val sdram = master(SdramInterface(sdramLayout)) val sdram = master(SdramInterface(sdramLayout))
//Peripherals IO //Peripherals IO
val gpioA = master(TriStateArray(32 bits)) val gpioA = master(TriStateArray(32 bits))
val gpioB = master(TriStateArray(32 bits)) val gpioB = master(TriStateArray(32 bits))
val uart = master(Uart()) val uart = master(Uart())
val vga = master(Vga(vgaRgbConfig)) val vga = master(Vga(vgaRgbConfig))
val timerExternal = in(PinsecTimerCtrlExternal()) val timerExternal = in(PinsecTimerCtrlExternal())
val coreInterrupt = in Bool
} }
val resetCtrlClockDomain = ClockDomain( val resetCtrlClockDomain = ClockDomain(
@ -121,107 +122,6 @@ class Briey(config: BrieyConfig) extends Component{
) )
val axi = new ClockingArea(axiClockDomain) { val axi = new ClockingArea(axiClockDomain) {
val core = new ClockingArea(coreClockDomain){
val configLight = VexRiscvConfig(
plugins = List(
new PcManagerSimplePlugin(0x00000000l, false),
// new IBusSimplePlugin(
// interfaceKeepData = false,
// catchAccessFault = false
// ),
new IBusCachedPlugin(
config = InstructionCacheConfig(
cacheSize = 4096,
bytePerLine =32,
wayCount = 1,
wrappedMemAccess = true,
addressWidth = 32,
cpuDataWidth = 32,
memDataWidth = 32,
catchIllegalAccess = false,
catchAccessFault = false,
catchMemoryTranslationMiss = false,
asyncTagMemory = false,
twoStageLogic = true
)
// askMemoryTranslation = true,
// memoryTranslatorPortConfig = MemoryTranslatorPortConfig(
// portTlbSize = 4
// )
),
// new DBusSimplePlugin(
// catchAddressMisaligned = false,
// catchAccessFault = false
// ),
new DBusCachedPlugin(
config = new DataCacheConfig(
cacheSize = 4096,
bytePerLine = 32,
wayCount = 1,
addressWidth = 32,
cpuDataWidth = 32,
memDataWidth = 32,
catchAccessError = false,
catchIllegal = false,
catchUnaligned = false,
catchMemoryTranslationMiss = false
),
memoryTranslatorPortConfig = null
// memoryTranslatorPortConfig = MemoryTranslatorPortConfig(
// portTlbSize = 6
// )
),
new StaticMemoryTranslatorPlugin(
ioRange = _(31 downto 28) === 0xF
),
new DecoderSimplePlugin(
catchIllegalInstruction = false
),
new RegFilePlugin(
regFileReadyKind = Plugin.SYNC,
zeroBoot = false
),
new IntAluPlugin,
new SrcPlugin(
separatedAddSub = false
),
new LightShifterPlugin,
new HazardSimplePlugin(
bypassExecute = false,
bypassMemory = false,
bypassWriteBack = false,
bypassWriteBackBuffer = false,
pessimisticUseSrc = false,
pessimisticWriteRegFile = false,
pessimisticAddressMatch = false
),
new DebugPlugin(axiClockDomain),
new BranchPlugin(
earlyBranch = false,
catchAddressMisaligned = false,
prediction = NONE
),
new YamlPlugin("cpu0.yaml")
)
)
val cpu = new VexRiscv(configLight)
var iBus : Axi4Bus = null
var dBus : Axi4Bus = null
var debugBus : Apb3 = null
for(plugin <- configLight.plugins) plugin match{
case plugin : IBusSimplePlugin => iBus = plugin.iBus.toAxi4ReadOnly()
case plugin : IBusCachedPlugin => iBus = plugin.iBus.toAxi4ReadOnly()
case plugin : DBusSimplePlugin => dBus = plugin.dBus.toAxi4Shared()
case plugin : DBusCachedPlugin => dBus = plugin.dBus.toAxi4Shared(true)
case plugin : DebugPlugin => {
resetCtrl.coreResetUnbuffered setWhen(plugin.io.resetOut)
debugBus = plugin.io.bus.toApb3()
}
case _ =>
}
}
val ram = Axi4SharedOnChipRam( val ram = Axi4SharedOnChipRam(
dataWidth = 32, dataWidth = 32,
byteCount = onChipRamSize, byteCount = onChipRamSize,
@ -282,6 +182,136 @@ class Briey(config: BrieyConfig) extends Component{
) )
val vgaCtrl = Axi4VgaCtrl(vgaCtrlConfig) val vgaCtrl = Axi4VgaCtrl(vgaCtrlConfig)
val core = new ClockingArea(coreClockDomain){
val configLight = VexRiscvConfig(
plugins = List(
new PcManagerSimplePlugin(0x00000000l, false),
// new IBusSimplePlugin(
// interfaceKeepData = false,
// catchAccessFault = false
// ),
new IBusCachedPlugin(
config = InstructionCacheConfig(
cacheSize = 4096,
bytePerLine =32,
wayCount = 1,
wrappedMemAccess = true,
addressWidth = 32,
cpuDataWidth = 32,
memDataWidth = 32,
catchIllegalAccess = false,
catchAccessFault = false,
catchMemoryTranslationMiss = false,
asyncTagMemory = false,
twoStageLogic = true
)
// askMemoryTranslation = true,
// memoryTranslatorPortConfig = MemoryTranslatorPortConfig(
// portTlbSize = 4
// )
),
// new DBusSimplePlugin(
// catchAddressMisaligned = false,
// catchAccessFault = false
// ),
new DBusCachedPlugin(
config = new DataCacheConfig(
cacheSize = 4096,
bytePerLine = 32,
wayCount = 1,
addressWidth = 32,
cpuDataWidth = 32,
memDataWidth = 32,
catchAccessError = false,
catchIllegal = false,
catchUnaligned = false,
catchMemoryTranslationMiss = false
),
memoryTranslatorPortConfig = null
// memoryTranslatorPortConfig = MemoryTranslatorPortConfig(
// portTlbSize = 6
// )
),
new StaticMemoryTranslatorPlugin(
ioRange = _(31 downto 28) === 0xF
),
new DecoderSimplePlugin(
catchIllegalInstruction = false
),
new RegFilePlugin(
regFileReadyKind = Plugin.SYNC,
zeroBoot = false
),
new IntAluPlugin,
new SrcPlugin(
separatedAddSub = false
),
new LightShifterPlugin,
new HazardSimplePlugin(
bypassExecute = true,
bypassMemory = true,
bypassWriteBack = true,
bypassWriteBackBuffer = true,
pessimisticUseSrc = false,
pessimisticWriteRegFile = false,
pessimisticAddressMatch = false
),
new DebugPlugin(axiClockDomain),
new BranchPlugin(
earlyBranch = false,
catchAddressMisaligned = false,
prediction = STATIC
),
new CsrPlugin(
config = MachineCsrConfig(
catchIllegalAccess = false,
mvendorid = null,
marchid = null,
mimpid = null,
mhartid = null,
misaExtensionsInit = 66,
misaAccess = CsrAccess.NONE,
mtvecAccess = CsrAccess.NONE,
mtvecInit = 0x00000020l,
mepcAccess = CsrAccess.READ_WRITE,
mscratchGen = false,
mcauseAccess = CsrAccess.READ_ONLY,
mbadaddrAccess = CsrAccess.READ_ONLY,
mcycleAccess = CsrAccess.NONE,
minstretAccess = CsrAccess.NONE,
ecallGen = false,
wfiGen = false,
ucycleAccess = CsrAccess.NONE
)
),
new YamlPlugin("cpu0.yaml")
)
)
val cpu = new VexRiscv(configLight)
var iBus : Axi4ReadOnly = null
var dBus : Axi4Shared = null
var debugBus : Apb3 = null
for(plugin <- configLight.plugins) plugin match{
case plugin : IBusSimplePlugin => iBus = plugin.iBus.toAxi4ReadOnly()
case plugin : IBusCachedPlugin => iBus = plugin.iBus.toAxi4ReadOnly()
case plugin : DBusSimplePlugin => dBus = plugin.dBus.toAxi4Shared()
case plugin : DBusCachedPlugin => dBus = plugin.dBus.toAxi4Shared(true)
case plugin : CsrPlugin => {
plugin.externalInterrupt := BufferCC(io.coreInterrupt)
plugin.timerInterrupt := timerCtrl.io.interrupt
}
case plugin : DebugPlugin => {
resetCtrl.coreResetUnbuffered setWhen(plugin.io.resetOut)
debugBus = plugin.io.bus.toApb3()
}
case _ =>
}
}
val axiCrossbar = Axi4CrossbarFactory() val axiCrossbar = Axi4CrossbarFactory()
axiCrossbar.addSlaves( axiCrossbar.addSlaves(
@ -294,7 +324,7 @@ class Briey(config: BrieyConfig) extends Component{
core.iBus -> List(ram.io.axi, sdramCtrl.io.axi), core.iBus -> List(ram.io.axi, sdramCtrl.io.axi),
core.dBus -> List(ram.io.axi, sdramCtrl.io.axi, apbBridge.io.axi), core.dBus -> List(ram.io.axi, sdramCtrl.io.axi, apbBridge.io.axi),
jtagCtrl.io.axi -> List(ram.io.axi, sdramCtrl.io.axi, apbBridge.io.axi), jtagCtrl.io.axi -> List(ram.io.axi, sdramCtrl.io.axi, apbBridge.io.axi),
vgaCtrl.io.axi -> List( sdramCtrl.io.axi) vgaCtrl.io.axi -> List( sdramCtrl.io.axi)
) )
@ -324,6 +354,12 @@ class Briey(config: BrieyConfig) extends Component{
ctrl.readRsp << crossbar.readRsp ctrl.readRsp << crossbar.readRsp
}) })
axiCrossbar.addPipelining(core.dBus)((cpu,crossbar) => {
cpu.sharedCmd >> crossbar.sharedCmd
cpu.writeData >> crossbar.writeData
cpu.writeRsp << crossbar.writeRsp
cpu.readRsp <-< crossbar.readRsp
})
axiCrossbar.build() axiCrossbar.build()