forked from M-Labs/artiq
drtio: add false paths between sys and transceiver clocks
This commit is contained in:
parent
4b97b9f8ce
commit
5d145ff912
|
@ -11,9 +11,8 @@ class GTX_20X(Module):
|
||||||
# The transceiver clock on clock_pads must be at the RTIO clock
|
# The transceiver clock on clock_pads must be at the RTIO clock
|
||||||
# frequency when clock_div2=False, and 2x that frequency when
|
# frequency when clock_div2=False, and 2x that frequency when
|
||||||
# clock_div2=True.
|
# clock_div2=True.
|
||||||
def __init__(self, platform,
|
def __init__(self, clock_pads, tx_pads, rx_pads, sys_clk_freq,
|
||||||
clock_pads, tx_pads, rx_pads,
|
clock_div2=False):
|
||||||
sys_clk_freq, clock_div2=False):
|
|
||||||
self.submodules.encoder = ClockDomainsRenamer("rtio")(
|
self.submodules.encoder = ClockDomainsRenamer("rtio")(
|
||||||
Encoder(2, True))
|
Encoder(2, True))
|
||||||
self.decoders = [ClockDomainsRenamer("rtio_rx")(
|
self.decoders = [ClockDomainsRenamer("rtio_rx")(
|
||||||
|
@ -22,6 +21,11 @@ class GTX_20X(Module):
|
||||||
|
|
||||||
self.rx_ready = Signal()
|
self.rx_ready = Signal()
|
||||||
|
|
||||||
|
# transceiver direct clock outputs
|
||||||
|
# useful to specify clock constraints in a way palatable to Vivado
|
||||||
|
self.txoutclk = Signal()
|
||||||
|
self.rxoutclk = Signal()
|
||||||
|
|
||||||
# # #
|
# # #
|
||||||
|
|
||||||
refclk = Signal()
|
refclk = Signal()
|
||||||
|
@ -50,9 +54,7 @@ class GTX_20X(Module):
|
||||||
self.comb += tx_init.cplllock.eq(cplllock), \
|
self.comb += tx_init.cplllock.eq(cplllock), \
|
||||||
rx_init.cplllock.eq(cplllock)
|
rx_init.cplllock.eq(cplllock)
|
||||||
|
|
||||||
txoutclk = Signal()
|
|
||||||
txdata = Signal(20)
|
txdata = Signal(20)
|
||||||
rxoutclk = Signal()
|
|
||||||
rxdata = Signal(20)
|
rxdata = Signal(20)
|
||||||
self.specials += \
|
self.specials += \
|
||||||
Instance("GTXE2_CHANNEL",
|
Instance("GTXE2_CHANNEL",
|
||||||
|
@ -88,7 +90,7 @@ class GTX_20X(Module):
|
||||||
# TX clock
|
# TX clock
|
||||||
p_TXBUF_EN="FALSE",
|
p_TXBUF_EN="FALSE",
|
||||||
p_TX_XCLK_SEL="TXUSR",
|
p_TX_XCLK_SEL="TXUSR",
|
||||||
o_TXOUTCLK=txoutclk,
|
o_TXOUTCLK=self.txoutclk,
|
||||||
i_TXSYSCLKSEL=0b00,
|
i_TXSYSCLKSEL=0b00,
|
||||||
i_TXOUTCLKSEL=0b11,
|
i_TXOUTCLKSEL=0b11,
|
||||||
|
|
||||||
|
@ -134,7 +136,7 @@ class GTX_20X(Module):
|
||||||
i_RXDDIEN=1,
|
i_RXDDIEN=1,
|
||||||
i_RXSYSCLKSEL=0b00,
|
i_RXSYSCLKSEL=0b00,
|
||||||
i_RXOUTCLKSEL=0b010,
|
i_RXOUTCLKSEL=0b010,
|
||||||
o_RXOUTCLK=rxoutclk,
|
o_RXOUTCLK=self.rxoutclk,
|
||||||
i_RXUSRCLK=ClockSignal("rtio_rx"),
|
i_RXUSRCLK=ClockSignal("rtio_rx"),
|
||||||
i_RXUSRCLK2=ClockSignal("rtio_rx"),
|
i_RXUSRCLK2=ClockSignal("rtio_rx"),
|
||||||
p_RXCDR_CFG=0x03000023FF10100020,
|
p_RXCDR_CFG=0x03000023FF10100020,
|
||||||
|
@ -165,7 +167,7 @@ class GTX_20X(Module):
|
||||||
self.sync += tx_reset_deglitched.eq(~tx_init.done)
|
self.sync += tx_reset_deglitched.eq(~tx_init.done)
|
||||||
self.clock_domains.cd_rtio = ClockDomain()
|
self.clock_domains.cd_rtio = ClockDomain()
|
||||||
self.specials += [
|
self.specials += [
|
||||||
Instance("BUFG", i_I=txoutclk, o_O=self.cd_rtio.clk),
|
Instance("BUFG", i_I=self.txoutclk, o_O=self.cd_rtio.clk),
|
||||||
AsyncResetSynchronizer(self.cd_rtio, tx_reset_deglitched)
|
AsyncResetSynchronizer(self.cd_rtio, tx_reset_deglitched)
|
||||||
]
|
]
|
||||||
rx_reset_deglitched = Signal()
|
rx_reset_deglitched = Signal()
|
||||||
|
@ -173,12 +175,9 @@ class GTX_20X(Module):
|
||||||
self.sync.rtio += rx_reset_deglitched.eq(~rx_init.done)
|
self.sync.rtio += rx_reset_deglitched.eq(~rx_init.done)
|
||||||
self.clock_domains.cd_rtio_rx = ClockDomain()
|
self.clock_domains.cd_rtio_rx = ClockDomain()
|
||||||
self.specials += [
|
self.specials += [
|
||||||
Instance("BUFG", i_I=rxoutclk, o_O=self.cd_rtio_rx.clk),
|
Instance("BUFG", i_I=self.rxoutclk, o_O=self.cd_rtio_rx.clk),
|
||||||
AsyncResetSynchronizer(self.cd_rtio_rx, rx_reset_deglitched)
|
AsyncResetSynchronizer(self.cd_rtio_rx, rx_reset_deglitched)
|
||||||
]
|
]
|
||||||
platform.add_period_constraint(txoutclk, 1e9/self.rtio_clk_freq)
|
|
||||||
platform.add_period_constraint(rxoutclk, 1e9/self.rtio_clk_freq)
|
|
||||||
platform.add_false_path_constraints(txoutclk, rxoutclk)
|
|
||||||
|
|
||||||
self.comb += [
|
self.comb += [
|
||||||
txdata.eq(Cat(self.encoder.output[0], self.encoder.output[1])),
|
txdata.eq(Cat(self.encoder.output[0], self.encoder.output[1])),
|
||||||
|
|
|
@ -59,7 +59,6 @@ class Master(MiniSoC, AMPSoC):
|
||||||
# GTX_1000BASE_BX10 Ethernet compatible, 62.5MHz RTIO clock
|
# GTX_1000BASE_BX10 Ethernet compatible, 62.5MHz RTIO clock
|
||||||
# simple TTLs
|
# simple TTLs
|
||||||
self.submodules.transceiver = gtx_7series.GTX_1000BASE_BX10(
|
self.submodules.transceiver = gtx_7series.GTX_1000BASE_BX10(
|
||||||
platform=platform,
|
|
||||||
clock_pads=platform.request("sgmii_clock"),
|
clock_pads=platform.request("sgmii_clock"),
|
||||||
tx_pads=tx_pads,
|
tx_pads=tx_pads,
|
||||||
rx_pads=rx_pads,
|
rx_pads=rx_pads,
|
||||||
|
@ -70,7 +69,6 @@ class Master(MiniSoC, AMPSoC):
|
||||||
# with SAWG on local RTIO and AD9154-FMC-EBZ
|
# with SAWG on local RTIO and AD9154-FMC-EBZ
|
||||||
platform.register_extension(fmc_clock_io)
|
platform.register_extension(fmc_clock_io)
|
||||||
self.submodules.transceiver = gtx_7series.GTX_3G(
|
self.submodules.transceiver = gtx_7series.GTX_3G(
|
||||||
platform=platform,
|
|
||||||
clock_pads=platform.request("ad9154_refclk"),
|
clock_pads=platform.request("ad9154_refclk"),
|
||||||
tx_pads=tx_pads,
|
tx_pads=tx_pads,
|
||||||
rx_pads=rx_pads,
|
rx_pads=rx_pads,
|
||||||
|
@ -80,6 +78,13 @@ class Master(MiniSoC, AMPSoC):
|
||||||
self.submodules.drtio = DRTIOMaster(self.transceiver)
|
self.submodules.drtio = DRTIOMaster(self.transceiver)
|
||||||
self.csr_devices.append("drtio")
|
self.csr_devices.append("drtio")
|
||||||
|
|
||||||
|
rtio_clk_period = 1e9/self.transceiver.rtio_clk_freq
|
||||||
|
platform.add_period_constraint(self.transceiver.txoutclk, rtio_clk_period)
|
||||||
|
platform.add_period_constraint(self.transceiver.rxoutclk, rtio_clk_period)
|
||||||
|
platform.add_false_path_constraints(
|
||||||
|
self.crg.cd_sys.clk,
|
||||||
|
self.transceiver.txoutclk, self.transceiver.rxoutclk)
|
||||||
|
|
||||||
rtio_channels = []
|
rtio_channels = []
|
||||||
for i in range(8):
|
for i in range(8):
|
||||||
phy = ttl_simple.Output(platform.request("user_led", i))
|
phy = ttl_simple.Output(platform.request("user_led", i))
|
||||||
|
|
|
@ -165,7 +165,6 @@ class Satellite(Module):
|
||||||
# GTX_1000BASE_BX10 Ethernet compatible, 62.5MHz RTIO clock
|
# GTX_1000BASE_BX10 Ethernet compatible, 62.5MHz RTIO clock
|
||||||
# simple TTLs
|
# simple TTLs
|
||||||
self.submodules.transceiver = gtx_7series.GTX_1000BASE_BX10(
|
self.submodules.transceiver = gtx_7series.GTX_1000BASE_BX10(
|
||||||
platform=platform,
|
|
||||||
clock_pads=platform.request("sgmii_clock"),
|
clock_pads=platform.request("sgmii_clock"),
|
||||||
tx_pads=tx_pads,
|
tx_pads=tx_pads,
|
||||||
rx_pads=rx_pads,
|
rx_pads=rx_pads,
|
||||||
|
@ -176,7 +175,6 @@ class Satellite(Module):
|
||||||
# with SAWG on local RTIO and AD9154-FMC-EBZ
|
# with SAWG on local RTIO and AD9154-FMC-EBZ
|
||||||
platform.register_extension(fmc_clock_io)
|
platform.register_extension(fmc_clock_io)
|
||||||
self.submodules.transceiver = gtx_7series.GTX_3G(
|
self.submodules.transceiver = gtx_7series.GTX_3G(
|
||||||
platform=platform,
|
|
||||||
clock_pads=platform.request("ad9154_refclk"),
|
clock_pads=platform.request("ad9154_refclk"),
|
||||||
tx_pads=tx_pads,
|
tx_pads=tx_pads,
|
||||||
rx_pads=rx_pads,
|
rx_pads=rx_pads,
|
||||||
|
@ -188,6 +186,14 @@ class Satellite(Module):
|
||||||
self.submodules.drtio = DRTIOSatellite(
|
self.submodules.drtio = DRTIOSatellite(
|
||||||
self.transceiver, self.rx_synchronizer, rtio_channels)
|
self.transceiver, self.rx_synchronizer, rtio_channels)
|
||||||
|
|
||||||
|
rtio_clk_period = 1e9/self.transceiver.rtio_clk_freq
|
||||||
|
platform.add_period_constraint(self.transceiver.txoutclk, rtio_clk_period)
|
||||||
|
platform.add_period_constraint(self.transceiver.rxoutclk, rtio_clk_period)
|
||||||
|
platform.add_false_path_constraints(
|
||||||
|
sys_clock_pads,
|
||||||
|
self.transceiver.txoutclk, self.transceiver.rxoutclk)
|
||||||
|
|
||||||
|
|
||||||
def build(self, *args, **kwargs):
|
def build(self, *args, **kwargs):
|
||||||
self.platform.build(self, *args, **kwargs)
|
self.platform.build(self, *args, **kwargs)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue