diff --git a/mibuild/xilinx/common.py b/mibuild/xilinx/common.py index 207711efa..ba125659d 100644 --- a/mibuild/xilinx/common.py +++ b/mibuild/xilinx/common.py @@ -104,10 +104,10 @@ class XilinxDifferentialOutput: class XilinxDDROutputImpl(Module): def __init__(self, i1, i2, o, clk): - self.specials += Instance("ODDR", - p_DDR_CLK_EDGE="SAME_EDGE", - i_C=clk, i_CE=1, i_S=0, i_R=0, - i_D1=i1, i_D2=i2, o_Q=o, + self.specials += Instance("ODDR2", + p_DDR_ALIGNMENT="NONE", p_INIT=0, p_SRTYPE="SYNC", + i_C0=clk, i_C1=~clk, i_CE=1, i_S=0, i_R=0, + i_D0=i1, i_D1=i2, o_Q=o, ) @@ -116,11 +116,32 @@ class XilinxDDROutput: def lower(dr): return XilinxDDROutputImpl(dr.i1, dr.i2, dr.o, dr.clk) + xilinx_special_overrides = { - NoRetiming: XilinxNoRetiming, - MultiReg: XilinxMultiReg, - AsyncResetSynchronizer: XilinxAsyncResetSynchronizer, - DifferentialInput: XilinxDifferentialInput, - DifferentialOutput: XilinxDifferentialOutput, - DDROutput: XilinxDDROutput + NoRetiming: XilinxNoRetiming, + MultiReg: XilinxMultiReg, + AsyncResetSynchronizer: XilinxAsyncResetSynchronizer, + DifferentialInput: XilinxDifferentialInput, + DifferentialOutput: XilinxDifferentialOutput, + DDROutput: XilinxDDROutput +} + + +class XilinxDDROutputImplS7(Module): + def __init__(self, i1, i2, o, clk): + self.specials += Instance("ODDR", + p_DDR_CLK_EDGE="SAME_EDGE", + i_C=clk, i_CE=1, i_S=0, i_R=0, + i_D1=i1, i_D2=i2, o_Q=o, + ) + + +class XilinxDDROutputS7: + @staticmethod + def lower(dr): + return XilinxDDROutputImplS7(dr.i1, dr.i2, dr.o, dr.clk) + + +xilinx_s7_special_overrides = { + DDROutput: XilinxDDROutputS7 } diff --git a/mibuild/xilinx/platform.py b/mibuild/xilinx/platform.py index cf202b17e..201ad53aa 100644 --- a/mibuild/xilinx/platform.py +++ b/mibuild/xilinx/platform.py @@ -16,6 +16,8 @@ class XilinxPlatform(GenericPlatform): def get_verilog(self, *args, special_overrides=dict(), **kwargs): so = dict(common.xilinx_special_overrides) + if self.device[:3] == "xc7": + so.update(dict(common.xilinx_s7_special_overrides)) so.update(special_overrides) return GenericPlatform.get_verilog(self, *args, special_overrides=so, **kwargs)