aboutsummaryrefslogtreecommitdiff
path: root/VexRiscv/src/test/scala/vexriscv/MuraxSim.scala
diff options
context:
space:
mode:
Diffstat (limited to 'VexRiscv/src/test/scala/vexriscv/MuraxSim.scala')
-rw-r--r--VexRiscv/src/test/scala/vexriscv/MuraxSim.scala110
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)
+ }
+ }
+ }
+ }
+}