litex_sim: add optional GPIOTristate core

Adds a switch `--with-gpio`, which will add a 32 pin GPIOTristate
core, with the GPIOTristate signals exposed on the top-level
module. This can be used to add a custom GPIO module in the Verilated
simulation.

Signed-off-by: Leon Schuermann <leon@is.currently.online>
This commit is contained in:
Leon Schuermann 2021-09-13 11:28:02 +02:00
parent af8459301c
commit 8670ac4902
1 changed files with 16 additions and 0 deletions

View File

@ -22,6 +22,7 @@ from litex.soc.integration.soc_core import *
from litex.soc.integration.builder import * from litex.soc.integration.builder import *
from litex.soc.integration.soc import * from litex.soc.integration.soc import *
from litex.soc.cores.bitbang import * from litex.soc.cores.bitbang import *
from litex.soc.cores.gpio import GPIOTristate
from litex.soc.cores.cpu import CPUS from litex.soc.cores.cpu import CPUS
@ -87,6 +88,13 @@ _io = [
Subsignal("clk", Pins(1)), Subsignal("clk", Pins(1)),
Subsignal("dq", Pins(4)), Subsignal("dq", Pins(4)),
), ),
# Simulated tristate IO (Verilator does not support top-level
# tristate signals)
("gpio", 0,
Subsignal("oe", Pins(32)),
Subsignal("o", Pins(32)),
Subsignal("i", Pins(32)),
)
] ]
# Platform ----------------------------------------------------------------------------------------- # Platform -----------------------------------------------------------------------------------------
@ -117,6 +125,7 @@ class SimSoC(SoCCore):
with_sdcard = False, with_sdcard = False,
with_spi_flash = False, with_spi_flash = False,
spi_flash_init = [], spi_flash_init = [],
with_gpio = False,
sim_debug = False, sim_debug = False,
trace_reset_on = False, trace_reset_on = False,
**kwargs): **kwargs):
@ -262,6 +271,11 @@ class SimSoC(SoCCore):
self.submodules.spiflash_phy = LiteSPIPHYModel(spiflash_module, init=spi_flash_init) self.submodules.spiflash_phy = LiteSPIPHYModel(spiflash_module, init=spi_flash_init)
self.add_spi_flash(phy=self.spiflash_phy, mode="4x", module=spiflash_module, with_master=True) self.add_spi_flash(phy=self.spiflash_phy, mode="4x", module=spiflash_module, with_master=True)
# GPIO --------------------------------------------------------------------------------------
if with_gpio:
self.submodules.gpio = GPIOTristate(platform.request("gpio"), with_irq=True)
self.irq.add("gpio", use_loc_if_exists=True)
# Simulation debugging ---------------------------------------------------------------------- # Simulation debugging ----------------------------------------------------------------------
if sim_debug: if sim_debug:
platform.add_debug(self, reset=1 if trace_reset_on else 0) platform.add_debug(self, reset=1 if trace_reset_on else 0)
@ -327,6 +341,7 @@ def sim_args(parser):
parser.add_argument("--with-sdcard", action="store_true", help="Enable SDCard support") parser.add_argument("--with-sdcard", action="store_true", help="Enable SDCard support")
parser.add_argument("--with-spi-flash", action="store_true", help="Enable SPI Flash (MMAPed)") parser.add_argument("--with-spi-flash", action="store_true", help="Enable SPI Flash (MMAPed)")
parser.add_argument("--spi_flash-init", default=None, help="SPI Flash init file") parser.add_argument("--spi_flash-init", default=None, help="SPI Flash init file")
parser.add_argument("--with-gpio", action="store_true", help="Enable Tristate GPIO (32 pins)")
parser.add_argument("--trace", action="store_true", help="Enable Tracing") parser.add_argument("--trace", action="store_true", help="Enable Tracing")
parser.add_argument("--trace-fst", action="store_true", help="Enable FST tracing (default=VCD)") parser.add_argument("--trace-fst", action="store_true", help="Enable FST tracing (default=VCD)")
parser.add_argument("--trace-start", default="0", help="Time to start tracing (ps)") parser.add_argument("--trace-start", default="0", help="Time to start tracing (ps)")
@ -394,6 +409,7 @@ def main():
with_i2c = args.with_i2c, with_i2c = args.with_i2c,
with_sdcard = args.with_sdcard, with_sdcard = args.with_sdcard,
with_spi_flash = args.with_spi_flash, with_spi_flash = args.with_spi_flash,
with_gpio = args.with_gpio,
sim_debug = args.sim_debug, sim_debug = args.sim_debug,
trace_reset_on = trace_start > 0 or trace_end > 0, 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), sdram_init = [] if args.sdram_init is None else get_mem_data(args.sdram_init, cpu.endianness),