Как избежать защелок во время синтеза

9

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

Каким правилам кодирования я должен следовать, чтобы синтезатор не вывел защелки?

Пример: в небольшом сегменте кода я должен использовать операторы if-else?

W5VO
источник
Если можно получить то, что я пытаюсь спросить, пожалуйста, сообщите мне
Я не был уверен, что ты имел в виду из своего примера. Пожалуйста, убедитесь, что формулировка соответствует вашему первоначальному замыслу.
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) новым значением.

Другой способ - указать значение ba по умолчанию, как в ответе @ TomiJ.

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

FBO
источник
Я не думаю, что ваш подход b <= bпозволит избежать защелки, поскольку он все еще требует сохранения состояния сигнала.
Томи Джуннила
Вы можете быть правы; Я слишком привык к тактичной логике. Я буду редактировать.
ФБО
6

Если вы используете процессы для комбинационной логики (и я советую против этого только по этой причине), убедитесь, что каждый путь в процессе назначает что-то каждому сигналу, который управляет процесс. Ни один из выходов не может зависеть от каких-либо выходов «последнего времени», в течение которого выполнялся процесс.

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

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

Мартин Томпсон
источник
5

Четыре правила, чтобы избежать защелок:

  • Не читайте по сигналам, на которые вы пишете.
  • Иметь правильный список чувствительности (все сигналы, которые вы читаете, должны быть в списке чувствительности)
  • Удостоверьтесь, что все сигналы, которым ваша запись назначена в каждом пути. (например: в каждой ветви оператора if-else)
  • Для процессов, которые используют переменную, убедитесь, что каждая переменная инициализируется значением по умолчанию, прежде чем читать его (в другой переменной или сигнале).

Кроме того, если у вас есть несколько комбинационных процессов, убедитесь, что вы не создаете цикл.

Несколько стилей кодирования могут помочь вам придерживаться этих правил, например, стиль в ответе @ TomiJ. Как отмечает @Martin Thompson, может быть, лучше всего избегать комбинационной логики. Вместо этого поместите все в синхронизированный процесс.

Philippe
источник
+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
Только в комбинаторном процессе. В синхронизированном процессе вы выводите триггер, который может быть именно тем, что вы хотите.
Мартин Томпсон