command line options support, CSR CSV, all targets building
authorSebastien Bourdeauducq <sb@m-labs.hk>
Tue, 29 Sep 2015 10:14:54 +0000 (18:14 +0800)
committerSebastien Bourdeauducq <sb@m-labs.hk>
Tue, 29 Sep 2015 10:14:54 +0000 (18:14 +0800)
misoc/integration/builder.py
misoc/integration/soc_core.py
misoc/integration/soc_sdram.py
misoc/targets/de0nano.py
misoc/targets/kc705.py
misoc/targets/minispartan6.py
misoc/targets/mlabs_video.py
misoc/targets/papilio_pro.py
misoc/targets/pipistrello.py
misoc/targets/simple.py
misoc/targets/versa.py [deleted file]

index e0ecce6e727e988c9c532de67a222b630a19c776..e731ef50ce8d568a5d2ebd6e209bdf860f6e1d79 100644 (file)
@@ -5,6 +5,10 @@ import struct
 from misoc.integration import cpu_interface, sdram_init
 
 
+__all__ = ["misoc_software_packages", "misoc_directory",
+           "Builder", "builder_args", "builder_argdict"]
+
+
 # in build order (for dependencies)
 misoc_software_packages = [
     "libbase",
@@ -20,11 +24,20 @@ misoc_directory = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
 
 
 class Builder:
-    def __init__(self, soc, output_dir):
+    def __init__(self, soc, output_dir=None,
+                 compile_software=True, compile_gateware=True,
+                 csr_csv=None):
         self.soc = soc
+        if output_dir is None:
+            output_dir = "misoc_{}_{}".format(
+                soc.__class__.__name__.lower(),
+                soc.platform.name)
         # From Python doc: makedirs() will become confused if the path
         # elements to create include '..'
         self.output_dir = os.path.abspath(output_dir)
+        self.compile_software = compile_software
+        self.compile_gateware = compile_gateware
+        self.csr_csv = csr_csv
 
         self.software_packages = []
         for name in misoc_software_packages:
@@ -73,7 +86,11 @@ class Builder:
             with open(os.path.join(generated_dir, "sdram_phy.h"), "w") as f:
                 f.write(sdram_init.get_sdram_phy_header(sdram_phy_settings))
 
-    def _generate_software(self, compile):
+        if self.csr_csv is not None:
+            with open(self.csr_csv, "w") as f:
+                f.write(cpu_interface.get_csr_csv(csr_regions))
+
+    def _generate_software(self):
         for name, src_dir in self.software_packages:
             dst_dir = os.path.join(self.output_dir, "software", name)
             os.makedirs(dst_dir, exist_ok=True)
@@ -84,7 +101,7 @@ class Builder:
             except FileNotFoundError:
                 pass
             os.symlink(src, dst)
-            if compile:
+            if self.compile_software:
                 subprocess.check_call(["make", "-C", dst_dir])
 
     def _initialize_rom(self):
@@ -100,15 +117,39 @@ class Builder:
                     boot_data.append(struct.unpack(">I", w)[0])
             self.soc.initialize_rom(boot_data)
 
-    def build(self, compile_software=True, compile_gateware=True):
+    def build(self):
         self.soc.finalize()
 
-        if self.soc.integrated_rom_size and not compile_software:
+        if self.soc.integrated_rom_size and not self.compile_software:
             raise ValueError("Software must be compiled in order to "
                              "intitialize integrated ROM")
 
         self._generate_includes()
-        self._generate_software(compile_software)
+        self._generate_software()
         self._initialize_rom()
         self.soc.build(build_dir=os.path.join(self.output_dir, "gateware"),
-                       run=compile_gateware)
+                       run=self.compile_gateware)
+
+
+def builder_args(parser):
+    parser.add_argument("--output-dir", default=None,
+                        help="output directory for generated "
+                             "source files and binaries")
+    parser.add_argument("--no-compile-software", action="store_true",
+                        help="do not compile the software, only generate "
+                             "build infrastructure")
+    parser.add_argument("--no-compile-gateware", action="store_true",
+                        help="do not compile the gateware, only generate "
+                             "HDL source files and build scripts")
+    parser.add_argument("--csr-csv", default=None,
+                        help="store CSR map in CSV format into the "
+                             "specified file")
+
+
+def builder_argdict(args):
+    return {
+        "output_dir": args.output_dir,
+        "compile_software": not args.no_compile_software,
+        "compile_gateware": not args.no_compile_gateware,
+        "csr_csv": args.csr_csv
+    }
index 3a92dbb8628413e0755c67a7911eb5c0d7b5028f..cf8bbe566e20e2841ec07aacde3fb38090e3495e 100644 (file)
@@ -6,6 +6,9 @@ from misoc.cores import lm32, mor1kx, identifier, timer, uart
 from misoc.interconnect import wishbone, csr_bus, wishbone2csr
 
 
