Статичний часовий аналіз demystified

Багато розробників-початківців ПЛІС (і ASIC) не до кінця розуміють вплив часових обмежень (constraints - далі констрейнти) на результати синтезу; те, яким чином констрейнти використовуються в статичному часовому аналізі. Велика частина літератури з цієї тематики зводиться до розгляду всіляких видів констрейнтів, але нічого не говорить про внутрішню «кухню» і використовувані алгоритми. Розгляду констрейнтів присвячений і недавній пост з даної тематики на ГТ (geektimes.ru/post/254932/ [1]). Між тим, констрейнти - лише вершина айсберга. Їх використання має спиратися на фундаментальні знання про статичний часовий аналіз, які дають, наприклад, в американських університетах, але нічого не розповідають у нас. Тому, власне, поговоримо про фундамент.


У сучасних маршрутах проектування синхронних схем використовується два основних види аналізу: тимчасове моделювання, і статичний часовий аналіз.

Тимчасове моделювання використовується здебільшого для функціональної верифікації, і спирається на verilog-моделі логічних елементів, з використанням затримок, що з'єднуються (файли в стандартах sdf, tlf, тощо). Перевага тимчасового моделювання - точність, і здатність моделювати великі схеми. Точність звичайно нижча, ніж при моделюванні на рівні транзисторів (spice-моделювання), але разом з тим цілком прийнятна, і що головне - на порядки більш швидка. Брак тимчасового моделювання - величезна ресурсомісткість перевірки повного покриття тестами логіки схеми. І найчастіше, 100% -ого покриття логіки тестами досягти не вдається.

Статичний часовий аналіз не моделює поведінку схеми в динаміці, і не використовує verilog-моделі елементів. Так само, статичний аналіз не займається розглядом функцій схеми і складових її елементів. Основним завданням статичного аналізу є розгляд усіх (під 100% можливих комбінацій) затримок сигналів у схемі, та пошук порушень відповідно до заданих правил перевірок (констрейнтів). Статичний аналіз названий тому, що виробляється в статиці, за побудованим відповідно до схеми графу з'єднань. Або, точніше, за ациклічним орграфом.

Не влазячи в теорію графів достатньо сказати, що орграф - це орієнтований граф, тобто дуги графа мають напрямок (так само як сигнал у дроті «біжить» в одному напрямку - від джерела до приймача). Дуги графа - це дроти між елементами, і «віртуальні» шляхи сигналу (arcs - арки) всередині елементів. Наприклад, у елемента 2ИЛИ-НЕ всього дві арки: від кожного з входів до виходу. Вершинами графа є входи і виходи елементів, а так само входи і виходи схеми. У результаті, за отриманим графом можна будувати шляхи сигналів (signal path), що проходять по дугах графа, через його вершини. Якщо всі можливі шляхи сигналів кінцеві, то граф називається ациклічним. Статичний часовий аналіз працює тільки з ациклічними орграфами, і як наслідок, тільки з кінцевими траєкторіями сигналів. Наприклад, якщо схема містить зворотний зв'язок, частина шляхів сигналів виявиться закільцьованою, і не може аналізуватися. Для боротьби зі зворотними зв'язками використовують милицю - САПР може спробувати зробити граф ациклічним, викинувши з нього одну або кілька дуг (як правило, це арки всередині елементів). В результаті вийде граф без зворотних зв'язків, але викинуті дуги більше не беруть участі в аналізі - їх затримка не враховується в розрахунках.

Для кращого розуміння сказаного, прокоментую вибіркові слайди з лекцій зі статичного часового аналізу, які читають студентам Техаського Університету в Остіні.

Верхній лівий кут - схема, що складається з D-тригера (флопа), елемента вимикання тактового імпульсу (clock-gate), і логічного елемента на вході флопа. Правий верхній кут - правила побудови графа:

  • гуртками позначені входи і виходи елементів, а так само входи і виходи схеми,
  • стрілками показані ребра графа: з'єднання дротами, арками (всередині елементів)
  • подвійними стрілками з пунктиром позначені так звані контрольні арки: вони не містять затримку, і в статичному аналізі використовуються не для розрахунку затримок сигналів, а для контролю - наприклад, установки і утримання сигналів (setup/hold).

У нижній частині малюнка показано отриманий граф. Всі вершини підписані (легко знайти відповідність зі схемою). Всі дуги позначені як інвертуючі або неінвертуючі: наприклад, «r-r» і «f-f» розшифровується як rise-rise і fall-fall, і означає, що показана дуга не несе в собі інверсії сигналу. Якби дуга (наприклад, арка в елементі АБО-НЕ) була інвертуючою, то позначка б була «r-f» і «f-r», що означає rise-fall і fall-rise, або, іншими словами, зміну позитивного фронту сигналу при проходженні через дугу на негативний, і навпаки. Як вже було сказано, функція елементів у статичному аналізі не розглядається, важливо тільки - ізотонна (неінвертуюча) функція біля елемента, або антитонна (інвертуюча).

На що слід звернути увагу. Початкова точка шляху сигналу (суть - перехідного процесу) в синхронних схемах - це завжди або інтерфейсний сигнал, або тактовий імпульс. Якби схема в наведеному прикладі була більшою, то з тактового входу (clk) виходив би цілий пучок дуг на графі. А кінцева точка шляху сигналу в синхронній схемі - це знову ж інтерфейс, або - вхід даних тригера, або роздільна здатність у clock-gate. При цьому кінцева точка шляху сигналу завершується однією або кількома контрольними арками, які говорять про те, які перевірки для отриманого сигналу необхідно провести. У наведеному прикладі перевіряється встановлення і утримання (setup і hold) сигналу на інформаційному вході тригера по відношенню до тактового входу (FF1:D — FF1:clock), і аналогічна перевірка сигналу дозволу у елемента clock-gate.

