У меня есть схема синхронизатора шины для передачи широкого регистра через домены часов.
Я приведу упрощенное описание, исключая логику асинхронного сброса.
Данные генерируются за один час. Обновления имеют много (по крайней мере дюжину) угловых точек:
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;
Это компилируется и хорошо работает при синтезе в Cyclone II FPGA. Однако TimeQuest сообщает о нарушениях настройки и времени удержания, поскольку не распознает синхронизатор. Что еще хуже, руководство Quartus говорит
Сосредоточьтесь на улучшении путей, которые показывают худший провал. Монтажник больше всего работает на трассах с наихудшим провалом. Если вы исправите эти пути, монтажник сможет улучшить другие ошибочные пути синхронизации в проекте.
Поэтому я хочу добавить правильные временные ограничения в мой проект, чтобы Quartus потратил свои усилия Fitter на другие области дизайна.
Я почти уверен, что set_multicycle_path
это правильная команда SDC (Synopsis Design Constraint), поскольку строки данных будут иметь несколько циклов такта назначения для стабилизации, но я не могу найти полных примеров использования этой команды для описания логики пересечения области часов ,
Я был бы очень признателен за рекомендации по написанию временных ограничений SDC для синхронизаторов. Если вы видите проблему с этим подходом, пожалуйста, дайте мне знать об этом.
Деталь часов:
Внешний генератор тактовых импульсов: два канала, refclk = 20 МГц, refclk2 = refclk / 2 (10 МГц и другие).
PLL Altera: src_clk = refclk * 9/5 = 36 МГц
PLL Altera: dest_clk = refclk2 * 10 = 100 МГц
У меня также есть данные, идущие в другом направлении: 100 МГц src_clk и 36 МГц dest_clk.
TL; DR: Каковы корректные временные ограничения SDC для приведенного выше кода?