+__all__ = ["mem_decoder", "SoCCore", "soc_core_args", "soc_core_argdict"]
+
+
 def mem_decoder(address, start=26, end=29):
     return lambda a: a[start:end] == ((address >> (start+2)) & (2**(end-start))-1)
 
@@ -190,3 +193,21 @@ class SoCCore(Module):
 
     def build(self, *args, **kwargs):
         self.platform.build(self, *args, **kwargs)
+
+
+def soc_core_args(parser):
+    parser.add_argument("--cpu-type", default=None,
+                        help="select CPU: lm32, or1k")
+    parser.add_argument("--integrated-rom-size", default=None, type=int,
+                        help="size/enable the integrated (BIOS) ROM")
+    parser.add_argument("--integrated-main-ram-size", default=None, type=int,
+                        help="size/enable the integrated main RAM")
+
+
+def soc_core_argdict(args):
+    r = dict()
+    for a in "cpu_type", "integrated_rom_size", "integrated_main_ram_size":
+        arg = getattr(args, a)
+        if arg is not None:
+            r[a] = arg
+    return r
index 64dac53444ec17d057d549e76f413bc119f667ee..1bc813d55ca5114854020d1562df3b705db2318c 100644 (file)
@@ -4,13 +4,16 @@ from migen.genlib.record import *
 from misoc.interconnect import wishbone, wishbone2lasmi, lasmi_bus
 from misoc.interconnect.csr import AutoCSR
 from misoc.cores import sdram_tester, dfii, minicon, lasmicon
-from misoc.integration.soc_core import SoCCore
+from misoc.integration.soc_core import *
 
 # TODO: cleanup
 from misoc.cores.lasmicon.core import LASMIconSettings
 from misoc.cores.minicon.core import MiniconSettings
 
 
+__all__ = ["SoCSDRAM", "soc_sdram_args", "soc_sdram_argdict"]
+
+
 class SDRAMCore(Module, AutoCSR):
     def __init__(self, phy, geom_settings, timing_settings, controller_settings, **kwargs):
         # DFI
@@ -140,3 +143,7 @@ class SoCSDRAM(SoCCore):
             self.submodules.wb_sdram_con = wishbone.Arbiter(self._wb_sdram_ifs,
                                                             self._wb_sdram)
         SoCCore.do_finalize(self)
+
+
+soc_sdram_args = soc_core_args
+soc_sdram_argdict = soc_core_argdict
index b0ca296cfc5583c67dec8b4f98ddc3ec2234934e..2e8d80e1bc60f6b9190fe5da88d396fdbe454652 100755 (executable)
@@ -1,9 +1,15 @@
+#!/usr/bin/env python3
+
+import argparse
+
 from migen import *
+from migen.build.platforms import de0nano
 
 from misoc.cores.sdram_settings import IS42S16160
 from misoc.cores.sdram_phy import GENSDRPHY
 from misoc.cores.lasmicon.core import LASMIconSettings
-from misoc.integration.soc_sdram import SoCSDRAM
+from misoc.integration.soc_sdram import *
+from misoc.integration.builder import *
 
 
 class _PLL(Module):
@@ -80,9 +86,8 @@ class _CRG(Module):
 
 
 class BaseSoC(SoCSDRAM):
-    default_platform = "de0nano"
-
-    def __init__(self, platform, sdram_controller_settings=LASMIconSettings(), **kwargs):
+    def __init__(self, sdram_controller_settings=LASMIconSettings(), **kwargs):
+        platform = de0nano.Platform()
         SoCSDRAM.__init__(self, platform,
                           clk_freq=100*1000000,
                           integrated_rom_size=0x8000,
@@ -96,4 +101,16 @@ class BaseSoC(SoCSDRAM):
                                                IS42S16160(self.clk_freq))
             self.register_sdram_phy(self.sdrphy)
 
