asmicon: refresher (untested)
[litex.git] / milkymist / asmicon / __init__.py
1 from migen.fhdl.structure import *
2 from migen.bus import dfi, asmibus
3
4 from milkymist.asmicon.refresher import *
5 from milkymist.asmicon.bankmachine import *
6 from milkymist.asmicon.multiplexer import *
7
8 class PhySettings:
9 def __init__(self, dfi_a, dfi_d, nphases, rdphase, wrphase):
10 # NB: dfi_ba is obtained from GeomSettings.bank_a
11 self.dfi_a = dfi_a
12 self.dfi_d = dfi_d
13 self.nphases = nphases
14 self.rdphase = rdphase
15 self.wrphase = wrphase
16
17 class GeomSettings:
18 def __init__(self, bank_a, row_a, col_a):
19 self.bank_a = bank_a
20 self.row_a = row_a
21 self.col_a = col_a
22
23 class TimingSettings:
24 def __init__(self, tRP, tREFI, tRFC):
25 self.tRP = tRP
26 self.tREFI = tREFI
27 self.tRFC = tRFC
28
29 class ASMIcon:
30 def __init__(self, phy_settings, geom_settings, timing_settings, time=0):
31 self.phy_settings = phy_settings
32 self.geom_settings = geom_settings
33 self.timing_settings = timing_settings
34 self.finalized = False
35
36 self.dfi = dfi.Interface(self.phy_settings.dfi_a,
37 self.geom_settings.bank_a,
38 self.phy_settings.dfi_d,
39 self.phy_settings.nphases)
40 burst_length = self.phy_settings.nphases*2
41 self.address_align = log2_int(burst_length)
42 aw = self.geom_settings.bank_a + self.geom_settings.row_a + self.geom_settings.col_a - self.address_align
43 dw = self.phy_settings.dfi_d*self.phy_settings.nphases
44 self.hub = asmibus.Hub(aw, dw, time)
45
46 def finalize(self):
47 if self.finalized:
48 raise FinalizeError
49 self.finalized = True
50 self.hub.finalize()
51 slots = self.hub.get_slots()
52 self.refresher = Refresher(self.phy_settings.dfi_a, self.geom_settings.bank_a,
53 self.timing_settings.tRP, self.timing_settings.tREFI, self.timing_settings.tRFC)
54 self.bank_machines = [BankMachine(self.geom_settings, self.timing_settings, self.address_align, i, slots) for i in range(2**self.geom_settings.bank_a)]
55 self.multiplexer = Multiplexer(self.phy_settings, self.geom_settings, self.timing_settings,
56 self.bank_machines, self.refresher,
57 self.dfi, self.hub)
58
59 def get_fragment(self):
60 if not self.finalized:
61 raise FinalizeError
62 return self.hub.get_fragment() + \
63 self.refresher.get_fragment() + \
64 sum([bm.get_fragment() for bm in self.bank_machines], Fragment()) + \
65 self.multiplexer.get_fragment()