modules: improve timings definition (keep retro-compatibility with previous definitions)

This commit is contained in:
Florent Kermarrec 2018-10-02 10:32:45 +02:00
parent 5b02791580
commit ad0a1d4215
1 changed files with 92 additions and 193 deletions

View File

@ -1,10 +1,17 @@
from math import ceil
from collections import namedtuple
from migen import *
from litedram.common import GeomSettings, TimingSettings
_technology_timings = ["tREFI", "tWTR", "tCCD", "tRRD"]
_TechnologyTimings = namedtuple("TechnologyTimings", _technology_timings)
_speedgrade_timings = ["tRP", "tRCD", "tWR", "tRFC", "tFAW", "tRC", "tRAS"]
_SpeedgradeTimings = namedtuple("SpeedgradeTimings", _speedgrade_timings)
class SDRAMModule:
"""SDRAM module geometry and timings.
@ -40,12 +47,25 @@ class SDRAMModule:
)
def get(self, name):
if self.speedgrade is not None and name in ["tRP", "tRCD", "tWR", "tRFC", "tFAW"]:
name += "_" + self.speedgrade
try:
return getattr(self, name)
except:
return None
if name in _speedgrade_timings:
if hasattr(self, "speedgrade_timings"):
speedgrade = "default" if self.speedgrade is None else self.speedgrade
return getattr(self.speedgrade_timings[speedgrade], name)
else:
name = name + "_" + self.speedgrade if self.speedgrade is not None else name
try:
return getattr(self, name)
except:
return None
else:
if hasattr(self, "technology_timings"):
return getattr(self.technology_timings, name)
else:
try:
return getattr(self, name)
except:
return None
def ns_to_cycles_trrd(self, t):
lower_bound = {
@ -92,15 +112,10 @@ class IS42S16160(SDRAMModule):
nbanks = 4
nrows = 8192
ncols = 512
# speedgrade invariant timings
tREFI = 64e6/8192
tWTR = (2, None)
tCCD = (1, None)
# speedgrade related timings
tRP = 20
tRCD = 20
tWR = 20
tRFC = 70
# timings
technology_timings = _TechnologyTimings(tREFI=64e6/8192, tWTR=(2, None), tCCD=(1, None), tRRD=None)
speedgrade_timings = {"default": _SpeedgradeTimings(tRP=20, tRCD=20, tWR=20, tRFC=70, tFAW=None, tRC=None, tRAS=None)}
class MT48LC4M16(SDRAMModule):
memtype = "SDR"
@ -108,15 +123,9 @@ class MT48LC4M16(SDRAMModule):
nbanks = 4
nrows = 4096
ncols = 256
# speedgrade invariant timings
tREFI = 64e6/4096
tWTR = (2, None)
tCCD = (1, None)
# speedgrade related timings
tRP = 15
tRCD = 15
tWR = 14
tRFC = 66
# timings
technology_timings = _TechnologyTimings(tREFI=64e6/8192, tWTR=(2, None), tCCD=(1, None), tRRD=None)
speedgrade_timings = {"default": _SpeedgradeTimings(tRP=15, tRCD=15, tWR=14, tRFC=66, tFAW=None, tRC=None, tRAS=None)}
class AS4C16M16(SDRAMModule):
@ -125,15 +134,9 @@ class AS4C16M16(SDRAMModule):
nbanks = 4
nrows = 8192
ncols = 512
# speedgrade invariant timings
tREFI = 64e6/8192
tWTR = (2, None)
tCCD = (1, None)
# speedgrade related timings
tRP = 18
tRCD = 18
tWR = 12
tRFC = 60
# timings
technology_timings = _TechnologyTimings(tREFI=64e6/8192, tWTR=(2, None), tCCD=(1, None), tRRD=None)
speedgrade_timings = {"default": _SpeedgradeTimings(tRP=18, tRCD=18, tWR=12, tRFC=60, tFAW=None, tRC=None, tRAS=None)}
# DDR
@ -143,15 +146,9 @@ class MT46V32M16(SDRAMModule):
nbanks = 4
nrows = 8192
ncols = 1024
# speedgrade invariant timings
tREFI = 64e6/8192
tWTR = (2, None)
tCCD = (1, None)
# speedgrade related timings
tRP = 15
tRCD = 15
tWR = 15
tRFC = 70
# timings
technology_timings = _TechnologyTimings(tREFI=64e6/8192, tWTR=(2, None), tCCD=(1, None), tRRD=None)
speedgrade_timings = {"default": _SpeedgradeTimings(tRP=15, tRCD=15, tWR=15, tRFC=70, tFAW=None, tRC=None, tRAS=None)}
# LPDDR
@ -161,15 +158,9 @@ class MT46H32M16(SDRAMModule):
nbanks = 4
nrows = 8192
ncols = 1024
# speedgrade invariant timings
tREFI = 64e6/8192
tWTR = (2, None)
tCCD = (1, None)
# speedgrade related timings
tRP = 15
tRCD = 15
tWR = 15
tRFC = 72
# timings
technology_timings = _TechnologyTimings(tREFI=64e6/8192, tWTR=(2, None), tCCD=(1, None), tRRD=None)
speedgrade_timings = {"default": _SpeedgradeTimings(tRP=15, tRCD=15, tWR=15, tRFC=72, tFAW=None, tRC=None, tRAS=None)}
class MT46H32M32(SDRAMModule):
@ -178,15 +169,9 @@ class MT46H32M32(SDRAMModule):
nbanks = 4
nrows = 8192
ncols = 1024
# speedgrade invariant timings
tREFI = 64e6/8192
tWTR = (1, None)
tCCD = (1, None)
# speedgrade related timings
tRP = 15
tRCD = 15
tWR = 15
tRFC = 72
# timings
technology_timings = _TechnologyTimings(tREFI=64e6/8192, tWTR=(1, None), tCCD=(1, None), tRRD=None)
speedgrade_timings = {"default": _SpeedgradeTimings(tRP=15, tRCD=15, tWR=15, tRFC=72, tFAW=None, tRC=None, tRAS=None)}
# DDR2
@ -196,15 +181,9 @@ class MT47H128M8(SDRAMModule):
nbanks = 8
nrows = 16384
ncols = 1024
# speedgrade invariant timings
tREFI = 64e6/8192
tWTR = (None, 7.5)
tCCD = (2, None)
# speedgrade related timings
tRP = 15
tRCD = 15
tWR = 15
tRFC = 127.5
# timings
technology_timings = _TechnologyTimings(tREFI=64e6/8192, tWTR=(None, 7.5), tCCD=(2, None), tRRD=None)
speedgrade_timings = {"default": _SpeedgradeTimings(tRP=15, tRCD=15, tWR=15, tRFC=127.5, tFAW=None, tRC=None, tRAS=None)}
class MT47H64M16(SDRAMModule):
@ -213,16 +192,9 @@ class MT47H64M16(SDRAMModule):
nbanks = 8
nrows = 8192
ncols = 1024
# speedgrade invariant timings
tREFI = 64e6/8192
tWTR = (None, 7.5)
tCCD = (2, None)
# speedgrade related timings
tRP = 15
tRCD = 15
tWR = 15
tREFI = 64e6/8192
tRFC = 127.5
# timings
technology_timings = _TechnologyTimings(tREFI=64e6/8192, tWTR=(None, 7.5), tCCD=(2, None), tRRD=None)
speedgrade_timings = {"default": _SpeedgradeTimings(tRP=15, tRCD=15, tWR=15, tRFC=127.5, tFAW=None, tRC=None, tRAS=None)}
class P3R1GE4JGF(SDRAMModule):
@ -231,16 +203,9 @@ class P3R1GE4JGF(SDRAMModule):
nbanks = 8
nrows = 8192
ncols = 1024
# speedgrade invariant timings
tREFI = 64e6/8192
tWTR = (None, 7.5)
tCCD = (2, None)
# speedgrade related timings
tRP = 12.5
tRCD = 12.5
tWR = 15
tREFI = 64e6/8192
tRFC = 127.5
# timings
technology_timings = _TechnologyTimings(tREFI=64e6/8192, tWTR=(None, 7.5), tCCD=(2, None), tRRD=None)
speedgrade_timings = {"default": _SpeedgradeTimings(tRP=12.5, tRCD=12.5, tWR=15, tRFC=127.5, tFAW=None, tRC=None, tRAS=None)}
# DDR3 (Chips)
@ -250,73 +215,43 @@ class MT41J128M16(SDRAMModule):
nbanks = 8
nrows = 16384
ncols = 1024
# speedgrade invariant timings
tREFI = 64e6/8192
tWTR = (4, 7.5)
tCCD = (4, None)
tRRD = 10
# speedgrade related timings
# DDR3-800
tRP_800 = 13.1
tRCD_800 = 13.1
tWR_800 = 13.1
tRFC_800 = 64
tFAW_800 = (None, 50)
tRC_800 = 50.625
tRAS_800 = 37.5
# DDR3-1066
tRP_1066 = 13.1
tRCD_1066 = 13.1
tWR_1066 = 13.1
tRFC_1066 = 86
tFAW_1066 = (None, 50)
tRC_1066 = 50.625
tRAS_1066 = 37.5
# DDR3-1333
tRP_1333 = 13.5
tRCD_1333 = 13.5
tWR_1333 = 13.5
tRFC_1333 = 107
tFAW_1333 = (None, 45)
tRC_1333 = 49.5
tRAS_1333 = 36
# DDR3-1600
tRP_1600 = 13.75
tRCD_1600 = 13.75
tWR_1600 = 13.75
tRFC_1600 = 128
tFAW_1600 = (None, 40)
tRC_1600 = 48.75
tRAS_1600 = 35
# API retro-compatibility
tRP = tRP_1600
tRCD = tRCD_1600
tWR = tWR_1600
tRFC = tRFC_1600
tFAW = tFAW_1600
tRC = tRC_1600
tRAS = tRAS_1600
# timings
technology_timings = _TechnologyTimings(tREFI=64e6/8192, tWTR=(4, 7.5), tCCD=(4, None), tRRD=10)
speedgrade_timings = {
"800": _SpeedgradeTimings(tRP=13.1, tRCD=13.1, tWR=13.1, tRFC=64, tFAW=(None, 50), tRC=50.625, tRAS=37.5),
"1066": _SpeedgradeTimings(tRP=13.1, tRCD=13.1, tWR=13.1, tRFC=86, tFAW=(None, 50), tRC=50.625, tRAS=37.5),
"1333": _SpeedgradeTimings(tRP=13.5, tRCD=13.5, tWR=13.5, tRFC=107, tFAW=(None, 45), tRC=49.5, tRAS=36),
"1600": _SpeedgradeTimings(tRP=13.75, tRCD=13.75, tWR=13.75, tRFC=128, tFAW=(None, 40), tRC=48.75, tRAS=35),
}
speedgrade_timings["default"] = speedgrade_timings["1600"]
class MT41K128M16(MT41J128M16):
pass
class MT41J256M16(MT41J128M16):
class MT41J256M16(SDRAMModule):
memtype = "DDR3"
# geometry
nbanks = 8
nrows = 32768
# speedgrade related timings
tRFC_1066 = 139
tRFC_1333 = 174
tRFC_1600 = 208
# API retro-compatibility
tRFC = tRFC_1600
ncols = 1024
# timings
technology_timings = _TechnologyTimings(tREFI=64e6/8192, tWTR=(4, 7.5), tCCD=(4, None), tRRD=10)
speedgrade_timings = {
"800": _SpeedgradeTimings(tRP=13.1, tRCD=13.1, tWR=13.1, tRFC=139, tFAW=(None, 50), tRC=50.625, tRAS=37.5),
"1066": _SpeedgradeTimings(tRP=13.1, tRCD=13.1, tWR=13.1, tRFC=138, tFAW=(None, 50), tRC=50.625, tRAS=37.5),
"1333": _SpeedgradeTimings(tRP=13.5, tRCD=13.5, tWR=13.5, tRFC=174, tFAW=(None, 45), tRC=49.5, tRAS=36),
"1600": _SpeedgradeTimings(tRP=13.75, tRCD=13.75, tWR=13.75, tRFC=208, tFAW=(None, 40), tRC=48.75, tRAS=35),
}
speedgrade_timings["default"] = speedgrade_timings["1600"]
class MT41K256M16(MT41J256M16):
pass
# FIXME: update to new definition when fully tested (old definition still handled)
class K4B2G1646FBCK0(SDRAMModule): ### TODO: optimize and revalidate all timings, at cold and hot temperatures
memtype = "DDR3"
# geometry
@ -350,29 +285,13 @@ class MT8JTF12864(SDRAMModule):
nbanks = 8
nrows = 16384
ncols = 1024
# speedgrade invariant timings
tREFI = 64e6/8192
tWTR = (4, 7.5)
tCCD = (4, None)
# speedgrade related timings
# DDR3-1066
tRP_1066 = 15
tRCD_1066 = 15
tWR_1066 = 15
tRFC_1066 = 86
tFAW_1066 = (None, 50)
# DDR3-1333
tRP_1333 = 15
tRCD_1333 = 15
tWR_1333 = 15
tRFC_1333 = 107
tFAW_1333 = (None, 45)
# API retro-compatibility
tRP = tRP_1333
tRCD = tRCD_1333
tWR = tWR_1333
tRFC = tRFC_1333
tFAW = tFAW_1333
# timings
technology_timings = _TechnologyTimings(tREFI=64e6/8192, tWTR=(4, 7.5), tCCD=(4, None), tRRD=None)
speedgrade_timings = {
"1066": _SpeedgradeTimings(tRP=15, tRCD=15, tWR=15, tRFC=86, tFAW=(None, 50), tRC=None, tRAS=None),
"1333": _SpeedgradeTimings(tRP=15, tRCD=15, tWR=15, tRFC=107, tFAW=(None, 45), tRC=None, tRAS=None),
}
speedgrade_timings["default"] = speedgrade_timings["1333"]
class MT18KSF1G72HZ(SDRAMModule):
@ -381,31 +300,11 @@ class MT18KSF1G72HZ(SDRAMModule):
nbanks = 8
nrows = 65536
ncols = 1024
# speedgrade invariant timings
tREFI = 64e6/8192
tWTR = (4, 7.5)
tCCD = (4, None)
# DDR3-1066
tRP_1066 = 15
tRCD_1066 = 15
tWR_1066 = 15
tRFC_1066 = 86
tFAW_1066 = (None, 50)
# DDR3-1333
tRP_1333 = 15
tRCD_1333 = 15
tWR_1333 = 15
tRFC_1333 = 107
tFAW_1333 = (None, 45)
# DDR3-1600
tRP_1600 = 13.125
tRCD_1600 = 13.125
tWR_1600 = 13.125
tRFC_1600 = 128
tFAW_1600 = (None, 40)
# API retro-compatibility
tRP = tRP_1600
tRCD = tRCD_1600
tWR = tWR_1600
tRFC = tRFC_1600
tFAW = tFAW_1600
# timings
technology_timings = _TechnologyTimings(tREFI=64e6/8192, tWTR=(4, 7.5), tCCD=(4, None), tRRD=None)
speedgrade_timings = {
"1066": _SpeedgradeTimings(tRP=15, tRCD=15, tWR=15, tRFC=86, tFAW=(None, 50), tRC=None, tRAS=None),
"1333": _SpeedgradeTimings(tRP=15, tRCD=15, tWR=15, tRFC=107, tFAW=(None, 45), tRC=None, tRAS=None),
"1600": _SpeedgradeTimings(tRP=13.125, tRCD=13.125, tWR=13.125, tRFC=128, tFAW=(None, 40), tRC=None, tRAS=None),
}
speedgrade_timings["default"] = speedgrade_timings["1600"]