setup.py: Removed deps as per bug #1086#c7.
[gram.git] / gram / core / controller.py
1 # This file is Copyright (c) 2015 Sebastien Bourdeauducq <sb@m-labs.hk>
2 # This file is Copyright (c) 2016-2019 Florent Kermarrec <florent@enjoy-digital.fr>
3 # This file is Copyright (c) 2020 LambdaConcept <contact@lambdaconcept.com>
4 # License: BSD
5
6 """LiteDRAM Controller."""
7
8 from nmigen import *
9 from nmigen.utils import log2_int
10
11 from gram.common import *
12 from gram.phy import dfi
13 from gram.core.refresher import Refresher
14 from gram.core.bankmachine import BankMachine
15 from gram.core.multiplexer import Multiplexer
16
17 # Settings -----------------------------------------------------------------------------------------
18 __ALL__ = ["gramController"]
19
20 class ControllerSettings(Settings):
21 def __init__(self,
22 # Command buffers
23 cmd_buffer_depth=8,
24 cmd_buffer_buffered=False,
25
26 # Read/Write times
27 read_time=32,
28 write_time=16,
29
30 # Refresh
31 with_refresh=True,
32 refresh_cls=Refresher,
33 refresh_zqcs_freq=1e0,
34 refresh_postponing=1,
35
36 # Auto-Precharge
37 with_auto_precharge=True,
38
39 # Address mapping
40 address_mapping="ROW_BANK_COL"):
41 self.set_attributes(locals())
42
43 # Controller ---------------------------------------------------------------------------------------
44
45
46 class gramController(Elaboratable):
47 def __init__(self, phy_settings, geom_settings, timing_settings, clk_freq,
48 controller_settings=ControllerSettings()):
49 self._address_align = log2_int(burst_lengths[phy_settings.memtype])
50
51 # Settings ---------------------------------------------------------------------------------
52 self.settings = controller_settings
53 self.settings.phy = phy_settings
54 self.settings.geom = geom_settings
55 self.settings.timing = timing_settings
56
57 # LiteDRAM Interface (User) ----------------------------------------------------------------
58 self.interface = interface = gramInterface(
59 self._address_align, self.settings)
60
61 # DFI Interface (Memory) -------------------------------------------------------------------
62 self.dfi = dfi.Interface(
63 addressbits=geom_settings.addressbits,
64 bankbits=geom_settings.bankbits,
65 nranks=phy_settings.nranks,
66 databits=phy_settings.dfi_databits,
67 nphases=phy_settings.nphases,
68 name="mem_dfi")
69
70 self._clk_freq = clk_freq
71
72 def elaborate(self, platform):
73 m = Module()
74
75 nranks = self.settings.phy.nranks
76 nbanks = 2**self.settings.geom.bankbits
77
78 # Refresher --------------------------------------------------------------------------------
79 m.submodules.refresher = Refresher(self.settings,
80 clk_freq=self._clk_freq,
81 zqcs_freq=self.settings.refresh_zqcs_freq,
82 postponing=self.settings.refresh_postponing)
83
84 # Bank Machines ----------------------------------------------------------------------------
85 bank_machines = []
86 for n in range(nranks*nbanks):
87 bank_machine = BankMachine(n, address_width=self.interface.address_width,
88 address_align=self._address_align,
89 nranks=nranks, settings=self.settings)
90 bank_machines.append(bank_machine)
91 setattr(m.submodules, "bankmachine"+str(n), bank_machine)
92 m.d.comb += getattr(self.interface, "bank" + str(n)).connect(bank_machine.req)
93
94 # Multiplexer ------------------------------------------------------------------------------
95 m.submodules.multiplexer = Multiplexer(
96 settings=self.settings,
97 bank_machines=bank_machines,
98 refresher=m.submodules.refresher,
99 dfi=self.dfi,
100 interface=self.interface)
101
102 return m