lib.cdc: specify maximum input delay in seconds.
authorwhitequark <cz@m-labs.hk>
Tue, 24 Sep 2019 12:30:02 +0000 (12:30 +0000)
committerwhitequark <cz@m-labs.hk>
Tue, 24 Sep 2019 12:30:10 +0000 (12:30 +0000)
Since we use hertz elsewhere, this provides for easy conversions.

Also, cast the delay to string before applying it in xilinx_7series,
to avoid stripping the fractional digits.

Closes #234.

nmigen/lib/cdc.py
nmigen/vendor/xilinx_7series.py

index 452814deb6fcc836fe345e3a31711ab5b032fb94..9e0ad726d6421b2638a38992f4e21c5286e876e7 100644 (file)
@@ -39,7 +39,7 @@ class FFSynchronizer(Elaboratable):
         Number of synchronization stages between input and output. The lowest safe number is 2,
         with higher numbers reducing MTBF further, at the cost of increased latency.
     max_input_delay : None or float
-        Maximum delay from the input signal's clock to the first synchronization stage.
+        Maximum delay from the input signal's clock to the first synchronization stage, in seconds.
         If specified and the platform does not support it, elaboration will fail.
 
     Platform override
@@ -122,7 +122,7 @@ class ResetSynchronizer(Elaboratable):
         Number of synchronization stages between input and output. The lowest safe number is 2,
         with higher numbers reducing MTBF further, at the cost of increased deassertion latency.
     max_input_delay : None or float
-        Maximum delay from the input signal's clock to the first synchronization stage.
+        Maximum delay from the input signal's clock to the first synchronization stage, in seconds.
         If specified and the platform does not support it, elaboration will fail.
 
     Platform override
index da7fd2b2569d72374cc17b1e32dd31edc0327180..ca42054512af1ea585b1c9e76ebc40de32defce4 100644 (file)
@@ -392,7 +392,7 @@ class Xilinx7SeriesPlatform(TemplatedPlatform):
         if ff_sync._max_input_delay is None:
             flops[0].attrs["nmigen.vivado.false_path"] = "TRUE"
         else:
-            flops[0].attrs["nmigen.vivado.max_delay"] = ff_sync._max_input_delay
+            flops[0].attrs["nmigen.vivado.max_delay"] = str(ff_sync._max_input_delay * 1e9)
         for i, o in zip((ff_sync.i, *flops), flops):
             m.d[ff_sync._o_domain] += o.eq(i)
         m.d.comb += ff_sync.o.eq(flops[-1])
@@ -407,7 +407,7 @@ class Xilinx7SeriesPlatform(TemplatedPlatform):
         if reset_sync._max_input_delay is None:
             flops[0].attrs["nmigen.vivado.false_path"] = "TRUE"
         else:
-            flops[0].attrs["nmigen.vivado.max_delay"] = reset_sync._max_input_delay
+            flops[0].attrs["nmigen.vivado.max_delay"] = str(reset_sync._max_input_delay * 1e9)
         for i, o in zip((0, *flops), flops):
             m.d.reset_sync += o.eq(i)
         m.d.comb += [