1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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)
}
}
}
}
}
|