Merge pull request #286 from mkj/matt/orangecrab

litedram_gen fixes for ECP5
This commit is contained in:
enjoy-digital 2021-11-29 08:36:11 +01:00 committed by GitHub
commit 925dbfd933
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 4 deletions

View File

@ -317,14 +317,19 @@ class LiteDRAMECP5DDRPHYCRG(Module):
self.sync.por += If(~por_done, por_count.eq(por_count - 1)) self.sync.por += If(~por_done, por_count.eq(por_count - 1))
# PLL. # PLL.
sys2x_clk_ecsout = Signal()
self.submodules.pll = pll = ECP5PLL() self.submodules.pll = pll = ECP5PLL()
self.comb += pll.reset.eq(~por_done | rst | self.rst) self.comb += pll.reset.eq(~por_done | rst | self.rst)
pll.register_clkin(clk, core_config["input_clk_freq"]) pll.register_clkin(clk, core_config["input_clk_freq"])
pll.create_clkout(self.cd_sys2x_i, 2*core_config["sys_clk_freq"]) pll.create_clkout(self.cd_sys2x_i, 2*core_config["sys_clk_freq"])
pll.create_clkout(self.cd_init, core_config["init_clk_freq"]) pll.create_clkout(self.cd_init, core_config["init_clk_freq"])
self.specials += [ self.specials += [
Instance("ECLKBRIDGECS",
i_CLK0 = self.cd_sys2x_i.clk,
i_SEL = 0,
o_ECSOUT = sys2x_clk_ecsout),
Instance("ECLKSYNCB", Instance("ECLKSYNCB",
i_ECLKI = self.cd_sys2x_i.clk, i_ECLKI = sys2x_clk_ecsout,
i_STOP = self.stop, i_STOP = self.stop,
o_ECLKO = self.cd_sys2x.clk), o_ECLKO = self.cd_sys2x.clk),
Instance("CLKDIVF", Instance("CLKDIVF",
@ -336,6 +341,7 @@ class LiteDRAMECP5DDRPHYCRG(Module):
AsyncResetSynchronizer(self.cd_sys, ~pll.locked | self.reset), AsyncResetSynchronizer(self.cd_sys, ~pll.locked | self.reset),
AsyncResetSynchronizer(self.cd_sys2x, ~pll.locked | self.reset), AsyncResetSynchronizer(self.cd_sys2x, ~pll.locked | self.reset),
] ]
self.comb += platform.request("pll_locked").eq(pll.locked)
class LiteDRAMS7DDRPHYCRG(Module): class LiteDRAMS7DDRPHYCRG(Module):
def __init__(self, platform, core_config): def __init__(self, platform, core_config):
@ -576,10 +582,15 @@ class LiteDRAMCore(SoCCore):
# ECP5DDRPHY. # ECP5DDRPHY.
elif core_config["sdram_phy"] in [litedram_phys.ECP5DDRPHY]: elif core_config["sdram_phy"] in [litedram_phys.ECP5DDRPHY]:
assert core_config["memtype"] in ["DDR3"] assert core_config["memtype"] in ["DDR3"]
kwargs = {}
if core_config.get("dm_swap", False):
kwargs['dm_remapping'] = {0:1, 1:0}
self.submodules.ddrphy = sdram_phy = core_config["sdram_phy"]( self.submodules.ddrphy = sdram_phy = core_config["sdram_phy"](
pads = platform.request("ddram"), pads = platform.request("ddram"),
sys_clk_freq = sys_clk_freq, sys_clk_freq = sys_clk_freq,
cmd_delay = core_config.get("cmd_delay", 0)) cmd_delay = core_config.get("cmd_delay", 0),
**kwargs)
self.ddrphy.settings.add_electrical_settings(**electrical_settings_kwargs) self.ddrphy.settings.add_electrical_settings(**electrical_settings_kwargs)
self.comb += crg.stop.eq(self.ddrphy.init.stop) self.comb += crg.stop.eq(self.ddrphy.init.stop)
self.comb += crg.reset.eq(self.ddrphy.init.reset) self.comb += crg.reset.eq(self.ddrphy.init.reset)

View File

@ -117,7 +117,8 @@ class ECP5DDRPHY(Module, AutoCSR):
cl = None, cl = None,
cwl = None, cwl = None,
cmd_delay = 0, cmd_delay = 0,
clk_polarity = 0): clk_polarity = 0,
dm_remapping = None):
assert isinstance(cmd_delay, int) and cmd_delay < 128 assert isinstance(cmd_delay, int) and cmd_delay < 128
pads = PHYPadsCombiner(pads) pads = PHYPadsCombiner(pads)
memtype = "DDR3" memtype = "DDR3"
@ -127,6 +128,8 @@ class ECP5DDRPHY(Module, AutoCSR):
nranks = 1 if not hasattr(pads, "cs_n") else len(pads.cs_n) nranks = 1 if not hasattr(pads, "cs_n") else len(pads.cs_n)
databits = len(pads.dq) databits = len(pads.dq)
nphases = 2 nphases = 2
if not dm_remapping:
dm_remapping = {}
assert databits%8 == 0 assert databits%8 == 0
# Init ------------------------------------------------------------------------------------- # Init -------------------------------------------------------------------------------------
@ -327,7 +330,7 @@ class ECP5DDRPHY(Module, AutoCSR):
dm_o_data_d = Signal(8) dm_o_data_d = Signal(8)
dm_o_data_muxed = Signal(4) dm_o_data_muxed = Signal(4)
for n in range(8): for n in range(8):
self.comb += dm_o_data[n].eq(dfi.phases[n//4].wrdata_mask[n%4*databits//8 + i]) self.comb += dm_o_data[n].eq(dfi.phases[n//4].wrdata_mask[n%4*databits//8+dm_remapping.get(i, i)])
self.sync += dm_o_data_d.eq(dm_o_data) self.sync += dm_o_data_d.eq(dm_o_data)
dm_bl8_cases = {} dm_bl8_cases = {}
dm_bl8_cases[0] = dm_o_data_muxed.eq(dm_o_data[:4]) dm_bl8_cases[0] = dm_o_data_muxed.eq(dm_o_data[:4])