6 from migen
import (Signal
, FSM
, If
, Display
, Finish
, NextValue
, NextState
)
8 from litex
.build
.generic_platform
import Pins
, Subsignal
9 from litex
.build
.sim
import SimPlatform
10 from litex
.build
.io
import CRG
11 from litex
.build
.sim
.config
import SimConfig
13 from litex
.soc
.integration
.soc
import SoCRegion
14 from litex
.soc
.integration
.soc_core
import SoCCore
15 from litex
.soc
.integration
.builder
import Builder
17 from litex
.tools
.litex_sim
import Platform
19 from libresoc
import LibreSoC
20 from microwatt
import Microwatt
22 # LibreSoCSim -----------------------------------------------------------------
24 class LibreSoCSim(SoCCore
):
25 def __init__(self
, cpu
="libresoc", debug
=False):
26 assert cpu
in ["libresoc", "microwatt"]
28 sys_clk_freq
= int(1e6
)
30 # SoCCore -------------------------------------------------------------
31 SoCCore
.__init
__(self
, platform
, clk_freq
=sys_clk_freq
,
32 cpu_type
= "microwatt",
33 cpu_cls
= LibreSoC
if cpu
== "libresoc" \
36 integrated_rom_size
= 0x10000,
37 integrated_main_ram_size
= 0x10000000) # 256MB
38 self
.platform
.name
= "sim"
40 # CRG -----------------------------------------------------------------
41 self
.submodules
.crg
= CRG(platform
.request("sys_clk"))
43 # Debug ---------------------------------------------------------------
47 # setup running of DMI FSM
60 # increment counter, Stop after 100000 cycles
62 self
.sync
+= uptime
.eq(uptime
+ 1)
63 self
.sync
+= If(uptime
== 100000, Finish())
66 self
.submodules
+= dmifsm
71 (self
.cpu
.dmi_addr
.eq(dmi_addr
), # DMI Addr
72 self
.cpu
.dmi_din
.eq(dmi_din
), # DMI in
73 self
.cpu
.dmi_req
.eq(1), # DMI request
74 self
.cpu
.dmi_wr
.eq(1), # DMI write
81 If(dmi_req
& ~dmi_wen
,
82 (self
.cpu
.dmi_addr
.eq(dmi_addr
), # DMI Addr
83 self
.cpu
.dmi_req
.eq(1), # DMI request
84 self
.cpu
.dmi_wr
.eq(0), # DMI read
87 NextValue(dbg_addr
, dmi_addr
),
88 NextValue(dbg_dout
, self
.cpu
.dmi_dout
),
89 NextValue(dbg_msg
, 1),
97 (NextValue(dmi_req
, 0),
98 NextValue(dmi_addr
, 0),
99 NextValue(dmi_din
, 0),
100 NextValue(dmi_wen
, 0),
101 NextState("START"), # back to start on next cycle
106 self
.sync
+= If(dbg_msg
,
107 (Display("[%06x] dbg: %1x, %016x", uptime
, dbg_addr
, dbg_dout
),
113 self
.sync
+= If(uptime
== 0,
114 (dmi_addr
.eq(0), # CTRL
115 dmi_din
.eq(1<<0), # STOP
121 # loop every 1<<N cycles
125 self
.sync
+= If(uptime
[0:cyclewid
] == 4,
126 (dmi_addr
.eq(0), # CTRL
127 dmi_din
.eq(1<<3), # STEP
134 self
.sync
+= If(uptime
[0:cyclewid
] == 8,
135 (dmi_addr
.eq(0b10), # NIA
142 self
.sync
+= If(self
.cpu
.ibus
.stb
& self
.cpu
.ibus
.ack
&
144 Display("[%06x] iadr: %8x, s %01x w %016x",
152 self
.sync
+= If(self
.cpu
.ibus
.stb
& self
.cpu
.ibus
.ack
&
154 Display("[%06x] iadr: %8x, s %01x r %016x",
162 # monitor bbus read/write
163 self
.sync
+= If(self
.cpu
.dbus
.stb
& self
.cpu
.dbus
.ack
,
164 Display("[%06x] dadr: %8x, we %d s %01x w %016x r: %016x",
174 # Build -----------------------------------------------------------------------
177 parser
= argparse
.ArgumentParser(description
="LiteX LibreSoC CPU Sim")
178 parser
.add_argument("--cpu", default
="libresoc",
179 help="CPU to use: libresoc (default) or microwatt")
180 parser
.add_argument("--debug", action
="store_true",
181 help="Enable debug traces")
182 parser
.add_argument("--trace", action
="store_true",
183 help="Enable tracing")
184 parser
.add_argument("--trace-start", default
=0,
185 help="Cycle to start FST tracing")
186 parser
.add_argument("--trace-end", default
=-1,
187 help="Cycle to end FST tracing")
188 args
= parser
.parse_args()
190 sim_config
= SimConfig(default_clk
="sys_clk")
191 sim_config
.add_module("serial2console", "serial")
194 soc
= LibreSoCSim(cpu
=args
.cpu
, debug
=args
.debug
)
195 builder
= Builder(soc
,compile_gateware
= i
!=0)
196 builder
.build(sim_config
=sim_config
,
199 trace_start
= int(args
.trace_start
),
200 trace_end
= int(args
.trace_end
),
204 if __name__
== "__main__":