-default_subtarget = BaseSoC
+def main():
+    parser = argparse.ArgumentParser(description="MiSoC port to the Altera DE0 Nano")
+    builder_args(parser)
+    soc_sdram_args(parser)
+    args = parser.parse_args()
+
+    soc = BaseSoC(**soc_sdram_argdict(args))
+    builder = Builder(soc, **builder_argdict(args))
+    builder.build()
+
+
+if __name__ == "__main__":
+    main()
index b6278830f0c9ba9f03a98bbb1b860a46c6c6c3da..b58e69a3405674bb699d85c6ffb8b1012cc05840 100755 (executable)
@@ -1,5 +1,10 @@
+#!/usr/bin/env python3
+
+import argparse
+
 from migen import *
 from migen.genlib.resetsync import AsyncResetSynchronizer
+from migen.build.platforms import kc705
 
 from misoc.cores.sdram_settings import MT8JTF12864
 from misoc.cores.sdram_phy import k7ddrphy
@@ -8,7 +13,9 @@ from misoc.cores import spi_flash
 from misoc.cores.liteeth_mini.phy import LiteEthPHY
 from misoc.cores.liteeth_mini.mac import LiteEthMAC
 from misoc.integration.soc_core import mem_decoder
-from misoc.integration.soc_sdram import SoCSDRAM
+from misoc.integration.soc_sdram import *
+from misoc.integration.builder import *
+
 
 
 class _CRG(Module):
@@ -77,7 +84,8 @@ class BaseSoC(SoCSDRAM):
     }
     csr_map.update(SoCSDRAM.csr_map)
 
-    def __init__(self, platform, sdram_controller_settings=LASMIconSettings(), **kwargs):
+    def __init__(self, toolchain="ise", sdram_controller_settings=LASMIconSettings(), **kwargs):
+        platform = kc705.Platform(toolchain=toolchain)
         SoCSDRAM.__init__(self, platform,
                           clk_freq=125*1000000, cpu_reset_address=0xaf0000,
                           sdram_controller_settings=sdram_controller_settings,
@@ -120,12 +128,31 @@ class MiniSoC(BaseSoC):
     }
     mem_map.update(BaseSoC.mem_map)
 
-    def __init__(self, platform, **kwargs):
-        BaseSoC.__init__(self, platform, **kwargs)
+    def __init__(self, *args, **kwargs):
+        BaseSoC.__init__(self, *args, **kwargs)
 
-        self.submodules.ethphy = LiteEthPHY(platform.request("eth_clocks"), platform.request("eth"), clk_freq=self.clk_freq)
+        self.submodules.ethphy = LiteEthPHY(self.platform.request("eth_clocks"),
+                                            self.platform.request("eth"), clk_freq=self.clk_freq)
         self.submodules.ethmac = LiteEthMAC(phy=self.ethphy, dw=32, interface="wishbone")
         self.add_wb_slave(mem_decoder(self.mem_map["ethmac"]), self.ethmac.bus)
         self.add_memory_region("ethmac", self.mem_map["ethmac"] | self.shadow_base, 0x2000)
 
-default_subtarget = BaseSoC
+
+def main():
+    parser = argparse.ArgumentParser(description="MiSoC port to the KC705")
+    builder_args(parser)
+    soc_sdram_args(parser)
+    parser.add_argument("--toolchain", default="ise",
+                        help="FPGA toolchain to use: ise, vivado")
+    parser.add_argument("--with-ethernet", action="store_true",
+                        help="enable Ethernet support")
+    args = parser.parse_args()
+
+    cls = MiniSoC if args.with_ethernet else BaseSoC
+    soc = cls(toolchain=args.toolchain, **soc_sdram_argdict(args))
+    builder = Builder(soc, **builder_argdict(args))
+    builder.build()
+
+
+if __name__ == "__main__":
+    main()
index 303d328186044d934d36d61b71d9015965a28e35..040ead10eb21326018519852d1a1910aafa7a1b6 100755 (executable)
@@ -1,12 +1,17 @@
+#!/usr/bin/env python3
+
+import argparse
 from fractions import Fraction
 
 from migen import *
 from migen.genlib.resetsync import AsyncResetSynchronizer
