diff options
Diffstat (limited to 'VexRiscv/src/test/scala/vexriscv/MuraxSim.scala')
-rw-r--r-- | VexRiscv/src/test/scala/vexriscv/MuraxSim.scala | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/VexRiscv/src/test/scala/vexriscv/MuraxSim.scala b/VexRiscv/src/test/scala/vexriscv/MuraxSim.scala new file mode 100644 index 0000000..6a6a19c --- /dev/null +++ b/VexRiscv/src/test/scala/vexriscv/MuraxSim.scala @@ -0,0 +1,110 @@ +package vexriscv + +import java.awt +import java.awt.event.{ActionEvent, ActionListener, MouseEvent, MouseListener} + +import spinal.sim._ +import spinal.core._ +import spinal.core.sim._ +import vexriscv.demo.{Murax, MuraxConfig} +import javax.swing._ + +import spinal.lib.com.jtag.sim.JtagTcp +import spinal.lib.com.uart.sim.{UartDecoder, UartEncoder} +import vexriscv.test.{JLedArray, JSwitchArray} + +import scala.collection.mutable + + + +object MuraxSim { + def main(args: Array[String]): Unit = { +// def config = MuraxConfig.default.copy(onChipRamSize = 256 kB) + def config = MuraxConfig.default(withXip = false).copy(onChipRamSize = 4 kB, onChipRamHexFile = "src/main/ressource/hex/muraxDemo.hex") + val simSlowDown = false + SimConfig.allOptimisation.compile(new Murax(config)).doSimUntilVoid{dut => + val mainClkPeriod = (1e12/dut.config.coreFrequency.toDouble).toLong + val jtagClkPeriod = mainClkPeriod*4 + val uartBaudRate = 115200 + val uartBaudPeriod = (1e12/uartBaudRate).toLong + + val clockDomain = ClockDomain(dut.io.mainClk, dut.io.asyncReset) + clockDomain.forkStimulus(mainClkPeriod) +// clockDomain.forkSimSpeedPrinter(2) + + val tcpJtag = JtagTcp( + jtag = dut.io.jtag, + jtagClkPeriod = jtagClkPeriod + ) + + val uartTx = UartDecoder( + uartPin = dut.io.uart.txd, + baudPeriod = uartBaudPeriod + ) + + val uartRx = UartEncoder( + uartPin = dut.io.uart.rxd, + baudPeriod = uartBaudPeriod + ) + + if(config.xipConfig != null)dut.io.xip.data(1).read #= 0 + + val guiThread = fork{ + val guiToSim = mutable.Queue[Any]() + + var ledsValue = 0l + var switchValue : () => BigInt = null + val ledsFrame = new JFrame{ + setLayout(new BoxLayout(getContentPane, BoxLayout.Y_AXIS)) + + add(new JLedArray(8){ + override def getValue = ledsValue + }) + add{ + val switches = new JSwitchArray(8) + switchValue = switches.getValue + switches + } + + add(new JButton("Reset"){ + addActionListener(new ActionListener { + override def actionPerformed(actionEvent: ActionEvent): Unit = { + println("ASYNC RESET") + guiToSim.enqueue("asyncReset") + } + }) + setAlignmentX(awt.Component.CENTER_ALIGNMENT) + }) + setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) + pack() + setVisible(true) + + } + + //Fast refresh +// clockDomain.onSampling{ +// dut.io.gpioA.read #= (dut.io.gpioA.write.toLong & dut.io.gpioA.writeEnable.toLong) | (switchValue() << 8) +// } + + //Slow refresh + while(true){ + sleep(mainClkPeriod*50000) + + val dummy = if(guiToSim.nonEmpty){ + val request = guiToSim.dequeue() + if(request == "asyncReset"){ + dut.io.asyncReset #= true + sleep(mainClkPeriod*32) + dut.io.asyncReset #= false + } + } + + dut.io.gpioA.read #= (dut.io.gpioA.write.toLong & dut.io.gpioA.writeEnable.toLong) | (switchValue() << 8) + ledsValue = dut.io.gpioA.write.toLong + ledsFrame.repaint() + if(simSlowDown) Thread.sleep(400) + } + } + } + } +} |