У мене є схема синхронізатора шини для передачі широкого регістра по тактових доменах.
Я надаю спрощений опис, опускаючи логіку асинхронного скидання.
Дані генеруються за один годинник. Оновлення - це багато (принаймні десяток) країв годинника один від одного:
PROCESS (src_clk)
BEGIN
IF RISING_EDGE(clock) THEN
IF computation_done THEN
data <= computation;
ready_spin <= NOT ready_spin;
END IF;
END IF;
END PROCESS;
Сигнал управління для свіжих даних, який кодується NRZI (тому дійсне слово на шині відповідає переходу на керуючий сигнал). Сигнал управління проходить через ланцюг DFF, який діє як синхронізатор.
PROCESS (dest_clk)
BEGIN
IF RISING_EDGE(dest_clk) THEN
ready_spin_q3 <= ready_spin_q2;
ready_spin_q2 <= ready_spin_q1;
ready_spin_q1 <= ready_spin;
END IF;
END PROCESS;
Схема синхронізатора вводить коротку затримку, що забезпечує достатньо часу для стабілізації шини даних; шина даних відбирає вибірку безпосередньо без ризику метастабільності:
PROCESS (dest_clk)
BEGIN
IF RISING_EDGE(dest_clk) THEN
IF ready_spin_q3 /= ready_spin_q2 THEN
rx_data <= data;
END IF;
END IF;
END PROCESS;
Це компілюється та працює добре, коли синтезується в FPGA Cyclone II. Однак TimeQuest повідомляє про налаштування та утримує порушення часу, оскільки він не розпізнає синхронізатор. Гірше, йдеться в посібнику Quartus
Сфокусуйтесь на вдосконаленні шляхів, які показують найгірший слабкість. Fitter працює найважче на доріжках з найгіршим слабкістю. Якщо ви виправите ці шляхи, Fitter може змогти вдосконалити інші невдалі таймінг-контури в дизайні.
Тому я хочу додати правильні обмеження в моєму проекті, щоб Quartus витратив свої зусилля Fitter на інші сфери дизайну.
Я майже впевнений, що set_multicycle_path
це правильна команда SDC (Synopsis Design Constraint), оскільки в рядках даних буде стабілізація декількох циклів годин призначення, але я не можу знайти жодних повних прикладів, використовуючи цю команду для опису логіки перетину домену годинника .
Я дуже вдячний деяким вказівкам щодо написання обмежень синхронізації SDC для синхронізаторів. Якщо ви бачите проблеми з таким підходом, будь ласка, повідомте мене про це.
Деталі годинника:
Зовнішній тактовий генератор: два канали, refclk = 20 МГц, refclk2 = refclk / 2 (10 МГц і пов'язані з ними).
PLtera Altera: src_clk = refclk * 9/5 = 36 МГц
PLtera Altera: dest_clk = refclk2 * 10 = 100 МГц
У мене також є дані, що йдуть в іншому напрямку, з 100 MHz src_clk та 36 MHz dest_clk.
TL; DR: Які правильні обмеження часу SDC для вищевказаного коду?