mirror of
https://github.com/enjoy-digital/litex.git
synced 2025-01-04 09:52:26 -05:00
add stream, fix CPUs and more imports. simple target boots on ppro.
This commit is contained in:
parent
75ef2f9004
commit
da425d1bcb
12 changed files with 159 additions and 25 deletions
22
make.py
22
make.py
|
@ -7,12 +7,12 @@ import subprocess
|
||||||
import struct
|
import struct
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
from mibuild.tools import write_to_file
|
from migen.build.tools import write_to_file
|
||||||
from migen.util.misc import autotype
|
from migen.util.misc import autotype
|
||||||
from migen.fhdl import simplify
|
from migen.fhdl import simplify
|
||||||
|
|
||||||
from misoc.soc import cpuif
|
from misoc.integration import cpu_interface
|
||||||
from misoc.mem.sdram.phy import initsequence
|
from misoc.integration import sdram_init
|
||||||
|
|
||||||
from misoc_import import misoc_import
|
from misoc_import import misoc_import
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ if __name__ == "__main__":
|
||||||
raise ValueError("Target has no default platform, specify a platform with -p your_platform")
|
raise ValueError("Target has no default platform, specify a platform with -p your_platform")
|
||||||
else:
|
else:
|
||||||
platform_name = args.platform
|
platform_name = args.platform
|
||||||
platform_module = misoc_import("mibuild.platforms", external_platform, platform_name)
|
platform_module = misoc_import("migen.build.platforms", external_platform, platform_name)
|
||||||
platform_kwargs = dict((k, autotype(v)) for k, v in args.platform_option)
|
platform_kwargs = dict((k, autotype(v)) for k, v in args.platform_option)
|
||||||
platform = platform_module.Platform(**platform_kwargs)
|
platform = platform_module.Platform(**platform_kwargs)
|
||||||
if args.external:
|
if args.external:
|
||||||
|
@ -155,25 +155,25 @@ CPU type: {}
|
||||||
""".format(platform_name, args.target, top_class.__name__, soc.cpu_type)
|
""".format(platform_name, args.target, top_class.__name__, soc.cpu_type)
|
||||||
genhdir = os.path.join("software", "include", "generated")
|
genhdir = os.path.join("software", "include", "generated")
|
||||||
if soc.cpu_type != "none":
|
if soc.cpu_type != "none":
|
||||||
cpu_mak = cpuif.get_cpu_mak(soc.cpu_type)
|
cpu_mak = cpu_interface.get_cpu_mak(soc.cpu_type)
|
||||||
write_to_file(os.path.join(genhdir, "cpu.mak"), cpu_mak)
|
write_to_file(os.path.join(genhdir, "cpu.mak"), cpu_mak)
|
||||||
linker_output_format = cpuif.get_linker_output_format(soc.cpu_type)
|
linker_output_format = cpu_interface.get_linker_output_format(soc.cpu_type)
|
||||||
write_to_file(os.path.join(genhdir, "output_format.ld"), linker_output_format)
|
write_to_file(os.path.join(genhdir, "output_format.ld"), linker_output_format)
|
||||||
|
|
||||||
linker_regions = cpuif.get_linker_regions(memory_regions)
|
linker_regions = cpu_interface.get_linker_regions(memory_regions)
|
||||||
write_to_file(os.path.join(genhdir, "regions.ld"), boilerplate + linker_regions)
|
write_to_file(os.path.join(genhdir, "regions.ld"), boilerplate + linker_regions)
|
||||||
|
|
||||||
for sdram_phy in ["sdrphy", "ddrphy"]:
|
for sdram_phy in ["sdrphy", "ddrphy"]:
|
||||||
if hasattr(soc, sdram_phy):
|
if hasattr(soc, sdram_phy):
|
||||||
sdram_phy_header = initsequence.get_sdram_phy_header(getattr(soc, sdram_phy).settings)
|
sdram_phy_header = sdram_init.get_sdram_phy_header(getattr(soc, sdram_phy).settings)
|
||||||
write_to_file(os.path.join(genhdir, "sdram_phy.h"), boilerplate + sdram_phy_header)
|
write_to_file(os.path.join(genhdir, "sdram_phy.h"), boilerplate + sdram_phy_header)
|
||||||
mem_header = cpuif.get_mem_header(memory_regions, getattr(soc, "flash_boot_address", None))
|
mem_header = cpu_interface.get_mem_header(memory_regions, getattr(soc, "flash_boot_address", None))
|
||||||
write_to_file(os.path.join(genhdir, "mem.h"), boilerplate + mem_header)
|
write_to_file(os.path.join(genhdir, "mem.h"), boilerplate + mem_header)
|
||||||
csr_header = cpuif.get_csr_header(csr_regions, soc.get_constants())
|
csr_header = cpu_interface.get_csr_header(csr_regions, soc.get_constants())
|
||||||
write_to_file(os.path.join(genhdir, "csr.h"), boilerplate + csr_header)
|
write_to_file(os.path.join(genhdir, "csr.h"), boilerplate + csr_header)
|
||||||
|
|
||||||
if actions["build-csr-csv"]:
|
if actions["build-csr-csv"]:
|
||||||
csr_csv = cpuif.get_csr_csv(csr_regions)
|
csr_csv = cpu_interface.get_csr_csv(csr_regions)
|
||||||
write_to_file(args.csr_csv, csr_csv)
|
write_to_file(args.csr_csv, csr_csv)
|
||||||
|
|
||||||
if actions["build-bios"]:
|
if actions["build-bios"]:
|
||||||
|
|
1
misoc/cores/lm32/__init__.py
Normal file
1
misoc/cores/lm32/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
from misoc.cores.lm32.core import LM32
|
|
@ -1,7 +1,8 @@
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from migen import *
|
from migen import *
|
||||||
from migen.bus import wishbone
|
|
||||||
|
from misoc.interconnect import wishbone
|
||||||
|
|
||||||
|
|
||||||
class LM32(Module):
|
class LM32(Module):
|
||||||
|
@ -54,10 +55,12 @@ class LM32(Module):
|
||||||
]
|
]
|
||||||
|
|
||||||
# add Verilog sources
|
# add Verilog sources
|
||||||
platform.add_sources(os.path.join("extcores", "lm32", "submodule", "rtl"),
|
vdir = os.path.join(
|
||||||
|
os.path.abspath(os.path.dirname(__file__)), "verilog")
|
||||||
|
platform.add_sources(os.path.join(vdir, "submodule", "rtl"),
|
||||||
"lm32_cpu.v", "lm32_instruction_unit.v", "lm32_decoder.v",
|
"lm32_cpu.v", "lm32_instruction_unit.v", "lm32_decoder.v",
|
||||||
"lm32_load_store_unit.v", "lm32_adder.v", "lm32_addsub.v", "lm32_logic_op.v",
|
"lm32_load_store_unit.v", "lm32_adder.v", "lm32_addsub.v", "lm32_logic_op.v",
|
||||||
"lm32_shifter.v", "lm32_multiplier.v", "lm32_mc_arithmetic.v",
|
"lm32_shifter.v", "lm32_multiplier.v", "lm32_mc_arithmetic.v",
|
||||||
"lm32_interrupt.v", "lm32_ram.v", "lm32_dp_ram.v", "lm32_icache.v",
|
"lm32_interrupt.v", "lm32_ram.v", "lm32_dp_ram.v", "lm32_icache.v",
|
||||||
"lm32_dcache.v", "lm32_debug.v", "lm32_itlb.v", "lm32_dtlb.v")
|
"lm32_dcache.v", "lm32_debug.v", "lm32_itlb.v", "lm32_dtlb.v")
|
||||||
platform.add_verilog_include_path(os.path.join("extcores", "lm32"))
|
platform.add_verilog_include_path(vdir)
|
||||||
|
|
1
misoc/cores/lm32/verilog/submodule
Submodule
1
misoc/cores/lm32/verilog/submodule
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 84b3e3ca0ad9535acaef201c1482342871358b08
|
|
@ -0,0 +1 @@
|
||||||
|
from misoc.cores.mor1kx.core import MOR1KX
|
|
@ -1,7 +1,8 @@
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from migen import *
|
from migen import *
|
||||||
from migen.bus import wishbone
|
|
||||||
|
from misoc.interconnect import wishbone
|
||||||
|
|
||||||
|
|
||||||
class MOR1KX(Module):
|
class MOR1KX(Module):
|
||||||
|
@ -76,5 +77,7 @@ class MOR1KX(Module):
|
||||||
]
|
]
|
||||||
|
|
||||||
# add Verilog sources
|
# add Verilog sources
|
||||||
platform.add_source_dir(os.path.join("extcores", "mor1kx", "submodule",
|
vdir = os.path.join(
|
||||||
"rtl", "verilog"))
|
os.path.abspath(os.path.dirname(__file__)),
|
||||||
|
"verilog", "rtl", "verilog")
|
||||||
|
platform.add_source_dir(vdir)
|
||||||
|
|
1
misoc/cores/mor1kx/verilog
Submodule
1
misoc/cores/mor1kx/verilog
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit fb519d011ae2524e3681f07b206df0a6c03f82a8
|
|
@ -1,10 +1,10 @@
|
||||||
from migen import *
|
from migen import *
|
||||||
from migen.genlib.record import Record
|
from migen.genlib.record import Record
|
||||||
|
from migen.genlib.cdc import MultiReg
|
||||||
|
|
||||||
from misoc.interconnect.csr import *
|
from misoc.interconnect.csr import *
|
||||||
from misoc.interconnect.csr_eventmanager import *
|
from misoc.interconnect.csr_eventmanager import *
|
||||||
# TODO: from migen.actorlib.fifo import SyncFIFO, AsyncFIFO
|
from misoc.interconnect.stream import Source, Sink, SyncFIFO, AsyncFIFO
|
||||||
# TODO: remove dataflow?
|
|
||||||
|
|
||||||
|
|
||||||
class RS232PHYRX(Module):
|
class RS232PHYRX(Module):
|
||||||
|
|
|
@ -94,7 +94,8 @@ class SoCCore(Module):
|
||||||
self.register_mem("main_ram", self.mem_map["main_ram"], self.main_ram.bus, integrated_main_ram_size)
|
self.register_mem("main_ram", self.mem_map["main_ram"], self.main_ram.bus, integrated_main_ram_size)
|
||||||
|
|
||||||
if with_csr:
|
if with_csr:
|
||||||
self.submodules.wishbone2csr = wishbone2csr.WB2CSR(bus_csr=csr.Interface(csr_data_width, csr_address_width))
|
self.submodules.wishbone2csr = wishbone2csr.WB2CSR(
|
||||||
|
bus_csr=csr_bus.Interface(csr_data_width, csr_address_width))
|
||||||
self.register_mem("csr", self.mem_map["csr"], self.wishbone2csr.wishbone)
|
self.register_mem("csr", self.mem_map["csr"], self.wishbone2csr.wishbone)
|
||||||
|
|
||||||
if with_uart:
|
if with_uart:
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
from migen import *
|
from migen import *
|
||||||
from migen.genlib.record import *
|
from migen.genlib.record import *
|
||||||
from migen.genlib.misc import chooser
|
from migen.genlib.misc import chooser
|
||||||
|
from migen.util.misc import xdir
|
||||||
|
|
||||||
from misoc.interconnect import csr
|
from misoc.interconnect import csr
|
||||||
from misoc.interconnect.csr import CSRStorage
|
from misoc.interconnect.csr import CSRStorage
|
||||||
|
@ -108,7 +109,7 @@ class CSRBank(csr.GenericBank):
|
||||||
|
|
||||||
###
|
###
|
||||||
|
|
||||||
GenericBank.__init__(self, description, flen(self.bus.dat_w))
|
csr.GenericBank.__init__(self, description, flen(self.bus.dat_w))
|
||||||
|
|
||||||
sel = Signal()
|
sel = Signal()
|
||||||
self.comb += sel.eq(self.bus.adr[9:] == address)
|
self.comb += sel.eq(self.bus.adr[9:] == address)
|
||||||
|
@ -154,7 +155,7 @@ class CSRBankArray(Module):
|
||||||
mapaddr = self.address_map(name, memory)
|
mapaddr = self.address_map(name, memory)
|
||||||
if mapaddr is None:
|
if mapaddr is None:
|
||||||
continue
|
continue
|
||||||
sram_bus = csr.Interface(*ifargs, **ifkwargs)
|
sram_bus = Interface(*ifargs, **ifkwargs)
|
||||||
mmap = csr.SRAM(memory, mapaddr, bus=sram_bus)
|
mmap = csr.SRAM(memory, mapaddr, bus=sram_bus)
|
||||||
self.submodules += mmap
|
self.submodules += mmap
|
||||||
csrs += mmap.get_csrs()
|
csrs += mmap.get_csrs()
|
||||||
|
@ -163,8 +164,8 @@ class CSRBankArray(Module):
|
||||||
mapaddr = self.address_map(name, None)
|
mapaddr = self.address_map(name, None)
|
||||||
if mapaddr is None:
|
if mapaddr is None:
|
||||||
continue
|
continue
|
||||||
bank_bus = csr.Interface(*ifargs, **ifkwargs)
|
bank_bus = Interface(*ifargs, **ifkwargs)
|
||||||
rmap = Bank(csrs, mapaddr, bus=bank_bus)
|
rmap = CSRBank(csrs, mapaddr, bus=bank_bus)
|
||||||
self.submodules += rmap
|
self.submodules += rmap
|
||||||
self.banks.append((name, csrs, mapaddr, rmap))
|
self.banks.append((name, csrs, mapaddr, rmap))
|
||||||
|
|
||||||
|
|
122
misoc/interconnect/stream.py
Normal file
122
misoc/interconnect/stream.py
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
from migen import *
|
||||||
|
from migen.genlib.record import *
|
||||||
|
from migen.genlib import fifo
|
||||||
|
|
||||||
|
|
||||||
|
def _make_m2s(layout):
|
||||||
|
r = []
|
||||||
|
for f in layout:
|
||||||
|
if isinstance(f[1], (int, tuple)):
|
||||||
|
r.append((f[0], f[1], DIR_M_TO_S))
|
||||||
|
else:
|
||||||
|
r.append((f[0], _make_m2s(f[1])))
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
class EndpointDescription:
|
||||||
|
def __init__(self, payload_layout, param_layout=[], packetized=False):
|
||||||
|
self.payload_layout = payload_layout
|
||||||
|
self.param_layout = param_layout
|
||||||
|
self.packetized = packetized
|
||||||
|
|
||||||
|
def get_full_layout(self):
|
||||||
|
reserved = {"stb", "ack", "payload", "param", "sop", "eop", "description"}
|
||||||
|
attributed = set()
|
||||||
|
for f in self.payload_layout + self.param_layout:
|
||||||
|
if f[0] in attributed:
|
||||||
|
raise ValueError(f[0] + " already attributed in payload or param layout")
|
||||||
|
if f[0] in reserved:
|
||||||
|
raise ValueError(f[0] + " cannot be used in endpoint layout")
|
||||||
|
attributed.add(f[0])
|
||||||
|
|
||||||
|
full_layout = [
|
||||||
|
("payload", _make_m2s(self.payload_layout)),
|
||||||
|
("param", _make_m2s(self.param_layout)),
|
||||||
|
("stb", 1, DIR_M_TO_S),
|
||||||
|
("ack", 1, DIR_S_TO_M)
|
||||||
|
]
|
||||||
|
if self.packetized:
|
||||||
|
full_layout += [
|
||||||
|
("sop", 1, DIR_M_TO_S),
|
||||||
|
("eop", 1, DIR_M_TO_S)
|
||||||
|
]
|
||||||
|
return full_layout
|
||||||
|
|
||||||
|
|
||||||
|
class _Endpoint(Record):
|
||||||
|
def __init__(self, description_or_layout):
|
||||||
|
if isinstance(description_or_layout, EndpointDescription):
|
||||||
|
self.description = description_or_layout
|
||||||
|
else:
|
||||||
|
self.description = EndpointDescription(description_or_layout)
|
||||||
|
Record.__init__(self, self.description.get_full_layout())
|
||||||
|
|
||||||
|
def __getattr__(self, name):
|
||||||
|
try:
|
||||||
|
return getattr(object.__getattribute__(self, "payload"), name)
|
||||||
|
except:
|
||||||
|
return getattr(object.__getattribute__(self, "param"), name)
|
||||||
|
|
||||||
|
|
||||||
|
class Source(_Endpoint):
|
||||||
|
def connect(self, sink):
|
||||||
|
return Record.connect(self, sink)
|
||||||
|
|
||||||
|
|
||||||
|
class Sink(_Endpoint):
|
||||||
|
def connect(self, source):
|
||||||
|
return source.connect(self)
|
||||||
|
|
||||||
|
|
||||||
|
class _FIFOWrapper(Module):
|
||||||
|
def __init__(self, fifo_class, layout, depth):
|
||||||
|
self.sink = Sink(layout)
|
||||||
|
self.source = Source(layout)
|
||||||
|
self.busy = Signal()
|
||||||
|
|
||||||
|
###
|
||||||
|
|
||||||
|
description = self.sink.description
|
||||||
|
fifo_layout = [
|
||||||
|
("payload", description.payload_layout),
|
||||||
|
# Note : Can be optimized by passing parameters
|
||||||
|
# in another fifo. We will only have one
|
||||||
|
# data per packet.
|
||||||
|
("param", description.param_layout)
|
||||||
|
]
|
||||||
|
if description.packetized:
|
||||||
|
fifo_layout += [("sop", 1), ("eop", 1)]
|
||||||
|
|
||||||
|
self.submodules.fifo = fifo_class(fifo_layout, depth)
|
||||||
|
|
||||||
|
self.comb += [
|
||||||
|
self.sink.ack.eq(self.fifo.writable),
|
||||||
|
self.fifo.we.eq(self.sink.stb),
|
||||||
|
self.fifo.din.payload.eq(self.sink.payload),
|
||||||
|
self.fifo.din.param.eq(self.sink.param),
|
||||||
|
|
||||||
|
self.source.stb.eq(self.fifo.readable),
|
||||||
|
self.source.payload.eq(self.fifo.dout.payload),
|
||||||
|
self.source.param.eq(self.fifo.dout.param),
|
||||||
|
self.fifo.re.eq(self.source.ack)
|
||||||
|
]
|
||||||
|
if description.packetized:
|
||||||
|
self.comb += [
|
||||||
|
self.fifo.din.sop.eq(self.sink.sop),
|
||||||
|
self.fifo.din.eop.eq(self.sink.eop),
|
||||||
|
self.source.sop.eq(self.fifo.dout.sop),
|
||||||
|
self.source.eop.eq(self.fifo.dout.eop)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class SyncFIFO(_FIFOWrapper):
|
||||||
|
def __init__(self, layout, depth, buffered=False):
|
||||||
|
_FIFOWrapper.__init__(
|
||||||
|
self,
|
||||||
|
fifo.SyncFIFOBuffered if buffered else fifo.SyncFIFO,
|
||||||
|
layout, depth)
|
||||||
|
|
||||||
|
|
||||||
|
class AsyncFIFO(_FIFOWrapper):
|
||||||
|
def __init__(self, layout, depth):
|
||||||
|
_FIFOWrapper.__init__(self, fifo.AsyncFIFO, layout, depth)
|
|
@ -21,7 +21,7 @@ AR_quiet = @echo " AR " $@ && $(AR_normal)
|
||||||
LD_quiet = @echo " LD " $@ && $(LD_normal)
|
LD_quiet = @echo " LD " $@ && $(LD_normal)
|
||||||
OBJCOPY_quiet = @echo " OBJCOPY " $@ && $(OBJCOPY_normal)
|
OBJCOPY_quiet = @echo " OBJCOPY " $@ && $(OBJCOPY_normal)
|
||||||
|
|
||||||
MSC_GIT_ID := $(shell cd $(MSCDIR) && $(PYTHON) -c "from misoc.cpu.identifier import get_id; print(hex(get_id()), end='')")
|
MSC_GIT_ID := $(shell cd $(MSCDIR) && $(PYTHON) -c "from misoc.cores.identifier import get_id; print(hex(get_id()), end='')")
|
||||||
|
|
||||||
ifeq ($(V),1)
|
ifeq ($(V),1)
|
||||||
CC = $(CC_normal)
|
CC = $(CC_normal)
|
||||||
|
|
Loading…
Reference in a new issue