0d7564a84a1f081faaa3618c1d9191ddb8e67e3d
[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, tWR, tREFI, tRFC, CL, rd_delay, slot_time, read_time, write_time):
24 self.tRP = tRP
25 self.tRCD = tRCD
26 self.tWR = tWR
27 self.tREFI = tREFI
28 self.tRFC = tRFC
29
30 self.CL = CL
31 self.rd_delay = rd_delay
32
33 self.slot_time = slot_time
34 self.read_time = read_time
35 self.write_time = write_time
36
37 class ASMIcon:
38 def __init__(self, phy_settings, geom_settings, timing_settings):
39 self.phy_settings = phy_settings
40 self.geom_settings = geom_settings
41 self.timing_settings = timing_settings
42 self.finalized = False
43
44 self.dfi = dfi.Interface(self.geom_settings.mux_a,
45 self.geom_settings.bank_a,
46 self.phy_settings.dfi_d,
47 self.phy_settings.nphases)
48 burst_length = self.phy_settings.nphases*2
49 self.address_align = log2_int(burst_length)
50 aw = self.geom_settings.bank_a + self.geom_settings.row_a + self.geom_settings.col_a - self.address_align
51 dw = self.phy_settings.dfi_d*self.phy_settings.nphases
52 self.hub = asmibus.Hub(aw, dw, self.timing_settings.slot_time)
53
54 def finalize(self):
55 if self.finalized:
56 raise FinalizeError
57 self.finalized = True
58 self.hub.finalize()
59 slots = self.hub.get_slots()
60 self.refresher = Refresher(self.geom_settings.mux_a, self.geom_settings.bank_a,
61 self.timing_settings.tRP, self.timing_settings.tREFI, self.timing_settings.tRFC)
62 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)]
63 self.multiplexer = Multiplexer(self.phy_settings, self.geom_settings, self.timing_settings,
64 self.bank_machines, self.refresher,
65 self.dfi, self.hub)
66
67 def get_fragment(self):
68 if not self.finalized:
69 raise FinalizeError
70 return self.hub.get_fragment() + \
71 self.refresher.get_fragment() + \
72 sum([bm.get_fragment() for bm in self.bank_machines], Fragment()) + \
73 self.multiplexer.get_fragment()