bd53825e3b989b720c031f6e0c84c1698999f3cb
[litex.git] / litex / soc / misoc / cores / lasmicon / core.py
1 from migen import *
2
3 from misoc.interconnect import dfi, lasmi_bus
4 from misoc.cores.lasmicon.refresher import *
5 from misoc.cores.lasmicon.bankmachine import *
6 from misoc.cores.lasmicon.multiplexer import *
7
8
9 class ControllerSettings:
10 def __init__(self, req_queue_size=8, read_time=32, write_time=16, with_bandwidth=False):
11 self.req_queue_size = req_queue_size
12 self.read_time = read_time
13 self.write_time = write_time
14 self.with_bandwidth = with_bandwidth
15
16
17 class LASMIcon(Module):
18 def __init__(self, phy_settings, geom_settings, timing_settings,
19 controller_settings=None):
20 if controller_settings is None:
21 controller_settings = ControllerSettings()
22 if phy_settings.memtype in ["SDR"]:
23 burst_length = phy_settings.nphases*1 # command multiplication*SDR
24 elif phy_settings.memtype in ["DDR", "LPDDR", "DDR2", "DDR3"]:
25 burst_length = phy_settings.nphases*2 # command multiplication*DDR
26 address_align = log2_int(burst_length)
27
28 self.dfi = dfi.Interface(geom_settings.addressbits,
29 geom_settings.bankbits,
30 phy_settings.dfi_databits,
31 phy_settings.nphases)
32 self.lasmic = lasmi_bus.Interface(
33 aw=geom_settings.rowbits + geom_settings.colbits - address_align,
34 dw=phy_settings.dfi_databits*phy_settings.nphases,
35 nbanks=2**geom_settings.bankbits,
36 req_queue_size=controller_settings.req_queue_size,
37 read_latency=phy_settings.read_latency+1,
38 write_latency=phy_settings.write_latency+1)
39 self.nrowbits = geom_settings.colbits - address_align
40
41 ###
42
43 self.submodules.refresher = Refresher(geom_settings.addressbits, geom_settings.bankbits,
44 timing_settings.tRP, timing_settings.tREFI, timing_settings.tRFC)
45 self.submodules.bank_machines = [BankMachine(geom_settings, timing_settings, controller_settings, address_align, i,
46 getattr(self.lasmic, "bank"+str(i)))
47 for i in range(2**geom_settings.bankbits)]
48 self.submodules.multiplexer = Multiplexer(phy_settings, geom_settings, timing_settings, controller_settings,
49 self.bank_machines, self.refresher,
50 self.dfi, self.lasmic)
51
52 def get_csrs(self):
53 return self.multiplexer.get_csrs()