Різниця між твердженням If-else та Case у VHDL


11

Я хочу зрозуміти, як різні конструкції в коді VHDL синтезуються в RTL.

  • Чи може хто-небудь сказати мені різницю між конструкцією If-Else і конструктами оператора Case процесу в VHDL з точки зору того, як код вводиться в схему RTL інструментом синтезу?
  • Розглянемо випадок численних вкладених if-else та змішування випадок case із конструкцією if-else всередині процесу.
  • Також коли використовувати яку конструкцію?

PS: Я бачив пов'язане питання "Кілька, якщо заяви переробляються в vhdl", але це ніяк не відповідає на моє запитання.


Я не можу коментувати, як би були налаштовані фізичні ворота, але в більшості компіляторів, які випускають збірку x86, if-else зазвичай існує як одна перевірка з умовним стрибком (наприклад, jg, jl, jz, jnz тощо), тоді як перемикач впорядковує випадки в числовому порядку і робить ітеративні dec/ jzінструкції, що набагато ефективніше. Можливо, тут застосовується аналогічна оптимізація.
Поліном

@ Polynomial Поведінка If-else та case значно відрізняється в апаратних мовах порівняно з типовим лінійним програмуванням. Оптимізація оп-коду не дуже актуальна, оскільки оператор HDL виконується "миттєво".
W5VO

Відповіді:


10

Чи може хто-небудь сказати мені різницю між конструкцією If-Else і конструктами оператора Case процесу в VHDL з точки зору того, як код вводиться в схему RTL інструментом синтезу?

if-elsif-elseКонструкція виводить пріоритет мережі маршрутизації:

схематичний

імітувати цю схему - Схематично створено за допомогою CircuitLab

Це відповідає

if bool_expr_1 then
    sig <= val_expr_1;
elsif bool_expr_2 then
    sig <= val_expr_2;
elsif bool_expr_3 then
    sig <= val_expr_3;
else
    sig <= val_expr_4;
end if;

З caseіншого боку, ця конструкція створює великий ol 'mux:

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

Це відповідає

case case_expr is
  when c0 =>
    sig <= val_expr_0;
  when c1 =>
    sig <= val_expr_1;
  when c2 =>
    sig <= val_expr_2;
      ...
  when others =>
    sig <= val_expr_N;
end case;

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

Розглянемо випадок численних вкладених if-else та змішування випадок case із конструкцією if-else всередині процесу.

Відповідно до вищесказаного ви можете бачити, як вони гніздяться / змішуються.

Також коли використовувати яку конструкцію?

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


Я розумію, що реєстр справ працює лише для однієї умови введення, і якщо інше може працювати для кількох умов введення. Але обидві конструкції по суті генерують мюкси (за відсутності кліку). Хіба не можливо, що синтез логіки може оптимізувати одноразовий вхід, якщо інше, до одного великого mux замість ланцюга мюксів? Крім того, що є пріоритетною мережею маршрутизації ... це не просто мережа мюксів, а не 1 великий мукс?
Нурабха

Крім того, коли у нас є процес, чутливий до годинника, якщо інше може генерувати послідовні елементи, такі як регістри, засувки тощо. Чи може випадок справи також генерувати послідовну логіку?
Нурабха

Так, пріоритетною мережею маршрутизації є саме це - ланцюжок мюкс. Природа if-elseконструкції, однак, полягає в тому, де виникає цей ланцюг. Перша умова повинна бути невдалою для другої умови, яку потрібно перевірити. Це не стосується, е, caseконструкції, і саме тому if-elseтвердження не можна було синтезувати як єдиний великий мукс.
Анджело Ставров

1
І так, caseзаява може також генерувати послідовну логіку. Я знайшов "Реальний світ VHDL" , серію слайдів лекцій з Університету Глазго, які можуть вам бути корисними.
Анжело Ставров

Це хороша довідка.
нурабха

4

У цій старій публікації в блозі автор написав і синтезував дві функціонально еквівалентні версії коду VHDL. Один використовує if-else, інший використовує регістр. Результат:

Я синтезував цей код і отримав точні результати. Навіть схема RTL була точно однаковою для обох програм.

І його висновок:

Це показує, що твердження "case" і "if ... elsif ... else" є однаково ефективними. Але якщо ви хочете написати чіткий код, тоді краще використовувати "case". "Case" дуже корисний, коли Вихід залежить від великої кількості умов. Але якщо кількість умов дуже мала (2 або 3), ви можете використовувати "if..elseif..else".

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

Синтезатор VHDL може зробити щось подібне. Але вам все одно знадобиться велика кількість випадків, коли випадок (призначений каламбур), ви, ймовірно, хочете використовувати виписку справи в будь-якому випадку, оскільки це забезпечує кращу читаність там, де є велика кількість варіантів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.