+from migen.build.platforms import minispartan6
 
 from misoc.cores.sdram_settings import AS4C16M16
 from misoc.cores.sdram_phy import GENSDRPHY
 from misoc.cores.lasmicon.core import LASMIconSettings
-from misoc.integration.soc_sdram import SoCSDRAM
+from misoc.integration.soc_sdram import *
+from misoc.integration.builder import *
 
 
 class _CRG(Module):
@@ -61,10 +66,9 @@ class _CRG(Module):
 
 
 class BaseSoC(SoCSDRAM):
-    default_platform = "minispartan6"
-
-    def __init__(self, platform, sdram_controller_settings=LASMIconSettings(), **kwargs):
+    def __init__(self, sdram_controller_settings=LASMIconSettings(), **kwargs):
         clk_freq = 80*1000000
+        platform = minispartan6.Platform()
         SoCSDRAM.__init__(self, platform, clk_freq,
                           integrated_rom_size=0x8000,
                           sdram_controller_settings=sdram_controller_settings,
@@ -77,4 +81,17 @@ class BaseSoC(SoCSDRAM):
                                                AS4C16M16(clk_freq))
             self.register_sdram_phy(self.sdrphy)
 
-default_subtarget = BaseSoC
+
+def main():
+    parser = argparse.ArgumentParser(description="MiSoC port to the MiniSpartan6")
+    builder_args(parser)
+    soc_sdram_args(parser)
+    args = parser.parse_args()
+
+    soc = BaseSoC(**soc_sdram_argdict(args))
+    builder = Builder(soc, **builder_argdict(args))
+    builder.build()
+
+
+if __name__ == "__main__":
+    main()
index df2d855b93fdc0053b5b9c4c4ca5c7467aff18c8..8f2f8601233ed974bc2989e7eb9bf8c5401f2502 100755 (executable)
@@ -1,20 +1,25 @@
+#!/usr/bin/env python3
+
+import argparse
 import os
 from fractions import Fraction
 from math import ceil
 
 from migen import *
 from migen.build.generic_platform import ConstraintError
+from migen.build.platforms import mixxeo, m1
 
 from misoc.cores.sdram_settings import MT46V32M16
 from misoc.cores.sdram_phy import S6HalfRateDDRPHY
 from misoc.cores.lasmicon.core import LASMIconSettings
 from misoc.cores import nor_flash_16
-from misoc.cores import framebuffer
+# TODO: from misoc.cores import framebuffer
 from misoc.cores import gpio
 from misoc.cores.liteeth_mini.phy import LiteEthPHY
 from misoc.cores.liteeth_mini.mac import LiteEthMAC
 from misoc.integration.soc_core import mem_decoder
-from misoc.integration.soc_sdram import SoCSDRAM
+from misoc.integration.soc_sdram import *
+from misoc.integration.builder import *
 
 
 class _MXCRG(Module):
@@ -70,9 +75,13 @@ class _MXClockPads:
 
 
 class BaseSoC(SoCSDRAM):
