Обмеження часу ASIC через SDC: Як правильно вказати мультиплексований годинник?


10

Вступ

Знайшовши в Інтернеті кілька, іноді суперечливих чи неповних даних про те, як правильно створити обмеження часу у форматі SDC , я хотів би попросити співтовариство EE про допомогу з деякими загальними структурами генерації годин, з якими я стикався.

Я знаю, що існують відмінності в тому, як можна було б реалізувати певну функціональність на ASIC або FPGA (я працював з обома), але я думаю, що повинен бути загальний, правильний спосіб обмеження часу заданої структури , незалежно від основні технології - будь ласка, повідомте мене, якщо я помиляюся на цьому.

Існують також деякі відмінності між різними інструментами для впровадження та тимчасового аналізу різних постачальників (незважаючи на те, що Synopsys пропонує вихідний код парсера SDC), але я сподіваюся, що вони в основному є проблемою синтаксису, яку можна переглянути в документації.

Питання

Йдеться про наступну структуру тактового мультиплексора, яка є частиною модуля clkgen, який знову є частиною більшого дизайну: Тактовий мультиплексор годин

У той час як ext_clkпередбачаються , вхід генерується з зовнішньої сторони конструкції (що надходить через вхідний контакт), то clk0і clk4сигнали також генеруються і використовуються clkgen модуль (див мого пов'язаного питання пульсації годинник для деталей) і пов'язані годинник обмеження по імені baseclkі div4clk, відповідно.

Питання полягає в тому, як вказати такі обмеження, що аналізатор хронометражу

  1. Розглядає cpu_clkяк мультиплексований годинник, який може бути одним із вихідних годин ( fast_clkабо slow_clkабо ext_clk), враховуючи затримки через різні ворота AND і OR
  2. У той же час не розрізаючи шляхи між вихідними годинниками, які використовуються в іншому місці дизайну.

У той час, як найпростіший випадок вбудованого мультиплексора на мікросхемі вимагає лише set_clock_groupsтвердження SDC :

set_clock_groups -logically_exclusive -group {baseclk} -group {div4clk} -group {ext_clk}

... в даній структурі це ускладнюється тим, що clk0(через fast_clkвихід) і clk4(через slow_clk) все ще використовуються в дизайні, навіть якщо cpu_clkвін налаштований так, ext_clkколи use_extстверджується тільки .

Як описано тут , set_clock_groupsкоманда, як описано вище, спричинить наступне:

Ця команда еквівалентна виклику set_false_path з кожного годинника в кожній групі до кожного годинника в кожній іншій групі і навпаки

... що було б неправильно, оскільки інші годинники досі використовуються в іншому місці.

Додаткова інформація

В use_clk0, use_clk4і use_extвходи генеруються таким чином , що тільки один з них є високим в будь-який момент часу. Хоча це може бути використано для зупинки всіх тактових годин, якщо всі use_*входи низькі, у центрі уваги цього питання є властивість цієї структури мультиплексування годин.

Х2 екземпляр (простий буфер) в схемі просто місце тримач , щоб виділити проблему автоматичні місця і маршрут інструментів , як правило , бути вільним місце буферів в будь-якому місці (наприклад, між and_cpu_1/zі or_cpu1/in2штифти). В ідеалі тимчасові обмеження не повинні впливати на це.


Чи можете ви спробувати зробити це більш лаконічним, звузивши його до дуже конкретного, дуже вузького питання? Мені важко зрозуміти, що є важливою інформацією, а що ти насправді шукаєш тут.
travisbartley

@ trav1s: я змінив питання. Будь ласка, дайте мені знати, якщо вам потрібні роз'яснення.
FriendFX

Відповіді:


3

Визначте розділення на 1 годин на мережах and_ * і оголосіть їх фізично виключними. Компілятор RTL Cadence керує ситуацією правильно, генеруючи 3 таймінг-контури для реєстрів, синхронізованих cpu_clk (по одному контуру за один такт). Регістри, безпосередньо керовані clk0, clk4 та clk_ext, мають власні дуги синхронізації.

create_generated_clock -source [get_ports clk0] \
-divide_by 1 -name and_clk0    [get_pins and_cpu_1/Y]

create_generated_clock -source [get_ports clk4] \
-divide_by 1 -name and_clk4    [get_pins and_cpu_2/Y]

create_generated_clock -source [get_ports clk_ext] \
-divide_by 1 -name and_clk_ext [get_pins and_cpu_ext1/Y]

set_clock_groups \
-physically_exclusive \
-group [get_clocks and_clk0] \
-group [get_clocks and_clk4] \
-group [get_clocks and_clk_ext]

Дякуємо за вашу пропозицію. На жаль, наразі я не можу це перевірити, але ця концепція мені здається досить перспективною. Чи можете ви перевірити, чи проходять маршрути між ними cast_clk, cpu_clkі slow_clkвсе ще перевіряються (тобто не є винятком через ексклюзивні групи годин), і в той же час обмежуються їх відповідними вхідними тактовими годинниками? Зрештою, я шукаю авторитетну відповідь на це питання.
FriendFX

@FriendFX Я перевірив код у компіляторі RTL і шляхи виводяться правильно.
Revanth Kamaraj

Для того, щоб повідомити вас, я додав деяку інформацію про одноклітинні мультиплікатори годин та рішення (принаймні, для деяких інструментів).
FriendFX

1

Хоча це старий потік без відповіді ... він охоплює деякі основні розуміння синхронізації та асинхронних годин

  • В основному, синхронні годинники повинні залишатися синхронізованими у фазі з мінімальними затримками, доданими, щоб Mux'ing не створював збоїв.
    • Часто це досягається шляхом перекомпонування всіх закритих тактових джерел на тактовій частоті.
  • Годинники асинхронізації не є критичними для моменту часу, тому дозволені затримки. наприклад, лічильники Ripple.

введіть тут опис зображення


Дякуємо, що вивчили це старе питання. У моєму випадку я не хочу (хочу) повторно синхронізувати годинник з тактовою частотою, як показано на схемі. Але все ще відсутня головна частина мого питання, а саме правильні твердження SDC для обмеження цієї схеми з урахуванням синхронності вихідних годин , а також їх використання в тій же синхронній конструкції, оскільки згаданий set_clock_groupsприклад посилання стверджує про неправильне вирізання доріжки між цими годинниками.
FriendFX
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.