Як констрейнти відбиваються на графі. Констрейнти, що впливають на затримку інтерфейсу (set_input_delay, set_output_delay, set_drive, set_load тощо) просто змінюють значення затримки у зовнішніх дуг графа. Існують констрейнти, що змінюють граф, наприклад: set_disable_timing или set_false_path. Багато констрейнтів беруться автоматично з бібліотеки елементів: наприклад, для контрольних арок - перевірки на setup/hold. Я не хочу концентруватися на констрейнтах, для їх розуміння достатньо прочитати опис в документації того ж Synopsys DC [2], або освітні статті в інтернеті, наприклад - на edacafe або semiwiki.

Тепер про алгоритми розрахунку затримок. Статичний часовий аналіз розглядає тільки дві крайні точки розкиду затримок в елементах і схемі: найгірший випадок, який використовується для перевірок обмеження на час встановлення сигналу (setup) по відношенню до тактового імпульсу, і найкращий випадок, що використовується для перевірок часу утримання (hold). Існує ще т. зв. статистичний статичний часовий аналіз (SSTA), що підходить до питання більш інтелектуально, але про нього якось в інший раз (тим більше що розробникам ПЛІС цей вид аналізу взагалі не актуальний).

При розрахунку затримок використовується дві стратегії - розрахунок фактичного часу приходу сигналу (AT - Arrival Time), і розрахунок виходячи з необхідного часу приходу сигналу (RAT - Required Arrival Time). Для початку, як вважається AT:

Для простоти, будемо вважати, що затримки переднього і заднього фронту однакові (хоча зазвичай ведеться роздільний розрахунок для обох варіантів). І замість графа будемо малювати затримки прямо на схемі, оскільки це наочніше. Разом, на наведеному малюнку затримки проводів враховані в затримках елементів, і позначені двома цифрами через ком: перша цифра означає самий ранній прихід сигналу, а друга цифра означає найпізніший момент його приходу. Наприклад, «1,2» на вході означає, що сигнал прийде не раніше 1нс, і не пізніше 2нс, а «2.3» всередині логічного елемента означає його затримку в діапазоні від 2 до 3нс. Звідки в розрахунку могла взяти затримка на вхідному сигналі? Наприклад, вона може бути задана констрейнтами set_input_delay з ключами -min і -max. Затримка елемента береться з бібліотеки елементів (вимірюється розробником бібліотеки). Зеленими цифрами показано хід розрахунку. Для верхнього лівого елемента - при власній затримці 2-3нс, сигнал на виході може бути отриманий в момент 2-4нс (якщо елемент спрацює по першому входу), і 3-5нс, якщо по другому. Обидва діапазони просто складаються (оскільки функція елементів не враховується), і виходить результат: «2,5» або від 2 до 5нс (тобто не раніше 2нс, і не пізніше 5нс).

Далі, про розрахунок необхідного часу:

Тепер розрахунок здійснюється у зворотному напрямку. Припустимо, що констрейнтами прихід вихідних сигналів обмежений в діапазоні «5,10» і «4,10» співвідв. Ці обмеження можна встановити за допомогою set_output_delay з ключами -min і -max. Потім йде розрахунок у зворотний бік, наприклад якщо з діапазону 4-10 відняти затримку елемента 2-4, то це буде означати, що сигнал може потрапити на входи елемента не раніше 2нс і не пізніше 6нс. При цьому вихід інвертора, який мав обмеження 5-10 автоматично обмежується більш жорстким діапазоном 5-6 (виходить перетином 5-10 і 2-6).

У завершенні, коли отримано необхідний час розповсюдження сигналів, і фактичний, можна порахувати порушення (slack).

Зеленим показано фактичний час, синім необхідний. Різниця (slack) розрахована, і показана на схемі чорним шрифтом. При цьому, негативне значення різниці вважається порушенням, позитивне - запасом. У будь-якому репорті результатів статичного аналізу Ви побачите дві таблиці - розрахунок фактичного часу, розрахунок необхідного, обчислення різниці, і підбиття підсумку - MET або NOT MET.

У висновку хотілося б додати, що успішні результати статичного часового аналізу зовсім не є гарантією працездатності дизайну. На це вказує той простий факт, що граф будується при активній участі розробника (за допомогою констрейнтів), і може бути побудований з помилкою. Помилка в графі виливається в неконтрольовані шляхи в схемі, які можна виловити тільки тимчасовим моделюванням з перевірками тимчасових обмежень (тобто з використанням затримок на інтерфейсах). Порушення тимчасового моделювання часто вказує на наявність помилки в констрейнтах. Звідси простий висновок - статичний часовий аналіз не замінює функціональне моделювання, а доповнює.

Сподіваюся, викладений матеріал дозволить краще розібратися зі статичним часовим аналізом, побачити його «зсередини», і більш осмислено писати констрейнти для свого дизайну. Для тих, хто захоче копати далі, можу порадити прочитати книгу "Static Timing Analysis for Nanometer Designs: A Practical Approach "[3] англійською мовою.

[1] geektimes.ru/post/254932/

[2] www.synopsys.com

[3] www.springer.com/us/book/9780387938196