asmicon: move slot time to timing settings
[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_d, nphases, rdphase, wrphase):
10 self.dfi_d = dfi_d
11 self.nphases = nphases
12 self.rdphase = rdphase
13 self.wrphase = wrphase
14
15 class GeomSettings:
16 def __init__(self, bank_a, row_a, col_a):
17 self.bank_a = bank_a
18 self.row_a = row_a
19 self.col_a = col_a
20 self.mux_a = max(row_a, col_a)
21
22 class TimingSettings:
23 def __init__(self, tRP, tRCD, tREFI, tRFC, slot_time):
24 self.tRP = tRP
25 self.tRCD = tRCD
26 self.tREFI = tREFI
27 self.tRFC = tRFC
28 self.slot_time = slot_time
29
30 class ASMIcon:
31 def __init__(self, phy_settings, geom_settings, timing_settings):
32 self.phy_settings = phy_settings
33 self.geom_settings = geom_settings
34 self.timing_settings = timing_settings
35 self.finalized = False
36
37 self.dfi = dfi.Interface(self.geom_settings.mux_a,
38 self.geom_settings.bank_a,
39 self.phy_settings.dfi_d,
40 self.phy_settings.nphases)
41 burst_length = self.phy_settings.nphases*2
42 self.address_align = log2_int(burst_length)
43 aw = self.geom_settings.bank_a + self.geom_settings.row_a + self.geom_settings.col_a - self.address_align
44 dw = self.phy_settings.dfi_d*self.phy_settings.nphases
45 self.hub = asmibus.Hub(aw, dw, self.timing_settings.slot_time)
46
47 def finalize(self):
48 if self.finalized:
49 raise FinalizeError
50 self.finalized = True
51 self.hub.finalize()
52 slots = self.hub.get_slots()
53 self.refresher = Refresher(self.geom_settings.mux_a, self.geom_settings.bank_a,
54 self.timing_settings.tRP, self.timing_settings.tREFI, self.timing_settings.tRFC)
55 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)]
56 self.multiplexer = Multiplexer(self.phy_settings, self.geom_settings, self.timing_settings,
57 self.bank_machines, self.refresher,
58 self.dfi, self.hub)
59
60 def get_fragment(self):
61 if not self.finalized:
62 raise FinalizeError
63 return self.hub.get_fragment() + \
64 self.refresher.get_fragment() + \
65 sum([bm.get_fragment() for bm in self.bank_machines], Fragment()) + \
66 self.multiplexer.get_fragment()