Esempio n. 1
0
def main():
    parser = argparse.ArgumentParser(
        description="LiteX SoC Simulation utility")
    sim_args(parser)
    args = parser.parse_args()

    soc_kwargs = soc_core_argdict(args)
    builder_kwargs = builder_argdict(args)

    sys_clk_freq = int(1e6)
    sim_config = SimConfig()
    sim_config.add_clocker("sys_clk", freq_hz=sys_clk_freq)

    # Configuration --------------------------------------------------------------------------------

    cpu = CPUS.get(soc_kwargs.get("cpu_type", "vexriscv"))

    # UART.
    if soc_kwargs["uart_name"] == "serial":
        soc_kwargs["uart_name"] = "sim"
        sim_config.add_module("serial2console", "serial")

    # ROM.
    if args.rom_init:
        soc_kwargs["integrated_rom_init"] = get_mem_data(
            args.rom_init, cpu.endianness)

    # RAM / SDRAM.
    soc_kwargs["integrated_main_ram_size"] = args.integrated_main_ram_size
    if args.integrated_main_ram_size:
        if args.ram_init is not None:
            soc_kwargs["integrated_main_ram_init"] = get_mem_data(
                args.ram_init, cpu.endianness)
    elif args.with_sdram:
        assert args.ram_init is None
        soc_kwargs["sdram_module"] = args.sdram_module
        soc_kwargs["sdram_data_width"] = int(args.sdram_data_width)
        soc_kwargs["sdram_verbosity"] = int(args.sdram_verbosity)
        if args.sdram_from_spd_dump:
            soc_kwargs["sdram_spd_data"] = parse_spd_hexdump(
                args.sdram_from_spd_dump)

    # Ethernet.
    if args.with_ethernet or args.with_etherbone:
        if args.ethernet_phy_model == "sim":
            sim_config.add_module("ethernet",
                                  "eth",
                                  args={
                                      "interface": "tap0",
                                      "ip": args.remote_ip
                                  })
        elif args.ethernet_phy_model == "xgmii":
            sim_config.add_module("xgmii_ethernet",
                                  "xgmii_eth",
                                  args={
                                      "interface": "tap0",
                                      "ip": args.remote_ip
                                  })
        elif args.ethernet_phy_model == "gmii":
            sim_config.add_module("gmii_ethernet",
                                  "gmii_eth",
                                  args={
                                      "interface": "tap0",
                                      "ip": args.remote_ip
                                  })
        else:
            raise ValueError("Unknown Ethernet PHY model: " +
                             args.ethernet_phy_model)

    # I2C.
    if args.with_i2c:
        sim_config.add_module("spdeeprom", "i2c")

    trace_start = int(float(args.trace_start))
    trace_end = int(float(args.trace_end))

    # SoC ------------------------------------------------------------------------------------------
    soc = SimSoC(with_sdram=args.with_sdram,
                 with_ethernet=args.with_ethernet,
                 ethernet_phy_model=args.ethernet_phy_model,
                 with_etherbone=args.with_etherbone,
                 with_analyzer=args.with_analyzer,
                 with_i2c=args.with_i2c,
                 with_sdcard=args.with_sdcard,
                 with_spi_flash=args.with_spi_flash,
                 with_gpio=args.with_gpio,
                 sim_debug=args.sim_debug,
                 trace_reset_on=trace_start > 0 or trace_end > 0,
                 sdram_init=[] if args.sdram_init is None else get_mem_data(
                     args.sdram_init, cpu.endianness),
                 spi_flash_init=None if args.spi_flash_init is None else
                 get_mem_data(args.spi_flash_init, "big"),
                 **soc_kwargs)
    if args.ram_init is not None or args.sdram_init is not None:
        soc.add_constant("ROM_BOOT_ADDRESS", soc.mem_map["main_ram"])
    if args.with_ethernet:
        for i in range(4):
            soc.add_constant("LOCALIP{}".format(i + 1),
                             int(args.local_ip.split(".")[i]))
        for i in range(4):
            soc.add_constant("REMOTEIP{}".format(i + 1),
                             int(args.remote_ip.split(".")[i]))

    # Build/Run ------------------------------------------------------------------------------------
    def pre_run_callback(vns):
        if args.trace:
            generate_gtkw_savefile(builder, vns, args.trace_fst)

    builder_kwargs["csr_csv"] = "csr.csv"
    builder = Builder(soc, **builder_kwargs)
    builder.build(threads=args.threads,
                  sim_config=sim_config,
                  opt_level=args.opt_level,
                  trace=args.trace,
                  trace_fst=args.trace_fst,
                  trace_start=trace_start,
                  trace_end=trace_end,
                  interactive=not args.non_interactive,
                  pre_run_callback=pre_run_callback)
