Різниця між блокуванням та неблокувальним призначенням Verilog


15

Я читав цю сторінку http://www.asic-world.com/verilog/verilog_one_day3.html, коли натрапив на таке:

Нам зазвичай доводиться скидати шльопанці, таким чином, кожного разу, коли годинник робить перехід від 0 до 1 (позиція), ми перевіряємо, чи встановлено скидання (синхронний скидання), то ми продовжуємось із звичайною логікою. Якщо ми уважно придивимось, то ми бачимо, що у випадку комбінаційної логіки у нас було "=" для призначення, а для послідовного блоку у нас був оператор "<=". Ну, "=" блокує призначення, а "<=" - неблокує призначення. "=" виконує код послідовно всередині початку / кінця, тоді як неблокування "<=" виконується паралельно.

Я був досить впевнений, що неблокуючі завдання є послідовними, а блокування завдань паралельним. Зрештою, ви можете робити блокування завдань із завданнями присвоєння поза завжди блоками, і всі вони працюють паралельно. Це помилка, чи поведінка відрізняється всередині блоку? І якщо поведінка ВІД завжди блоку відрізняється, чи можуть неблокуючі призначення виконуватись поза блоком завжди?

Відповіді:


21

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

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

Неблокуюче призначення виконується паралельно, оскільки воно описує завдання, які відбуваються одночасно. Результат заяви на 2-му рядку не буде залежати від результатів заяви на 1-му рядку. Натомість 2-й рядок буде виконуватися так, ніби 1-й рядок ще не відбувся.


То як щодо призначення заяв? Вони просто в цілому своєму класі?
Порожня зірка

4
Так, assignвисловлювання трапляються поза блоками завжди і зазвичай використовуються для опису комбінаторної (непов’язаної) логіки (тоді як завжди блоки, за деякими винятками, описують послідовну логіку). AFAIK, assignзаяви завжди виконуються "паралельно", коли їх LHS має зміну значення.
The Photon

Гаразд ... Я починаю створювати враження, що Verilog просто не найелегантніша мова. Це буде так, як було вивчення C.
Порожня зірка

1
Verilog був покликаний "описати" апаратне забезпечення, яке вже існує. Використання його як мови для проектування (синтезу) апаратних засобів - це злом.
The Photon

4
якщо Verilog "як навчання C" є проблемою, погляньте на VHDL. Деякі люди мають досить сильні уподобання до того чи іншого. Для деяких, VHDL - це занадто багатослівний. Мені це набагато краще продумано. (семантика присвоєння сигналу / змінної набагато чіткіша, ніж блокування / не, наприклад). stackoverflow.com/questions/13954193 / ... і sigasi.com/content/vhdls-crown-jewel Ви можете віддати перевагу його або ненавидіти. Але це варто подивитися.
Брайан Драммонд

6

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

Призначення блокування впливає негайно на його обробку. Неблокуюче призначення відбувається в кінці обробки поточної "часової дельти".

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

При моделюванні послідовної логіки (наприклад, завжди @ (posedge clk)) ви зазвичай використовуєте неблокуючі припущення. Це дозволяє визначити "стан після краю годинника" за терміном "стан перед краєм годинника".

Іноді корисно використовувати блокування призначення в послідовних блоках завжди як "змінні". Якщо ви це зробите, то слід пам’ятати два ключових правила.

  1. Не отримуйте доступу до регістру, встановленого блокуючими призначеннями всередині послідовного блоку завжди ззовні завжди блоку, якому він призначений.
  2. Не змішуйте блокуючі та неблокуючі завдання до однієї рег.

Порушення цих правил, ймовірно, може призвести до збоїв синтезу та / або відмінностей у поведінці між моделюванням та синтезом.


"" Не отримуйте доступу до регістру, встановленого блокуючими призначеннями всередині послідовного блоку завжди ззовні завжди блоку, який йому призначено. "" Чи можете ви пояснити це?
користувач125575

Різні послідовні блоки завжди не мають визначеного порядку. Тож читання набору "reg" із блокуванням блоку в одному блоці завжди з іншого блоку завжди призведе до непередбачуваної поведінки.
Пітер Грін

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

IIRC, принаймні, у кварті, це вважається лише попередженням, а не помилкою.
Пітер Грін

5

Термін " Блокування призначення" бентежить людей, оскільки , здавалося б, блокування слів підказує логічну послідовність часу. Але в синтезованій логіці це не означає , тому що все працює паралельно .

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

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

Синтезується підмножина Verilog (і особливо SystemVerilog) надзвичайно проста та проста у використанні - як тільки ви дізнаєтесь необхідні ідіоми. Вам просто потрібно обійти розумне використання термінології, пов’язаної з так званими елементами поведінки в мові.


У поведінкових стилях кодування ( порівняно з RTL ) різниця між блокуванням та неблокуванням може бути актуальною. У деяких випадках інструмент синтезу може виявити функціонально еквівалентну RTL з поведінкових компонентних конструкцій.
nobar

Звичайно, процедурний режим SystemVerilog, застосовний особливо до initialвисловлювань всередині programблоків, використовує (часовий послідовний) блокування призначення . Це корисно для тестових конструкцій, але, як правило, не для специфікації RTL.
nobar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.