litex/misoclib/lasmicon/__init__.py

55 lines
2.3 KiB
Python
Raw Normal View History

2013-06-24 10:55:59 -04:00
from collections import namedtuple
2013-06-11 08:18:16 -04:00
from migen.fhdl.std import *
from migen.bus import dfi, lasmibus
2013-11-09 09:27:32 -05:00
from misoclib.lasmicon.refresher import *
from misoclib.lasmicon.bankmachine import *
from misoclib.lasmicon.multiplexer import *
2013-06-11 08:18:16 -04:00
2014-08-08 09:55:12 -04:00
PhySettingsT = namedtuple("PhySettings", "memtype dfi_d nphases rdphase wrphase rdcmdphase wrcmdphase cl cwl read_latency write_latency")
def PhySettings(memtype, dfi_d, nphases, rdphase, wrphase, rdcmdphase, wrcmdphase, cl, read_latency, write_latency, cwl=0):
return PhySettingsT(memtype, dfi_d, nphases, rdphase, wrphase, rdcmdphase, wrcmdphase, cl, cwl, read_latency, write_latency)
2013-06-11 08:18:16 -04:00
2014-08-08 09:55:12 -04:00
GeomSettingsT = namedtuple("_GeomSettings", "bank_a row_a col_a mux_a")
def GeomSettings(bank_a, row_a, col_a):
return GeomSettingsT(bank_a, row_a, col_a, max(row_a, col_a))
2013-06-11 08:18:16 -04:00
2013-06-24 10:55:59 -04:00
TimingSettings = namedtuple("TimingSettings", "tRP tRCD tWR tWTR tREFI tRFC" \
" req_queue_size read_time write_time")
2013-06-11 08:18:16 -04:00
class LASMIcon(Module):
def __init__(self, phy_settings, geom_settings, timing_settings):
if phy_settings.memtype in ["SDR"]:
burst_length = phy_settings.nphases*1 # command multiplication*SDR
elif phy_settings.memtype in ["DDR", "LPDDR", "DDR2", "DDR3"]:
burst_length = phy_settings.nphases*2 # command multiplication*DDR
2013-06-11 08:18:16 -04:00
address_align = log2_int(burst_length)
self.dfi = dfi.Interface(geom_settings.mux_a,
geom_settings.bank_a,
phy_settings.dfi_d,
phy_settings.nphases)
self.lasmic = lasmibus.Interface(
aw=geom_settings.row_a + geom_settings.col_a - address_align,
dw=phy_settings.dfi_d*phy_settings.nphases,
nbanks=2**geom_settings.bank_a,
req_queue_size=timing_settings.req_queue_size,
2013-07-17 07:58:58 -04:00
read_latency=phy_settings.read_latency+1,
write_latency=phy_settings.write_latency+1)
2013-06-11 08:18:16 -04:00
self.nrowbits = geom_settings.col_a - address_align
###
self.submodules.refresher = Refresher(geom_settings.mux_a, geom_settings.bank_a,
timing_settings.tRP, timing_settings.tREFI, timing_settings.tRFC)
self.submodules.bank_machines = [BankMachine(geom_settings, timing_settings, address_align, i,
getattr(self.lasmic, "bank"+str(i)))
for i in range(2**geom_settings.bank_a)]
self.submodules.multiplexer = Multiplexer(phy_settings, geom_settings, timing_settings,
self.bank_machines, self.refresher,
self.dfi, self.lasmic)
2013-06-15 06:51:11 -04:00
def get_csrs(self):
return self.multiplexer.get_csrs()