Esempio n. 2
0
def main():
    parser = argparse.ArgumentParser(
        description="Generic LiteX SoC Simulation")
    sim_args(parser)
    args = parser.parse_args()

    soc_kwargs = soc_core_argdict(args)
    builder_kwargs = builder_argdict(args)

    sys_clk_freq = int(1e6)
    sim_config = SimConfig()
    sim_config.add_clocker("sys_clk", freq_hz=sys_clk_freq)

    # Customize Simulation config to match target --------------------------------------------------

    from vexriscv_smp import VexRiscvSMP
    soc_kwargs["cpu_type"] = "vexriscv_smp"
    soc_kwargs["cpu_variant"] = "linux"
    soc_kwargs["cpu_cls"] = VexRiscvSMP
    args.with_sdram = True
    args.sdram_module = "MT41K128M16"
    args.sdram_data_width = 16

    # Configuration --------------------------------------------------------------------------------

    cpu = CPUS.get(soc_kwargs.get("cpu_type", "vexriscv"))
    if soc_kwargs["uart_name"] == "serial":
        soc_kwargs["uart_name"] = "sim"
        sim_config.add_module("serial2console", "serial")
    if args.rom_init:
        soc_kwargs["integrated_rom_init"] = get_mem_data(
            args.rom_init, cpu.endianness)
    if not args.with_sdram:
        soc_kwargs["integrated_main_ram_size"] = 0x10000000  # 256 MB
        if args.ram_init is not None:
            soc_kwargs["integrated_main_ram_init"] = get_mem_data(
                args.ram_init, cpu.endianness)
    else:
        assert args.ram_init is None
        soc_kwargs["integrated_main_ram_size"] = 0x0
        soc_kwargs["sdram_module"] = args.sdram_module
        soc_kwargs["sdram_data_width"] = int(args.sdram_data_width)
        soc_kwargs["sdram_verbosity"] = int(args.sdram_verbosity)
        if args.sdram_from_spd_dump:
            soc_kwargs["sdram_spd_data"] = parse_spd_hexdump(
                args.sdram_from_spd_dump)

    if args.with_ethernet or args.with_etherbone:
        sim_config.add_module("ethernet",
                              "eth",
                              args={
                                  "interface": "tap0",
                                  "ip": args.remote_ip
                              })

    if args.with_i2c:
        sim_config.add_module("spdeeprom", "i2c")

    trace_start = int(float(args.trace_start))
    trace_end = int(float(args.trace_end))

    # SoC ------------------------------------------------------------------------------------------
    soc = SimSoC(with_sdram=args.with_sdram,
                 with_ethernet=args.with_ethernet,
                 with_etherbone=args.with_etherbone,
                 with_analyzer=args.with_analyzer,
                 with_i2c=args.with_i2c,
                 with_sdcard=args.with_sdcard,
                 sim_debug=args.sim_debug,
                 trace_reset_on=trace_start > 0 or trace_end > 0,
                 sdram_init=[] if args.sdram_init is None else get_mem_data(
                     args.sdram_init, cpu.endianness),
                 **soc_kwargs)
    if args.ram_init is not None or args.sdram_init is not None:
        soc.add_constant("ROM_BOOT_ADDRESS", 0x40000000)
    if args.with_ethernet:
        for i in range(4):
            soc.add_constant("LOCALIP{}".format(i + 1),
                             int(args.local_ip.split(".")[i]))
        for i in range(4):
            soc.add_constant("REMOTEIP{}".format(i + 1),
                             int(args.remote_ip.split(".")[i]))

    # Build/Run ------------------------------------------------------------------------------------
    builder_kwargs["csr_csv"] = "csr.csv"
    builder = Builder(soc, **builder_kwargs)
    for i in range(2):
        build = (i == 0)
        run = (i == 1)
        vns = builder.build(build=build,
                            run=run,
                            threads=args.threads,
                            sim_config=sim_config,
                            opt_level=args.opt_level,
                            trace=args.trace,
                            trace_fst=args.trace_fst,
                            trace_start=trace_start,
                            trace_end=trace_end)
        if args.with_analyzer:
            soc.analyzer.export_csv(vns, "analyzer.csv")
        if args.gtkwave_savefile:
            generate_gtkw_savefile(builder, vns, args.trace_fst)