def __init__(self, controller_settings = None, phy_settings = None, geom_settings = None, timing_settings = None): # Update settings if provided def updated(settings, update): copy = settings.copy() copy.update(update or {}) return copy controller_settings = updated(self.default_controller_settings, controller_settings) phy_settings = updated(self.default_phy_settings, phy_settings) geom_settings = updated(self.default_geom_settings, geom_settings) timing_settings = updated(self.default_timing_settings, timing_settings) # Use simpler settigns to include only Multiplexer-specific members class SimpleSettings(Settings): def __init__(self, **kwargs): self.set_attributes(kwargs) settings = SimpleSettings(**controller_settings) settings.phy = SimpleSettings(**phy_settings) settings.geom = SimpleSettings(**geom_settings) settings.timing = SimpleSettings(**timing_settings) settings.geom.addressbits = max(settings.geom.rowbits, settings.geom.colbits) self.settings = settings # Create interfaces and stubs required to instantiate Multiplexer abits = settings.geom.addressbits babits = settings.geom.bankbits nbanks = 2**babits nranks = settings.phy.nranks self.bank_machines = [BankMachineStub(abits=abits, babits=babits) for _ in range(nbanks*nranks)] self.refresher = RefresherStub(abits=abits, babits=babits) self.dfi = dfi.Interface( addressbits = abits, bankbits = babits, nranks = settings.phy.nranks, databits = settings.phy.dfi_databits, nphases = settings.phy.nphases) address_align = log2_int(burst_lengths[settings.phy.memtype]) self.interface = LiteDRAMInterface(address_align=address_align, settings=settings) # Add Multiplexer self.submodules.multiplexer = Multiplexer(settings, self.bank_machines, self.refresher, self.dfi, self.interface) # Add helpers for driving bank machines/refresher self.bm_drivers = [CmdRequestRWDriver(bm.cmd, i) for i, bm in enumerate(self.bank_machines)] self.refresh_driver = CmdRequestRWDriver(self.refresher.cmd, i=1)
class CommandDriver: def __init__(self, cmd, cmd_options=None): self.cmd = cmd self.driver = CmdRequestRWDriver(cmd) self.cmd_counts = collections.defaultdict(int) @passive def random_generator(self, random_ready_max=20, commands=None): commands = commands or ["read", "write"] prng = random.Random(42) while True: # Generate random command command = prng.choice(commands) yield from getattr(self.driver, command)() yield # Wait some times before it becomes ready for _ in range(prng.randint(0, random_ready_max)): yield yield self.cmd.ready.eq(1) yield self.cmd_counts[command] += 1 yield self.cmd.ready.eq(0) # Disable command yield from self.driver.nop() yield @passive def timeline_generator(self, timeline): # Timeline: an iterator of tuples (cycle, command) sim_cycle = 0 for cycle, command in timeline: assert cycle >= sim_cycle while sim_cycle != cycle: sim_cycle += 1 yield # Set the command yield from getattr(self.driver, command)() yield self.cmd.ready.eq(1) self.cmd_counts[command] += 1 # Advance 1 cycle yield sim_cycle += 1 # Clear state yield self.cmd.ready.eq(0) yield from self.driver.nop()
def __init__(self, n_requests, addressbits, bankbits): self.requests = [ stream.Endpoint(cmd_request_rw_layout(a=addressbits, ba=bankbits)) for _ in range(n_requests) ] self.submodules.chooser = _CommandChooser(self.requests) self.drivers = [ CmdRequestRWDriver(req, i) for i, req in enumerate(self.requests) ]
def __init__(self, nranks, dfi_databits, nphases): a, ba = 13, 3 nop = Record(cmd_request_layout(a=a, ba=ba)) choose_cmd = stream.Endpoint(cmd_request_rw_layout(a=a, ba=ba)) choose_req = stream.Endpoint(cmd_request_rw_layout(a=a, ba=ba)) refresher_cmd = stream.Endpoint(cmd_request_rw_layout(a=a, ba=ba)) self.commands = [nop, choose_cmd, choose_req, refresher_cmd] self.dfi = dfi.Interface(addressbits=a, bankbits=ba, nranks=nranks, databits=dfi_databits, nphases=nphases) self.submodules.steerer = _Steerer(self.commands, self.dfi) # NOP is not an endpoint and does not have is_* signals self.drivers = [CmdRequestRWDriver(req, i, ep_layout=i != 0, rw_layout=i != 0) for i, req in enumerate(self.commands)]
def __init__(self, cmd, cmd_options=None): self.cmd = cmd self.driver = CmdRequestRWDriver(cmd) self.cmd_counts = collections.defaultdict(int)