amaranth/nmigen/genlib/cdc.py

23 lines
641 B
Python

from ..fhdl import *
__all__ = ["MultiReg"]
class MultiReg(Module):
def __init__(self, i, o, odomain="sys", n=2, reset=0):
self.i = i
self.o = o
self.odomain = odomain
self._regs = [Signal(self.i.bits_sign(), name="cdc{}".format(i),
reset=reset, reset_less=True)#, attrs=("no_retiming",))
for i in range(n)]
def get_fragment(self, platform):
f = Module()
for i, o in zip((self.i, *self._regs), self._regs):
f.sync[self.odomain] += o.eq(i)
f.comb += self.o.eq(self._regs[-1])
return f.lower(platform)