Як уникнути засувок під час синтезу


9

Я хочу створити блок комбінаційної логіки за допомогою VHDL, але періодично синтезований результат містить ненавмисну ​​засувку.

Яких вказівок щодо кодування мені потрібно дотримуватися, щоб уникнути синтезатора від виводів засувок?

Приклад: у малому сегменті коду я повинен використовувати оператори if-else?


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

Я не був впевнений, що ти маєш на увазі з свого прикладу. Переконайтеся, що переформатування відповідає первинному наміру.
W5VO

@fatai, я вже коментував, є специфічний метод видалення вашого акаунта, доступний на meta.stackexchange.com. Я зв’язав останнє запитання, на яке я позначений. Модератори на сайті не мають такої сили ніколи. Для цього потрібно звернутися до команди розробників.
Кортук

Відповіді:


13

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

наприклад,

if a = '1' then
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

буде генерувати засувку, оскільки в першій умові значення b (1) не вказане, тому компілятор вирішив, що ви хочете зберегти попереднє значення b (1) там. Один із способів написати це, що не створить засувку:

if a = '1' then
   b <= prev_b;
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

...

if rising_edge (clk)
    prev_b <= b;
end if;

Тут ви чітко заявляєте, що b має зберегти своє старе значення, а потім замініть b (0) на нове значення.

Інший спосіб - дати ба за замовчуванням значення, як у відповіді @ TomiJ.

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


Я не думаю, що ваш підхід b <= bдозволить уникнути засувки, оскільки це все ще вимагає збереження стану сигналу.
Томі Джуніла

Можливо ти правий; Я занадто звик до тактової логіки. Я відредагую.
fbo

6

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

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

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


5

Чотири правила, щоб уникати засувок:

  • Не читайте з сигналів, на які ви пишете.
  • Складіть правильний список чутливості (усі прочитані вами сигнали повинні бути у списку чутливості)
  • Переконайтеся, що всі сигнали, на які позначаються ваші записи, призначаються на кожному шляху. (наприклад: у кожній гілці оператора if-else)
  • Для процесів, які використовують змінну, переконайтеся, що кожна змінна ініціалізується за замовчуванням, перш ніж її читати (в іншій змінній або сигналі).

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

Кілька стилів кодування можуть допомогти вам дотримуватися цих правил, наприклад стиль у відповіді @ TomiJ. Як зазначає @Martin Thompson, може бути краще уникати комбінаційної логіки разом. Покладіть все замість цього процесу.


+1 Хороший набір правил. Чи погоджуєтесь ви, що ваше правило №2 (про список чутливості) насправді важливе для забезпечення послідовних результатів між синтезом та моделюванням, але насправді не має значення щодо виводу засувок?
рик

@rick AFAIK, немає гарантії того, що буде робити інструмент синтезу із неповними списками чутливості. Стандарт IEEE для синтезу VHDL (1076.6-1999) зазначає, що: "Список чутливості процесу повинен містити всі сигнали, прочитані в операторі операції. Процеси із неповними списками чутливості не підтримуються." Це означає, що я знаю, що певні інструменти синтезу (можливо, всі?) Приймають неповні списки чутливості, але просто ігнорують список чутливості разом. Якщо ви покладаєтесь на таку поведінку замість суворішого стандарту IEEE, я думаю, ваше твердження було б правильним.
Філіп

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

3

Як вказували @fbo та @Martin Thompson, вам потрібно переконатися, що кожному сигналу, керованому процесом, присвоюється якесь значення у кожній гілці процесу, і це значення не повинно залежати від попереднього стану будь-якого з виходів процесу.

Найпростіший спосіб забезпечити це - призначити деяке значення за замовчуванням кожному виводу на самому початку процесу, наприклад (кооптування прикладу fbo):

COMBO: process(a)
begin
    b <= (others => '0'); -- Assign default value to b
    if a = '1' then
        b(0) <= '1';
    else
        b(1 downto 0) <= "00";
    end if;
end process COMBO;

1
Це хороший метод, який я часто використовую. Однак іноді попередження про засувку може вказувати на те, що ви забули призначити деякі біти, тоді як цей метод може ускладнити пошук помилки. Наприклад, якщо ви призначали всі біти широкого сигналу окремо і випадково неправильно рахувались.
fbo

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