1 from migen
.fhdl
.structure
import *
2 from migen
.bus
import dfi
, asmibus
4 from milkymist
.asmicon
.refresher
import *
5 from milkymist
.asmicon
.bankmachine
import *
6 from milkymist
.asmicon
.multiplexer
import *
9 def __init__(self
, dfi_d
, nphases
, rdphase
, wrphase
):
11 self
.nphases
= nphases
12 self
.rdphase
= rdphase
13 self
.wrphase
= wrphase
16 def __init__(self
, bank_a
, row_a
, col_a
):
20 self
.mux_a
= max(row_a
, col_a
)
23 def __init__(self
, tRP
, tRCD
, tWR
, tREFI
, tRFC
, CL
, rd_delay
, slot_time
, read_time
, write_time
):
31 self
.rd_delay
= rd_delay
33 self
.slot_time
= slot_time
34 self
.read_time
= read_time
35 self
.write_time
= write_time
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
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
)
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
,
67 def get_fragment(self
):
68 if not self
.finalized
:
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()