Got full linux / buildroot to boot in 4 cpu config
This commit is contained in:
parent
a1b6353d6b
commit
8e8b64feaa
|
@ -383,17 +383,32 @@ object VexRiscvSmpClusterTestInfrastructure{
|
||||||
|
|
||||||
val clint = new {
|
val clint = new {
|
||||||
val cmp = Array.fill(cpuCount)(0l)
|
val cmp = Array.fill(cpuCount)(0l)
|
||||||
|
var time = 0l
|
||||||
|
periodicaly(100){
|
||||||
|
time += 10
|
||||||
|
var timerInterrupts = 0l
|
||||||
|
for(i <- 0 until cpuCount){
|
||||||
|
if(cmp(i) < time) timerInterrupts |= 1l << i
|
||||||
|
}
|
||||||
|
dut.io.timerInterrupts #= timerInterrupts
|
||||||
|
}
|
||||||
|
|
||||||
|
// delayed(200*1000000){
|
||||||
|
// dut.io.softwareInterrupts #= 0xE
|
||||||
|
// enableSimWave()
|
||||||
|
// println("force IPI")
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
onWrite(PUTC)(data => print(data.toChar))
|
onWrite(PUTC)(data => print(data.toChar))
|
||||||
// onWrite(GETC)(data => System.in.read().toInt)
|
onRead(GETC)( if(System.in.available() != 0) System.in.read() else -1)
|
||||||
|
|
||||||
dut.io.softwareInterrupts #= 0
|
dut.io.softwareInterrupts #= 0
|
||||||
dut.io.timerInterrupts #= 0
|
dut.io.timerInterrupts #= 0
|
||||||
dut.io.externalInterrupts #= 0
|
dut.io.externalInterrupts #= 0
|
||||||
dut.io.externalSupervisorInterrupts #= 0
|
dut.io.externalSupervisorInterrupts #= 0
|
||||||
onRead(CLINT_TIME_ADDR)(simTime().toInt)
|
onRead(CLINT_TIME_ADDR)(clint.time.toInt)
|
||||||
onRead(CLINT_TIME_ADDR+4)((simTime() >> 32).toInt)
|
onRead(CLINT_TIME_ADDR+4)((clint.time >> 32).toInt)
|
||||||
for(hartId <- 0 until cpuCount){
|
for(hartId <- 0 until cpuCount){
|
||||||
onWrite(CLINT_IPI_ADDR + hartId*4) {data =>
|
onWrite(CLINT_IPI_ADDR + hartId*4) {data =>
|
||||||
val mask = 1l << hartId
|
val mask = 1l << hartId
|
||||||
|
@ -402,19 +417,11 @@ object VexRiscvSmpClusterTestInfrastructure{
|
||||||
}
|
}
|
||||||
onRead(CLINT_CMP_ADDR + hartId*8)(clint.cmp(hartId).toInt)
|
onRead(CLINT_CMP_ADDR + hartId*8)(clint.cmp(hartId).toInt)
|
||||||
onRead(CLINT_CMP_ADDR + hartId*8+4)((clint.cmp(hartId) >> 32).toInt)
|
onRead(CLINT_CMP_ADDR + hartId*8+4)((clint.cmp(hartId) >> 32).toInt)
|
||||||
onWrite(CLINT_CMP_ADDR + hartId*8)(data => clint.cmp(hartId) = (clint.cmp(hartId) & 0xFFFFFFFF00000000l) | data)
|
onWrite(CLINT_CMP_ADDR + hartId*8){data => clint.cmp(hartId) = (clint.cmp(hartId) & 0xFFFFFFFF00000000l) | data}
|
||||||
onWrite(CLINT_CMP_ADDR + hartId*8+4)(data => (clint.cmp(hartId) & 0x00000000FFFFFFFFl) | (data << 32))
|
onWrite(CLINT_CMP_ADDR + hartId*8+4){data => clint.cmp(hartId) = (clint.cmp(hartId) & 0x00000000FFFFFFFFl) | (data.toLong << 32)}
|
||||||
}
|
}
|
||||||
|
|
||||||
var time = 0l
|
|
||||||
periodicaly(100){
|
|
||||||
time += 10
|
|
||||||
var timerInterrupts = 0l
|
|
||||||
for(i <- 0 until cpuCount){
|
|
||||||
if(clint.cmp(i) < time) timerInterrupts |= 1l << i
|
|
||||||
}
|
|
||||||
dut.io.timerInterrupts #= timerInterrupts
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
dut.io.iMems.foreach(ram.addPort(_,0,dut.clockDomain,true, withStall))
|
dut.io.iMems.foreach(ram.addPort(_,0,dut.clockDomain,true, withStall))
|
||||||
|
@ -423,7 +430,6 @@ object VexRiscvSmpClusterTestInfrastructure{
|
||||||
}
|
}
|
||||||
def init(dut : VexRiscvSmpCluster): Unit ={
|
def init(dut : VexRiscvSmpCluster): Unit ={
|
||||||
import spinal.core.sim._
|
import spinal.core.sim._
|
||||||
// dut.clockDomain.forkSimSpeedPrinter(1.0)
|
|
||||||
dut.clockDomain.forkStimulus(10)
|
dut.clockDomain.forkStimulus(10)
|
||||||
dut.debugClockDomain.forkStimulus(10)
|
dut.debugClockDomain.forkStimulus(10)
|
||||||
JtagTcp(dut.io.jtag, 100)
|
JtagTcp(dut.io.jtag, 100)
|
||||||
|
@ -465,10 +471,41 @@ object VexRiscvSmpClusterOpenSbi extends App{
|
||||||
val cpuCount = 4
|
val cpuCount = 4
|
||||||
val withStall = false
|
val withStall = false
|
||||||
|
|
||||||
simConfig.compile(VexRiscvSmpClusterGen.vexRiscvCluster(cpuCount)).doSimUntilVoid(seed = 42){dut =>
|
simConfig.workspaceName("rawr_4c").compile(VexRiscvSmpClusterGen.vexRiscvCluster(cpuCount)).doSimUntilVoid(seed = 42){dut =>
|
||||||
|
// dut.clockDomain.forkSimSpeedPrinter(1.0)
|
||||||
VexRiscvSmpClusterTestInfrastructure.init(dut)
|
VexRiscvSmpClusterTestInfrastructure.init(dut)
|
||||||
val ram = VexRiscvSmpClusterTestInfrastructure.ram(dut)
|
val ram = VexRiscvSmpClusterTestInfrastructure.ram(dut)
|
||||||
ram.memory.loadBin(0x80000000l, "../opensbi/build/platform/spinal/vexriscv/sim/smp/firmware/fw_payload.bin")
|
// ram.memory.loadBin(0x80000000l, "../opensbi/build/platform/spinal/vexriscv/sim/smp/firmware/fw_payload.bin")
|
||||||
// ram.memory.loadBin(0x80000000l, "../opensbi/build/platform/spinal/vexriscv/sim/smp/firmware/fw_jump.bin")
|
ram.memory.loadBin(0x80000000l, "../opensbi/build/platform/spinal/vexriscv/sim/smp/firmware/fw_jump.bin")
|
||||||
|
ram.memory.loadBin(0xC0000000l, "../buildroot/output/images/Image")
|
||||||
|
ram.memory.loadBin(0xC1000000l, "../buildroot/output/images/dtb")
|
||||||
|
ram.memory.loadBin(0xC2000000l, "../buildroot/output/images/rootfs.cpio")
|
||||||
|
|
||||||
|
// fork{
|
||||||
|
// disableSimWave()
|
||||||
|
// val atMs = 130
|
||||||
|
// val durationMs = 15
|
||||||
|
// sleep(atMs*1000000)
|
||||||
|
// enableSimWave()
|
||||||
|
// println("** enableSimWave **")
|
||||||
|
// sleep(durationMs*1000000)
|
||||||
|
// println("** disableSimWave **")
|
||||||
|
// while(true) {
|
||||||
|
// disableSimWave()
|
||||||
|
// sleep(100000 * 10)
|
||||||
|
// enableSimWave()
|
||||||
|
// sleep( 100 * 10)
|
||||||
|
// }
|
||||||
|
//// simSuccess()
|
||||||
|
// }
|
||||||
|
|
||||||
|
fork{
|
||||||
|
while(true) {
|
||||||
|
disableSimWave()
|
||||||
|
sleep(100000 * 10)
|
||||||
|
enableSimWave()
|
||||||
|
sleep( 100 * 10)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue