Чому висновки засувок погані?


22

Мій компілятор скаржиться на встановлені засувки в моїх комбінаторних петлях ( always @(*), у Verilog). Мені також сказали, що слід уникати висновків із засувками.

Що саме не так із зробленими засувками? Вони, звичайно, полегшують написання комбінаторних петель.


Було б добре включити приклад HDL того, що ви робите
shuckc

Я помітив, що це питання цитувалося кілька разів останнім часом. Для всіх, хто не є експертом, який прийшов таким чином, зауважте, що всі відповіді, окрім Олі Глазер, є деякою комбінацією невірних та / або непотрібних.
EML

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

Відповіді:


20

"Засувка" відрізняється від "перекидання" тим, що FF змінює свій вихід лише у відповідь на кромку годинника. Засувка може змінити свій вихід у відповідь на щось інше, ніж годинник. Наприклад, SR-засувка має набір входів і скидання, і якщо будь-який з них активний, вихід може змінюватися. Якщо SR-FF реагує на набір або скидання лише тоді, коли також є кромка годинника.

У FPGA ви хочете, щоб ваша логіка була повністю синхронною. Це означає, що всі елементи зберігання (на зразок FF) збираються з одного джерела годин. До всього, що є асинхронним для цього годинника, потрібно ставитися дуже обережно, інакше трапляться помилки в синхронізації.

Засувка - це в основному асинхронний елемент зберігання. У нього немає тактового входу, і тому його не можна синхронізувати з будь-яким годинником. Слід зазначити, що є FF з асинхронним входом для скидання та скидання, і до них слід ставитися так само, як і до звичайних засувок.

Вивчення всіх проблем із тимчасовим терміном, які можуть викликати засувки, є набагато вищим за те, що тут можна висвітлити, але дозвольте навести один приклад:

Скажімо, у вас SR-засувка, і ви хочете, щоб вона встановлювалася щоразу, коли 8-бітний лічильник досягає певного значення. Я не впевнений, яким би був код Verilog, але у VHDL код: set <= '1', коли count = "11010010" else '0'; Цей заданий сигнал надходить на встановлений вхід нашої SR-засувки.

Логіка, яка породжується, є суто комбінаторною; суміш і-воріт, або-воріт, і інверторів (або LUT). Але сигнальні шляхи через цю комбінаторну логіку не завжди є ідеальними, і сигнал "встановлений" міг би мати збої на ньому. Шлях сигналу через певну групу воріт може зайняти більше часу, ніж інша група, внаслідок чого заданий вихід активізується на короткий момент, перш ніж вихід осідає в кінцевий стан.

Цей вихідний глюк може призвести до встановлення нашого SR-засувки, навіть якщо цього не передбачалося. Якщо ми переключимося з SR-засувки на SR-FF, тактовуючи той же годинник, що і лічильник, то SR-FF буде чекати один цілий тактовий цикл перед зміною стану. По суті, він буде чекати, коли заданий сигнал встигне, перш ніж його подивитися.

Якщо шляхи комбінаторної логіки для заданого сигналу просто прокладені по-різному (спричиняючи різні затримки), поведінка глюка також зміниться. Логіка може спрацювати нормально, але тоді, коли ви змінили щось зовсім не пов'язане, ця логіка спрямовується інакше, і тому помилка спливає. Температура і напруга також змінять час сигналу, і, таким чином, можуть змінити поведінку збою.

Це непевно в часі, тому вам слід уникати засувок у вашій логіці. FF набагато безпечніше використовувати. Ось чому ваш компілятор попереджає про засувки, оскільки помилково зробити засувку легко, і ви, ймовірно, не хочете її там все одно.

Звичайно, іноді потрібні засувки. Ви просто повинні їх використовувати дуже рідко, лише коли це абсолютно потрібно, і тоді ви повинні правильно розробити логіку, щоб не було можливих збоїв.


Я б очікував, що якщо явно вказати засувку в verilog або іншій мові, і якщо хтось сконструює схему, щоб вона працювала коректно з будь-якою комбінацією комбінаторних затримок, що подають засувку (мається на увазі, що все, що генерує сигнали, які поєднуються для засувка зробила б це таким чином, що навіть при найгірших комбінаціях логічних шляхів з нульовою затримкою та логічними шляхами з максимальною затримкою вимоги до часових засувок все-таки будуть дотримані), синтезатор повинен генерувати робочу ланцюг де сама засувка має негативну затримку. Якщо ж…
supercat

... користується комбінаторною логікою та зворотним зв'язком, не вказуючи жодних вузлів, які мають мати негативну затримку, майже все може статися. Я розумію, що синхронну логіку спроектувати простіше, ніж асинхронізувати, але багатьом пристроям потрібно відключити годинник, коли вони сплять, щоб заощадити енергію, не будучи абсолютно мертвими. Можливо, буде цікаво мати пристрій, який був повністю синхронним, але зв'язав з кожним штифтом пару логічних виходів для "запустити, якщо штифт високий" та "запустити, якщо штифт низький", а також можливість генерувати годинник, якщо будь-який штифт вказав, що потрібен.
supercat

