litex: get verilator simulation working and add sim target as example
This commit is contained in:
parent
6a0f85dc42
commit
a775672314
|
@ -1,3 +1,4 @@
|
||||||
|
graft litex/build/sim
|
||||||
graft litex/soc/software
|
graft litex/soc/software
|
||||||
graft litex/soc/cores/cpu/lm32/verilog
|
graft litex/soc/cores/cpu/lm32/verilog
|
||||||
graft litex/soc/cores/cpu/mor1kx/verilog
|
graft litex/soc/cores/cpu/mor1kx/verilog
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import importlib
|
||||||
|
|
||||||
|
from litex.gen import *
|
||||||
|
from litex.boards.platforms import sim
|
||||||
|
from litex.gen.genlib.io import CRG
|
||||||
|
|
||||||
|
from litex.soc.integration.soc_core import *
|
||||||
|
from litex.soc.integration.builder import *
|
||||||
|
from litex.soc.cores import uart
|
||||||
|
|
||||||
|
|
||||||
|
class BaseSoC(SoCCore):
|
||||||
|
def __init__(self, **kwargs):
|
||||||
|
platform = sim.Platform()
|
||||||
|
SoCCore.__init__(self, platform,
|
||||||
|
clk_freq=int((1/(platform.default_clk_period))*1000000000),
|
||||||
|
integrated_rom_size=0x8000,
|
||||||
|
integrated_main_ram_size=16*1024,
|
||||||
|
with_uart=False,
|
||||||
|
**kwargs)
|
||||||
|
self.submodules.crg = CRG(platform.request(platform.default_clk_name))
|
||||||
|
|
||||||
|
self.submodules.uart_phy = uart.RS232PHYModel(platform.request("serial"))
|
||||||
|
self.submodules.uart = uart.UART(self.uart_phy)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description="Generic LiteX SoC Simulation")
|
||||||
|
builder_args(parser)
|
||||||
|
soc_core_args(parser)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
soc = BaseSoC(**soc_core_argdict(args))
|
||||||
|
builder = Builder(soc, **builder_argdict(args))
|
||||||
|
builder.build()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -9,6 +9,9 @@ from litex.build import tools
|
||||||
from litex.build.generic_platform import *
|
from litex.build.generic_platform import *
|
||||||
|
|
||||||
|
|
||||||
|
sim_directory = os.path.abspath(os.path.dirname(__file__))
|
||||||
|
|
||||||
|
|
||||||
def _build_tb(platform, vns, serial, template):
|
def _build_tb(platform, vns, serial, template):
|
||||||
def io_name(resource, subsignal=None):
|
def io_name(resource, subsignal=None):
|
||||||
res = platform.lookup_request(resource)
|
res = platform.lookup_request(resource)
|
||||||
|
@ -81,7 +84,7 @@ def _build_tb(platform, vns, serial, template):
|
||||||
tools.write_to_file("dut_tb.cpp", content)
|
tools.write_to_file("dut_tb.cpp", content)
|
||||||
|
|
||||||
|
|
||||||
def _build_sim(platform, vns, build_name, include_paths, sim_path, serial, verbose):
|
def _build_sim(platform, vns, build_name, include_paths, serial, verbose):
|
||||||
include = ""
|
include = ""
|
||||||
for path in include_paths:
|
for path in include_paths:
|
||||||
include += "-I"+path+" "
|
include += "-I"+path+" "
|
||||||
|
@ -97,7 +100,7 @@ make -j -C obj_dir/ -f Vdut.mk Vdut
|
||||||
build_script_file = "build_" + build_name + ".sh"
|
build_script_file = "build_" + build_name + ".sh"
|
||||||
tools.write_to_file(build_script_file, build_script_contents, force_unix=True)
|
tools.write_to_file(build_script_file, build_script_contents, force_unix=True)
|
||||||
|
|
||||||
_build_tb(platform, vns, serial, os.path.join("..", sim_path, "dut_tb.cpp"))
|
_build_tb(platform, vns, serial, os.path.join(sim_directory, "dut_tb.cpp"))
|
||||||
if verbose:
|
if verbose:
|
||||||
r = subprocess.call(["bash", build_script_file])
|
r = subprocess.call(["bash", build_script_file])
|
||||||
else:
|
else:
|
||||||
|
@ -117,10 +120,8 @@ def _run_sim(build_name):
|
||||||
|
|
||||||
|
|
||||||
class SimVerilatorToolchain:
|
class SimVerilatorToolchain:
|
||||||
# XXX fir sim_path
|
|
||||||
def build(self, platform, fragment, build_dir="build", build_name="top",
|
def build(self, platform, fragment, build_dir="build", build_name="top",
|
||||||
sim_path="../migen/migen/build/sim/", serial="console",
|
serial="console", run=True, verbose=False):
|
||||||
run=True, verbose=False):
|
|
||||||
tools.mkdir_noerror(build_dir)
|
tools.mkdir_noerror(build_dir)
|
||||||
os.chdir(build_dir)
|
os.chdir(build_dir)
|
||||||
|
|
||||||
|
@ -138,7 +139,7 @@ class SimVerilatorToolchain:
|
||||||
if path not in include_paths:
|
if path not in include_paths:
|
||||||
include_paths.append(path)
|
include_paths.append(path)
|
||||||
include_paths += platform.verilog_include_paths
|
include_paths += platform.verilog_include_paths
|
||||||
_build_sim(platform, v_output.ns, build_name, include_paths, sim_path, serial, verbose)
|
_build_sim(platform, v_output.ns, build_name, include_paths, serial, verbose)
|
||||||
|
|
||||||
if run:
|
if run:
|
||||||
_run_sim(build_name)
|
_run_sim(build_name)
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
from litex.soc.cores.uart.core import UART, RS232PHY
|
from litex.soc.cores.uart.core import UART, RS232PHY, RS232PHYModel
|
||||||
|
|
|
@ -111,6 +111,22 @@ class RS232PHY(Module, AutoCSR):
|
||||||
self.sink, self.source = self.tx.sink, self.rx.source
|
self.sink, self.source = self.tx.sink, self.rx.source
|
||||||
|
|
||||||
|
|
||||||
|
class RS232PHYModel(Module):
|
||||||
|
def __init__(self, pads):
|
||||||
|
self.sink = Sink([("data", 8)])
|
||||||
|
self.source = Source([("data", 8)])
|
||||||
|
|
||||||
|
self.comb += [
|
||||||
|
pads.source_stb.eq(self.sink.stb),
|
||||||
|
pads.source_data.eq(self.sink.data),
|
||||||
|
self.sink.ack.eq(pads.source_ack),
|
||||||
|
|
||||||
|
self.source.stb.eq(pads.sink_stb),
|
||||||
|
self.source.data.eq(pads.sink_data),
|
||||||
|
pads.sink_ack.eq(self.source.ack)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def _get_uart_fifo(depth, sink_cd="sys", source_cd="sys"):
|
def _get_uart_fifo(depth, sink_cd="sys", source_cd="sys"):
|
||||||
if sink_cd != source_cd:
|
if sink_cd != source_cd:
|
||||||
fifo = AsyncFIFO([("data", 8)], depth)
|
fifo = AsyncFIFO([("data", 8)], depth)
|
||||||
|
|
Loading…
Reference in New Issue