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

11

Я хочу понять, как различные конструкции в коде VHDL синтезируются в RTL.

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

PS: я видел связанный вопрос «Несколько операторов if в процессе в VHDL», но это не отвечает на мой вопрос в любом случае.

nurabha
источник
Я не могу комментировать, как будут конфигурироваться физические элементы, но в большинстве компиляторов, которые генерируют сборку x86, if-else обычно существует в виде одной проверки с условным переходом (например, jg, jl, jz, jnz и т. Д.), в то время как switch организует дела в числовом порядке и выполняет итеративные 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Конструкт, с другой стороны, выводит большой старина Мультиплексор:

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

Это соответствует

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, с другой стороны, целесообразно, когда входные данные являются взаимоисключающими.

Анджело Ставров
источник
Я понимаю, что оценка случая работает только для одного условия ввода, а if-else может работать для нескольких условий ввода. Но обе конструкции по существу генерируют муксы (при отсутствии clk). Разве не возможно, что логический синтез может оптимизировать одиночный ввод if-else для одного большого мультиплексора вместо цепочки мультиплексоров? Кроме того, что такое приоритетная сеть маршрутизации ... это не просто цепочка мультиплексоров вместо 1 большого мультиплексора?
Нурабха
Кроме того, когда у нас есть процесс, чувствительный к часам, if-else может генерировать последовательные элементы, такие как регистры, защелки и т. Д. Может ли оператор case также генерировать последовательную логику?
Нурабха
Да, приоритетной сетью маршрутизации является именно это - цепочка мультиплексоров. Природа if-elseконструкции, однако, там, где возникает эта цепь. Первое условие должно быть не выполнено, чтобы проверить второе условие. Это не относится к caseконструкции, и именно поэтому if-elseутверждение не может быть синтезировано как один большой мультиплексор.
Анджело Ставров
1
И да, caseоператор может также генерировать последовательную логику. Я нашел "Real World VHDL" , серию слайдов лекций из Университета Глазго, которые могут быть полезны для вас.
Анджело Ставров
Это хорошая ссылка.
Нурабха
4

В этом старом сообщении в блоге автор написал и синтезировал две функционально эквивалентные версии кода VHDL. Один использует if-else, другой использует case. Результат:

Я синтезировал этот код и получил точные результаты. Даже схема RTL была одинаковой для обеих программ.

И его вывод:

Это показывает, что операторы 'case' и 'if ... elsif ... else' одинаково эффективны. Но если вы хотите написать понятный код, то лучше использовать 'case'. 'Case' очень полезно, когда Вывод зависит от большого числа условий. Но если количество условий очень мало (2 или 3), тогда вы можете использовать 'if..elseif..else'.

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

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

embedded.kyle
источник