Така здатність значно зменшить потребу в логіці асинхронізації, оскільки вхід, який надходить під час сну, може ввімкнути внутрішній генератор та схему достатньо довго, щоб вхід був оброблений та підтверджений. Така особливість була б набагато більш універсальною, ніж мати один штифт «прокидання», але конструкції з одним пробудженням здаються нормою. Чи споживає такий спосіб, як я описав, багатопроблемний режим споживання зайвого кремнію? Я думаю, що потреба в кремнію буде досить незначною порівняно з усім іншим на мікросхемі.
supercat

13

Що робить висновок засувок?
Для комбінаторної логіки вихід схеми є лише функцією введення і не повинен містити пам'яті чи внутрішнього стану (засувка).

У Verilog змінна збереже своє попереднє значення, якщо їй не буде призначено значення у блоці завжди . Потрібно створити засувку для зберігання цього теперішнього значення.

Неповне твердження if-else генерує засувки. Оператор if-else вважається "неповним", якщо вихідний стан не визначено для всіх можливих умов введення. Те ж саме відноситься і до неповного випадку заяви або справи заяву , що не має значення по замовчуванням: пункт.

Чому висновки засувок погані?
Запропоновані засувки можуть слугувати "попереджувальним знаком" про те, що логічна конструкція може бути реалізована не за призначенням. Упроекті може бути відсутнє твердження про інше чи випадок .

Засувки можуть призвести до проблем із термінами та умовами гонки. Вони можуть призвести до комбінаторного зворотного зв’язку - маршрутизації виходу назад на вхід - що може бути непередбачуваним.

Щоб уникнути створення засувок:

  • Додайте всі гілки в якщо або випадку заява
  • Призначте значення кожному вихідному сигналу в кожній гілці
  • Використовуйте завдання за замовчуванням на початку процедури, тому кожен сигнал буде призначений.

Деякі частини перефразовано із "Прототипування протоколу FPGA за прикладами Verilog" П. Чу


2
"Прототип прототипу FPGA за прикладами Verilog" - це хороша книга для вивчення практичного Verilog для синтезу. У ньому є кілька хороших прикладів дизайну від базових комбінаторних речей до базових послідовних, що призводить до корисних конструкцій, таких як UART, VGA, процесор з м'яким ядром (Picoblaze) і навіть гра Pong. Він також охоплює базовий тестовий стенд та моделювання. @Randomblue, ви повинні захопити копію, якщо ви її ще не отримали. Я вважаю, що він теж зробив версію VHDL.
Олі Глазер

8

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

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


6

Послідовні логічні конструкції, побудовані за допомогою комбінаторної логіки та зворотного зв'язку, як правило, роблять припущення, що може здатися розумним при використанні фізичних воріт: що вихідний затвор не зміниться у відповідь на зміну входу, доки десь після введення фактично не зміниться. Бувають випадки, коли це припущення може не дотримуватися при використанні реальних воріт (наприклад, якщо швидкі ворота NOR і швидкий інвертор обидва приводяться сигналом, який повільно піднімається від VSS до VDD, і якщо інвертор перемикається на 1,2 вольта, коли NOR ворота не перемикаються до 1,7 вольт, затвор NOR може побачити, що вихід інвертора знизиться, перш ніж він побачить, що повільно зростаючий сигнал підвищився), але такі проблеми, як правило, можна вирішити, додаючи буфер кожного разу, коли повільно змінюється сигнал перенаправляється до більш ніж одного пункту призначення. На жаль,

Проблема полягає в тому, що якщо явно не вказано інше, компілятор FPGA може довільно замінити комбінаторну схему зовсім іншою схемою, яка має таку саму стаціонарну поведінку, але може мати зовсім інші строки. Наприклад, припустимо, що складна комбінаторна функція F приймає шість входів U через Z. F подається безпосередньо в ланцюг P, а (F NAND Z) подається в ланцюг Q. Компілятор може усвідомити, що значення, подане на Q, буде залежати тільки від F, коли Z висока, і може обчислити функцію F ', яка подібна F, за винятком того, що Z вважається високим; Тоді Q може живитися (F 'NAND Z), а не (F NAND Z). Цілком можливо, що найбільш ефективна реалізація P матиме п'ять затримок воріт, але найефективніша реалізація Q матиме лише два. Таким чином,

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


0

Детально про те, як зловити засувку в дизайні, коротко пояснено в цьому посиланні.

https://www.doulos.com/knowhow/fpga/latches/


1
Ласкаво просимо на EE.SE! Ви можете покращити свою відповідь, включивши деякі відповідні деталі за посиланням. Це гарантує високу якість відповіді, навіть якщо оригінальна сторінка зникає.
Девід
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.