-    default_platform = "mixxeo"  # also supports m1
-
-    def __init__(self, platform, sdram_controller_settings=LASMIconSettings(), **kwargs):
+    def __init__(self, platform_name="mixxeo", sdram_controller_settings=LASMIconSettings(), **kwargs):
+        if platform_name == "mixxeo":
+            platform = mixxeo.Platform()
+        elif platform_name == "m1":
+            platform = m1.Platform()
+        else:
+            raise ValueError
         SoCSDRAM.__init__(self, platform,
                           clk_freq=(83 + Fraction(1, 3))*1000000,
                           cpu_reset_address=0x00180000,
@@ -105,7 +114,7 @@ class BaseSoC(SoCSDRAM):
 INST "mxcrg/wr_bufpll" LOC = "BUFPLL_X0Y2";
 INST "mxcrg/rd_bufpll" LOC = "BUFPLL_X0Y3";
 """)
-        platform.add_source(os.path.join("misoc", "mxcrg.v"))
+        platform.add_source(os.path.join(misoc_directory, "cores", "mxcrg.v"))
 
 
 class MiniSoC(BaseSoC):
@@ -125,9 +134,10 @@ class MiniSoC(BaseSoC):
     }
     mem_map.update(BaseSoC.mem_map)
 
-    def __init__(self, platform, **kwargs):
-        BaseSoC.__init__(self, platform, **kwargs)
+    def __init__(self, *args, **kwargs):
+        BaseSoC.__init__(self, *args, **kwargs)
 
+        platform = self.platform
         if platform.name == "mixxeo":
             self.submodules.leds = gpio.GPIOOut(platform.request("user_led"))
         if platform.name == "m1":
@@ -173,11 +183,33 @@ class FramebufferSoC(MiniSoC):
     }
     csr_map.update(MiniSoC.csr_map)
 
-    def __init__(self, platform, **kwargs):
-        MiniSoC.__init__(self, platform, **kwargs)
+    def __init__(self, *args, **kwargs):
+        MiniSoC.__init__(self, *args, **kwargs)
         pads_vga, pads_dvi = get_vga_dvi(platform)
         self.submodules.fb = framebuffer.Framebuffer(pads_vga, pads_dvi,
                                                      self.sdram.crossbar.get_master())
         add_vga_tig(platform, self.fb)
 
-default_subtarget = FramebufferSoC
+
+def main():
+    parser = argparse.ArgumentParser(description="MiSoC port to the Mixxeo and Milkymist One")
+    builder_args(parser)
+    soc_sdram_args(parser)
+    parser.add_argument("--platform", default="mixxeo",
+                        help="platform to build for: mixxeo, m1")
+    parser.add_argument("--soc-type", default="base",
+                        help="SoC type: base, mini, framebuffer")
+    args = parser.parse_args()
+
+    cls = {
+        "base": BaseSoC,
+        "mini": MiniSoC,
+        "framebuffer": FramebufferSoC
+    }[args.soc_type]
+    soc = cls(args.platform, **soc_sdram_argdict(args))
+    builder = Builder(soc, **builder_argdict(args))
+    builder.build()
+
+
+if __name__ == "__main__":
+    main()
index 25e003d5691b4f4f8d5cdfc141f7c021b4a26e0b..f41a4d3b182cef731c6eeb24a09b1d4dd226d557 100755 (executable)
@@ -1,5 +1,6 @@
 #!/usr/bin/env python3
 
+import argparse
 from fractions import Fraction
 
 from migen import *
@@ -10,8 +11,8 @@ from misoc.cores.sdram_settings import MT48LC4M16
 from misoc.cores.sdram_phy import GENSDRPHY
 from misoc.cores.lasmicon.core import LASMIconSettings
 from misoc.cores import spi_flash
-from misoc.integration.soc_sdram import SoCSDRAM
-from misoc.integration.builder import Builder
+from misoc.integration.soc_sdram import *
+from misoc.integration.builder import *
 
 
 class _CRG(Module):
@@ -71,7 +72,8 @@ class BaseSoC(SoCSDRAM):
     }
     csr_map.update(SoCSDRAM.csr_map)
 
-    def __init__(self, platform, sdram_controller_settings=LASMIconSettings(), **kwargs):
+    def __init__(self, sdram_controller_settings=LASMIconSettings(), **kwargs):
+        platform = papilio_pro.Platform()
         clk_freq = 80*1000000
         SoCSDRAM.__init__(self, platform, clk_freq,
                           cpu_reset_address=0x60000,
@@ -93,8 +95,13 @@ class BaseSoC(SoCSDRAM):
 
 
 def main():
-    soc = BaseSoC(papilio_pro.Platform(), cpu_type="or1k")
-    builder = Builder(soc, "misoc_build")
+    parser = argparse.ArgumentParser(description="MiSoC port to the Papilio Pro")
+    builder_args(parser)
+    soc_sdram_args(parser)
+    args = parser.parse_args()
+
+    soc = BaseSoC(**soc_sdram_argdict(args))
+    builder = Builder(soc, **builder_argdict(args))
     builder.build()
 
 
index f5a36df834b6b2dd3e099c31fa7828672a60c5e7..1a4f50d0aeb830b29423626d197a695d535b145c 100755 (executable)
@@ -1,13 +1,18 @@
+#!/usr/bin/env python3
+
+import argparse
 from fractions import Fraction
 
 from migen import *
 from migen.genlib.resetsync import AsyncResetSynchronizer
+from migen.build.platforms import pipistrello
 
 from misoc.cores.sdram_settings import MT46H32M16
 from misoc.cores.sdram_phy import S6HalfRateDDRPHY
 from misoc.cores.lasmicon.core import LASMIconSettings
 from misoc.cores import spi_flash
-from misoc.integration.soc_sdram import SoCSDRAM
+from misoc.integration.soc_sdram import *
+from misoc.integration.builder import *
 
 
 class _CRG(Module):
@@ -91,15 +96,14 @@ class _CRG(Module):
 
 
 class BaseSoC(SoCSDRAM):
-    default_platform = "pipistrello"
-
     csr_map = {
         "spiflash": 16,
     }
     csr_map.update(SoCSDRAM.csr_map)
 
-    def __init__(self, platform, sdram_controller_settings=LASMIconSettings(),
+    def __init__(self, sdram_controller_settings=LASMIconSettings(),
                  clk_freq=(83 + Fraction(1, 3))*1000*1000, **kwargs):
+        platform = pipistrello.Platform()
         SoCSDRAM.__init__(self, platform, clk_freq,
                           cpu_reset_address=0x170000,  # 1.5 MB
                           sdram_controller_settings=sdram_controller_settings,
@@ -127,4 +131,17 @@ class BaseSoC(SoCSDRAM):
             self.flash_boot_address = 0x180000
             self.register_rom(self.spiflash.bus, 0x1000000)
 
-default_subtarget = BaseSoC
+def main():
+    parser = argparse.ArgumentParser(description="MiSoC port to the Pipistrello")
+    builder_args(parser)
+    soc_sdram_args(parser)
+    args = parser.parse_args()
+
+    soc = BaseSoC(**soc_sdram_argdict(args))
+    builder = Builder(soc, **builder_argdict(args))
+    builder.build()
+
+
+if __name__ == "__main__":
+    main()
+
index 0c7bdc202c2d65c524a51b94f4f6b1760015d84e..e6d89128aa482a5c9551b157b3a582de96e8c936 100755 (executable)
@@ -1,9 +1,15 @@
+#!/usr/bin/env python3
+
+import argparse
+import importlib
+
 from migen import *
 from migen.genlib.io import CRG
 
 from misoc.cores.liteeth_mini.phy import LiteEthPHY
 from misoc.cores.liteeth_mini.mac import LiteEthMAC
-from misoc.integration.soc_core import SoCCore, mem_decoder
+from misoc.integration.soc_core import *
+from misoc.integration.builder import *
 
 
 class BaseSoC(SoCCore):
@@ -44,4 +50,24 @@ class MiniSoC(BaseSoC):
         self.add_wb_slave(mem_decoder(self.mem_map["ethmac"]), self.ethmac.bus)
         self.add_memory_region("ethmac", self.mem_map["ethmac"] | self.shadow_base, 0x2000)
 
-default_subtarget = BaseSoC
+
+def main():
+    parser = argparse.ArgumentParser(description="Generic MiSoC port")
+    builder_args(parser)
+    soc_core_args(parser)
+    parser.add_argument("--with-ethernet", action="store_true",
+                        help="enable Ethernet support")
+    parser.add_argument("platform",
+                        help="module name of the Migen platform to build for")
+    args = parser.parse_args()
+
+    platform_module = importlib.import_module(args.platform)
+    platform = platform_module.Platform()
+    cls = MiniSoC if args.with_ethernet else BaseSoC
+    soc = cls(platform, **soc_core_argdict(args))
+    builder = Builder(soc, **builder_argdict(args))
+    builder.build()
+
+
+if __name__ == "__main__":
+    main()
diff --git a/misoc/targets/versa.py b/misoc/targets/versa.py
deleted file mode 100755 (executable)
index 84c7e42..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-from migen import *
-from migen.genlib.io import CRG
-
-from misoc.integration.soc_core import SoCCore
-
-
-class BaseSoC(SoCCore):
-    default_platform = "versa"
-    def __init__(self, platform, **kwargs):
-        SoCCore.__init__(self, platform,
-                     clk_freq=100*1000000,
-                     integrated_rom_size=0x8000,
-                     **kwargs)
-        self.submodules.crg = CRG(platform.request("clk100"), ~platform.request("rst_n"))
-        self.comb += platform.request("user_led", 0).eq(ResetSignal())
-
-default_subtarget = BaseSoC