vendor.xilinx_{7series,ultrascale}: use BUFGCTRL rather than BUFGCE.
authorwhitequark <whitequark@whitequark.org>
Fri, 31 Jul 2020 14:45:38 +0000 (14:45 +0000)
committerwhitequark <whitequark@whitequark.org>
Fri, 31 Jul 2020 17:48:22 +0000 (17:48 +0000)
Fixes #438 (again).

nmigen/vendor/xilinx_7series.py
nmigen/vendor/xilinx_ultrascale.py

index 8b99ca52869f96e447d99d422325a774271e6294..e5ab75055379ba038ae376719ea7c7431fd30552 100644 (file)
@@ -168,10 +168,12 @@ class Xilinx7SeriesPlatform(TemplatedPlatform):
             ready = Signal()
             m.submodules += Instance("STARTUPE2", o_EOS=ready)
             m.domains += ClockDomain("sync", reset_less=self.default_rst is None)
-            m.submodules += Instance("BUFGCE",
-                p_SIM_DEVICE="7SERIES",
-                i_CE=ready,
-                i_I=clk_i,
+            # Actually use BUFGCTRL configured as BUFGCE, since using BUFGCE causes sim/synth
+            # mismatches with Vivado 2019.2, and the suggested workaround (SIM_DEVICE parameter)
+            # breaks Vivado 2017.4.
+            m.submodules += Instance("BUFGCTRL",
+                i_I0=clk_i,   i_S0=C(1, 1), i_CE0=ready,   i_IGNORE0=C(0, 1),
+                i_I1=C(1, 1), i_S1=C(0, 1), i_CE1=C(0, 1), i_IGNORE1=C(1, 1),
                 o_O=ClockSignal("sync")
             )
             if self.default_rst is not None:
index a22b335cbf1f4441106fcf4a2006a8778ffa9ff9..4d8a0766462468d5b5dae291edeb68c88cd3f82c 100644 (file)
@@ -168,10 +168,12 @@ class XilinxUltraScalePlatform(TemplatedPlatform):
             ready = Signal()
             m.submodules += Instance("STARTUPE3", o_EOS=ready)
             m.domains += ClockDomain("sync", reset_less=self.default_rst is None)
-            m.submodules += Instance("BUFGCE",
-                p_SIM_DEVICE="ULTRASCALE",
-                i_CE=ready,
-                i_I=clk_i,
+            # Actually use BUFGCTRL configured as BUFGCE, since using BUFGCE causes sim/synth
+            # mismatches with Vivado 2019.2, and the suggested workaround (SIM_DEVICE parameter)
+            # breaks Vivado 2017.4.
+            m.submodules += Instance("BUFGCTRL",
+                i_I0=clk_i,   i_S0=C(1, 1), i_CE0=ready,   i_IGNORE0=C(0, 1),
+                i_I1=C(1, 1), i_S1=C(0, 1), i_CE1=C(0, 1), i_IGNORE1=C(1, 1),
                 o_O=ClockSignal("sync")
             )
             if self.default_rst is not None: