vendor.xilinx_{7series,ultrascale}: add (*keep*) on constrained clocks.
authorwhitequark <whitequark@whitequark.org>
Wed, 20 May 2020 04:58:03 +0000 (04:58 +0000)
committerwhitequark <whitequark@whitequark.org>
Wed, 20 May 2020 04:58:03 +0000 (04:58 +0000)
commit892cff059b37ef343bdadcd003ecf64b3795541f
treeb7df1bc77512f114c8161f2422c58f15a3ff71ae
parent7ea81f5f06be949ea3940152c8ce1ead3d0712b1
vendor.xilinx_{7series,ultrascale}: add (*keep*) on constrained clocks.

If the clock signal is not a top-level port and has aliases, it can
be optimized out, and then the constraint will no longer apply.
To prevent this, make sure the constrained signal is preferred over
any aliases by using the `keep` attribute.

Vivado does not parse attributes like (* keep = 32'd1 *) as valid
even though, AFAICT, they are equivalent to (* keep = 1 *) or simply
(* keep *) per IEEE 1364. To work around this, use the solution we
currently use for Quartus, which is `write_verilog -decimal`.

Fixes #373.
nmigen/vendor/intel.py
nmigen/vendor/xilinx_7series.py
nmigen/vendor/xilinx_ultrascale.py