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>
6 """LiteDRAM Controller."""
9 from nmigen
.utils
import log2_int
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
17 # Settings -----------------------------------------------------------------------------------------
19 class ControllerSettings(Settings
):
23 cmd_buffer_buffered
= False,
31 refresh_cls
= Refresher
,
32 refresh_zqcs_freq
= 1e0
,
33 refresh_postponing
= 1,
36 with_auto_precharge
= True,
39 address_mapping
= "ROW_BANK_COL"):
40 self
.set_attributes(locals())
42 # Controller ---------------------------------------------------------------------------------------
44 class gramController(Elaboratable
):
45 def __init__(self
, phy_settings
, geom_settings
, timing_settings
, clk_freq
,
46 controller_settings
=ControllerSettings()):
47 self
._address
_align
= log2_int(burst_lengths
[phy_settings
.memtype
])
49 # Settings ---------------------------------------------------------------------------------
50 self
.settings
= controller_settings
51 self
.settings
.phy
= phy_settings
52 self
.settings
.geom
= geom_settings
53 self
.settings
.timing
= timing_settings
55 # LiteDRAM Interface (User) ----------------------------------------------------------------
56 self
.interface
= interface
= gramInterface(self
._address
_align
, self
.settings
)
58 # DFI Interface (Memory) -------------------------------------------------------------------
59 self
.dfi
= dfi
.Interface(
60 addressbits
= geom_settings
.addressbits
,
61 bankbits
= geom_settings
.bankbits
,
62 nranks
= phy_settings
.nranks
,
63 databits
= phy_settings
.dfi_databits
,
64 nphases
= phy_settings
.nphases
)
66 self
._clk
_freq
= clk_freq
68 def elaborate(self
, platform
):
71 nranks
= self
.settings
.phy
.nranks
72 nbanks
= 2**self
.settings
.geom
.bankbits
74 # Refresher --------------------------------------------------------------------------------
75 m
.submodules
.refresher
= self
.settings
.refresh_cls(self
.settings
,
76 clk_freq
= self
._clk
_freq
,
77 zqcs_freq
= self
.settings
.refresh_zqcs_freq
,
78 postponing
= self
.settings
.refresh_postponing
)
80 # Bank Machines ----------------------------------------------------------------------------
82 for n
in range(nranks
*nbanks
):
83 bank_machine
= BankMachine(n
,
84 address_width
= self
.interface
.address_width
,
85 address_align
= self
._address
_align
,
87 settings
= self
.settings
)
88 bank_machines
.append(bank_machine
)
89 m
.submodules
+= bank_machine
90 m
.d
.comb
+= getattr(self
.interface
, "bank"+str(n
)).connect(bank_machine
.req
)
92 # Multiplexer ------------------------------------------------------------------------------
93 m
.submodules
.multiplexer
= Multiplexer(
94 settings
= self
.settings
,
95 bank_machines
= bank_machines
,
96 refresher
= m
.submodules
.refresher
,
98 interface
= self
.interface
)
103 return self
.multiplexer
.get_csrs()