drtio: monitor RTIOClockMultiplier PLL (#1155)

Debugging by Tom Harty
This commit is contained in:
Sebastien Bourdeauducq 2018-09-26 10:52:08 +08:00 committed by Robert Jördens
parent 9cf88329b2
commit 469a66db61
3 changed files with 35 additions and 6 deletions

View File

@ -257,6 +257,10 @@ fn async_error_thread(io: Io) {
} }
pub fn startup(io: &Io) { pub fn startup(io: &Io) {
// The RTIO CRG may depend on the DRTIO transceiver clock.
// Initialize DRTIO first to bring up transceiver clocking.
drtio::startup(io);
#[cfg(has_rtio_crg)] #[cfg(has_rtio_crg)]
{ {
#[cfg(has_rtio_clock_switch)] #[cfg(has_rtio_clock_switch)]
@ -296,7 +300,6 @@ pub fn startup(io: &Io) {
} }
} }
drtio::startup(io);
init_core(true); init_core(true);
io.spawn(4096, async_error_thread); io.spawn(4096, async_error_thread);
} }

View File

@ -229,6 +229,23 @@ fn process_errors() {
} }
} }
#[cfg(has_rtio_crg)]
fn init_rtio_crg() {
unsafe {
csr::rtio_crg::pll_reset_write(0);
}
clock::spin_us(150);
let locked = unsafe { csr::rtio_crg::pll_locked_read() != 0 };
if !locked {
error!("RTIO clock failed");
}
}
#[cfg(not(has_rtio_crg))]
fn init_rtio_crg() { }
#[cfg(rtio_frequency = "150.0")] #[cfg(rtio_frequency = "150.0")]
const SI5324_SETTINGS: si5324::FrequencySettings const SI5324_SETTINGS: si5324::FrequencySettings
= si5324::FrequencySettings { = si5324::FrequencySettings {
@ -285,6 +302,7 @@ pub extern fn main() -> i32 {
unsafe { unsafe {
csr::drtio_transceiver::stable_clkin_write(1); csr::drtio_transceiver::stable_clkin_write(1);
} }
init_rtio_crg();
#[cfg(has_allaki_atts)] #[cfg(has_allaki_atts)]
board_artiq::hmc542::program_all(8/*=4dB*/); board_artiq::hmc542::program_all(8/*=4dB*/);

View File

@ -676,19 +676,23 @@ class Tester(_StandaloneBase):
self.rtio_crg.cd_rtio.clk, self.grabber0.deserializer.cd_cl.clk) self.rtio_crg.cd_rtio.clk, self.grabber0.deserializer.cd_cl.clk)
class _RTIOClockMultiplier(Module): class _RTIOClockMultiplier(Module, AutoCSR):
def __init__(self, rtio_clk_freq): def __init__(self, rtio_clk_freq):
self.pll_reset = CSRStorage(reset=1)
self.pll_locked = CSRStatus()
self.clock_domains.cd_rtiox4 = ClockDomain(reset_less=True) self.clock_domains.cd_rtiox4 = ClockDomain(reset_less=True)
# See "Global Clock Network Deskew Using Two BUFGs" in ug472. # See "Global Clock Network Deskew Using Two BUFGs" in ug472.
clkfbout = Signal() clkfbout = Signal()
clkfbin = Signal() clkfbin = Signal()
rtiox4_clk = Signal() rtiox4_clk = Signal()
pll_locked = Signal()
self.specials += [ self.specials += [
Instance("MMCME2_BASE", Instance("MMCME2_BASE",
p_CLKIN1_PERIOD=1e9/rtio_clk_freq, p_CLKIN1_PERIOD=1e9/rtio_clk_freq,
i_CLKIN1=ClockSignal("rtio"), i_CLKIN1=ClockSignal("rtio"),
i_RST=ResetSignal("rtio"), i_RST=self.pll_reset.storage,
o_LOCKED=pll_locked,
p_CLKFBOUT_MULT_F=8.0, p_DIVCLK_DIVIDE=1, p_CLKFBOUT_MULT_F=8.0, p_DIVCLK_DIVIDE=1,
@ -697,7 +701,9 @@ class _RTIOClockMultiplier(Module):
p_CLKOUT0_DIVIDE_F=2.0, o_CLKOUT0=rtiox4_clk, p_CLKOUT0_DIVIDE_F=2.0, o_CLKOUT0=rtiox4_clk,
), ),
Instance("BUFG", i_I=clkfbout, o_O=clkfbin), Instance("BUFG", i_I=clkfbout, o_O=clkfbin),
Instance("BUFG", i_I=rtiox4_clk, o_O=self.cd_rtiox4.clk) Instance("BUFG", i_I=rtiox4_clk, o_O=self.cd_rtiox4.clk),
MultiReg(pll_locked, self.pll_locked.status)
] ]
@ -781,7 +787,8 @@ class _MasterBase(MiniSoC, AMPSoC):
platform.add_false_path_constraints( platform.add_false_path_constraints(
self.crg.cd_sys.clk, gtp.rxoutclk) self.crg.cd_sys.clk, gtp.rxoutclk)
self.submodules.rtio_clkmul = _RTIOClockMultiplier(rtio_clk_freq) self.submodules.rtio_crg = _RTIOClockMultiplier(rtio_clk_freq)
self.csr_devices.append("rtio_crg")
fix_serdes_timing_path(platform) fix_serdes_timing_path(platform)
def add_rtio(self, rtio_channels): def add_rtio(self, rtio_channels):
@ -906,7 +913,8 @@ class _SatelliteBase(BaseSoC):
self.crg.cd_sys.clk, self.crg.cd_sys.clk,
gtp.txoutclk, gtp.rxoutclk) gtp.txoutclk, gtp.rxoutclk)
self.submodules.rtio_clkmul = _RTIOClockMultiplier(rtio_clk_freq) self.submodules.rtio_crg = _RTIOClockMultiplier(rtio_clk_freq)
self.csr_devices.append("rtio_crg")
fix_serdes_timing_path(platform) fix_serdes_timing_path(platform)
def add_rtio(self, rtio_channels): def add_rtio(self, rtio_channels):