Document why FFSynchronizer is not used.
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 17 Apr 2021 07:46:26 +0000 (08:46 +0100)
committerStaf Verhaegen <staf@stafverhaegen.be>
Thu, 22 Apr 2021 11:54:58 +0000 (13:54 +0200)
Custom synchronization can be used with less latency than more generic
solutions.

c4m/nmigen/jtag/tap.py

index 5acac0771b8ebad4d2e53ace1df5c49e9cff8c2b..e0c63db0242b32451bed08db310ae7a5e08f423b 100755 (executable)
@@ -563,6 +563,8 @@ class TAP(Elaboratable):
             # update signal is on the JTAG clockdomain, sr.oe is on `domain` clockdomain
             # latch update in `domain` clockdomain and see when it has falling edge.
             # At that edge put isir in sr.oe for one `domain` clockdomain
+            # Using this custom sync <> JTAG domain synchronization avoids the use of
+            # more generic but also higher latency CDC solutions like FFSynchronizer.
             update_core = Signal(name=sr.name+"_update_core")
             update_core_prev = Signal(name=sr.name+"_update_core_prev")
             m.d[domain] += [
@@ -669,6 +671,8 @@ class TAP(Elaboratable):
                 with m.State("READACK"):
                     with m.If(wb.ack):
                         # Store read data in sr_data.i and keep it there til next read
+                        # This is enough to synchronize between sync and JTAG clock domain
+                        # and no higher latency solutions like FFSynchronizer is needed.
                         m.d[domain] += sr_data.i.eq(wb.dat_r)
                         m.next = "IDLE"
                 with m.State("WRITEREAD"):