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_ba
, dfi_d
, nphases
, rdphase
, wrphase
):
13 self
.nphases
= nphases
14 self
.rdphase
= rdphase
15 self
.wrphase
= wrphase
18 def __init__(self
, row_a
, col_a
):
23 def __init__(self
, tREFI
, tRFC
):
28 def __init__(self
, phy_settings
, geom_settings
, timing_settings
, time
=0):
29 self
.phy_settings
= phy_settings
30 self
.geom_settings
= geom_settings
31 self
.timing_settings
= timing_settings
32 self
.finalized
= False
34 self
.dfi
= dfi
.Interface(self
.phy_settings
.dfi_a
,
35 self
.phy_settings
.dfi_ba
,
36 self
.phy_settings
.dfi_d
,
37 self
.phy_settings
.nphases
)
38 burst_length
= self
.phy_settings
.nphases
*2
39 self
.address_align
= log2_int(burst_length
)
40 aw
= self
.phy_settings
.dfi_ba
+ self
.geom_settings
.row_a
+ self
.geom_settings
.col_a
- self
.address_align
41 dw
= self
.phy_settings
.dfi_d
*self
.phy_settings
.nphases
42 self
.hub
= asmibus
.Hub(aw
, dw
, time
)
49 slots
= self
.hub
.get_slots()
50 self
.refresher
= Refresher(self
.timing_settings
)
51 self
.bank_machines
= [BankMachine(self
.geom_settings
, self
.timing_settings
, self
.address_align
, i
, slots
) for i
in range(2**self
.phy_settings
.dfi_ba
)]
52 self
.multiplexer
= Multiplexer(self
.phy_settings
, self
.geom_settings
, self
.timing_settings
,
53 self
.bank_machines
, self
.refresher
,
56 def get_fragment(self
):
57 if not self
.finalized
:
59 return self
.hub
.get_fragment() + \
60 self
.refresher
.get_fragment() + \
61 sum([bm
.get_fragment() for bm
in self
.bank_machines
], Fragment()) + \
62 self
.multiplexer
.get_fragment()