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_a
, dfi_d
, nphases
, rdphase
, wrphase
):
10 # NB: dfi_ba is obtained from GeomSettings.bank_a
13 self
.nphases
= nphases
14 self
.rdphase
= rdphase
15 self
.wrphase
= wrphase
18 def __init__(self
, bank_a
, row_a
, col_a
):
24 def __init__(self
, tRP
, tREFI
, tRFC
):
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
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
)
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
,
59 def get_fragment(self
):
60 if not self
.finalized
:
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()