build.plat,vendor: always synchronize reset in default sync domain.
authorwhitequark <whitequark@whitequark.org>
Wed, 9 Oct 2019 20:02:33 +0000 (20:02 +0000)
committerwhitequark <whitequark@whitequark.org>
Wed, 9 Oct 2019 20:02:33 +0000 (20:02 +0000)
commitb9e57fd67baae74f4063965ce51a1baa8743d9d2
treef062cefcaed2014237dbc589dbc19f4b95d46d4f
parent2512a9a12d2c062b8f34330c379ec523b125f38d
build.plat,vendor: always synchronize reset in default sync domain.

This change achieves two related goals.

First, default_rst is no longer assumed to be synchronous to
default_clk, which is  the safer option, since it can be connected to
e.g. buttons on some evaluation boards.

Second, since the power-on / configuration reset is inherently
asynchronous to any user clock, the default create_missing_domain()
behavior is to use a reset synchronizer with `0` as input. Since,
like all reset synchronizers, it uses Signal(reset=1) for its
synchronization stages, after power-on reset it keeps its subordinate
clock domain in reset, and releases it after fabric flops start
toggling.

The latter change is helpful to architectures that lack an end-of-
configuration signal, i.e. most of them. ECP5 was already using
a similar scheme (and is not changed here). Xilinx devices with EOS
use EOS to drive a BUFGMUX, which is more efficient than using
a global reset when the design does not need one; Xilinx devices
without EOS use the new scheme. iCE40 requires a post-configuration
timer because of BRAM silicon bug, and was changed to add a reset
synchronizer if user clock is provided.
nmigen/build/plat.py
nmigen/vendor/lattice_ice40.py
nmigen/vendor/xilinx_7series.py
nmigen/vendor/xilinx_spartan_3_6.py