8-900-374-94-44
[email protected]
Slide Image
Меню

Case verilog: Verilog case statement

Операторы if и операторы case в SystemVerilog

В этом посте мы поговорим о двух наиболее часто используемых конструкциях в SystemVerilog — операторе if и операторе case.

В предыдущем посте мы видели, как использовать процедурные блоки, такие как блок always, для написания кода SystemVerilog, который выполняется последовательно.

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

Оператор case и оператор if являются примерами последовательных операторов в SystemVerilog.

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

Оператор if — это условный оператор, который использует логические условия для определения того, какие блоки кода SystemVerilog следует выполнять.

Всякий раз, когда условие оценивается как истинное, выполняется ветвь кода, связанная с этим условием.

Этот оператор похож на оператор if, используемый в других языках программирования, таких как C.

Фрагмент кода SystemVerilog ниже показывает основной синтаксис для оператора if.

 если (<выражение1>) начать
  // Код для выполнения
конец
иначе если (<выражение2>) начать
  // Код для выполнения
конец
иначе начни
  // Код для выполнения
конец
 

Мы можем исключить ветки else и else if из оператора, если они нам не нужны.

Фактически, мы уже видели это в посте о блоках always, где мы использовали макрос posedge для обнаружения нарастающего фронта тактового сигнала.

Мы можем включить столько ветвей if, сколько необходимо для правильного моделирования базовой схемы.

Оператор if использует логические условия, чтобы определить, какие строки кода выполнять.

В приведенном выше фрагменте эти выражения задаются как <выражение1> и <выражение2>.

Эти выражения оцениваются последовательно, и код, связанный с выражением, выполняется, если оно оценивается как истинное.

Будет выполняться только одна ветвь оператора if. Обычно это первое выражение, которое оценивается как истинное.

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

Если мы опускаем ветвь else в нашем коде оператора if, то в этом случае ни одна из ветвей не будет выполняться.

Код, связанный с каждой ветвью, может включать любой допустимый код SystemVerilog, включая дополнительные операторы if. Этот подход известен как вложенные операторы if.

При использовании этого типа кода в SystemVerilog мы должны позаботиться об ограничении количества вложенных операторов, так как это может привести к трудностям во время встречи.

Пример оператора if

Мы уже видели практический пример оператора if при моделировании триггеров и защелок в сообщении о блоке всегда SystemVerilog.

Чтобы более подробно продемонстрировать эту конструкцию, рассмотрим пример мультиплексора с синхронизацией.

В этом примере мы будем использовать триггер D-типа с асинхронным сбросом для регистрации выхода мультиплексора.

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

Фрагмент кода ниже показывает, как мы реализуем это, используя один блок Always_ff SystemVerilog и оператор if.

 always_ff @(часы posedge, сброс posege) начало
  если (сбросить) начать
    Q <= 1'b0;
  конец
  иначе начни
    если (адрес) начать
      Q <= б;
    конец
    иначе начни
      Q <= а;
    конец
  конец
конец
 

В этом примере мы используем первый оператор if, чтобы установить выход триггера в 0b всякий раз, когда активен сброс.

Когда сброс не активен, нарастающий фронт тактового сигнала запускает блок always_ff. Мы используем ветвь else первого оператора if, чтобы зафиксировать это условие.

Мы используем второй оператор if для моделирования поведения схемы мультиплексора. Это пример вложенного оператора if в SystemVerilog.

Когда сигнал addr равен 0b, мы назначаем выход триггера на вход a. Мы используем первую ветвь вложенного оператора if, чтобы зафиксировать это условие.

Затем мы используем ветвь else вложенного оператора if, чтобы зафиксировать случай, когда сигнал адреса равен 1b.

Здесь также можно использовать оператор типа else-if, но оператор else более лаконичен. Поведение одинаковое в обоих случаях, так как в реальной схеме сигнал может быть только 0b или 1b.

Мы используем оператор case SystemVerilog для выбора блока кода для выполнения на основе значения данного сигнала в нашем проекте.

Когда мы пишем оператор case в SystemVerilog, мы указываем входной сигнал для мониторинга и оценки.

Затем значение этого сигнала сравнивается со значениями, указанными в каждой ветви оператора case.

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

Оператор case Verilog выполняет ту же функцию, что и оператор switch в языке программирования C.

В приведенном ниже фрагменте кода показан общий синтаксис оператора case в SystemVerilog.

 случай (<переменная>)
  <значение1> : начало
    // Эта ветвь выполняется, когда <переменная> = <значение1>
  конец
  <значение2>
: начало // Эта ветвь выполняется, когда <переменная> = <значение2> конец по умолчанию: начало // Эта ветвь выполняется во всех остальных случаях конец конец

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

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

Сюда входят дальнейшие последовательные операторы, такие как операторы if или case. Опять же, мы должны попытаться ограничить количество вложенных операторов, поскольку это упрощает выполнение наших требований по времени.

Пример оператора case

Чтобы лучше продемонстрировать, как мы используем оператор case в SystemVerilog, рассмотрим простой пример.

В этом примере мы рассмотрим простую схему мультиплексора четыре к одному.

Мы часто используем оператор case для моделирования больших мультиплексоров в SystemVerilog, поскольку он создает более читаемый код, чем реализации, основанные на непрерывном присваивании.

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

В приведенном ниже коде SystemVerilog показано, как реализовать эту схему с помощью оператора case и блока always_comb.

 always_comb начало
  дело (адрес)
    2'b00 : начало
      д = а;
    конец
    2'b01 : начало
      д = б;
    конец
    3'b10 : начало
      д = с;
    конец
    по умолчанию: начало
      д = д;
    конец
  конец
конец
 

Этот пример показывает, насколько просто смоделировать мультиплексор с помощью оператора case в SystemVerilog. На самом деле оператор case обеспечивает наиболее интуитивно понятный способ моделирования мультиплексора в SystemVerilog.

Хотя этот пример довольно прост, есть несколько важных моментов, которые следует рассмотреть более подробно.

Первое, что следует отметить в этом примере, это то, что мы используем блокирующее присваивание. Причина этого в том, что мы моделируем комбинационную логику, а неблокирующее присваивание не разрешено внутри блока always_comb.

Еще одна вещь, которую следует отметить, это то, что мы могли бы удалить ключевое слово по умолчанию из этого примера. Затем мы бы явно указали значение addr, необходимое для вывода вместо этого значения d.

Однако мы включили в этот пример ключевое слово по умолчанию, чтобы продемонстрировать, как мы используем его на практике.

Упражнения

Какие блоки мы используем для написания последовательных операторов в проекте SystemVerilog?

показать ответ

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

скрыть ответ

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

показать ответ

Ключевые слова else и else if можно исключить, если они не нужны.

скрыть ответ

Сколько ответвлений оператора if может быть выполнено одновременно?

показать ответ

Одновременно может выполняться максимум одна ветвь оператора if.

скрыть ответ

Когда мы можем исключить ветку по умолчанию из оператора case?

показать ответ

Мы можем исключить ветвь по умолчанию, если явно перечислены все допустимые значения входного сигнала.

скрыть ответ

Используйте оператор case для написания кода мультиплексора шесть к одному. Обязательно используйте блок Always_comb SystemVerilog при написании этого кода.

показать ответ

 always_comb начать
  дело (адрес)
    3'b000 : начало
      д = а;
    конец
    3'b001 : начало
      д = б;
    конец
    3'b010 : начало
      д = с;
    конец
    3'b011 : начало
      д = д;
    конец
    3'b100 : начало
      д = е;
    конец
    по умолчанию: начало
      д = ф;
    конец
  конец
конец
 

скрыть ответ

Перепишите мультиплексор шесть к одному из последнего упражнения, чтобы он использовал оператор if.

показать ответ

 always_comb начать
  если (адрес == 3'b000) начать
    д = а;
  конец
  иначе если (адрес = 3'b001) начать
    д = б;
  конец
  иначе если (адрес = 3'b010) начать
    д = с;
  конец
  иначе если (адрес = 3'b011) начать
    д = д;
  конец
  иначе если (адрес = 3'b100) начать
    д = е;
  конец
  иначе начни
    д = ф;
  конец
конец
 

скрыть ответ

full_add - EDA Playground

full_add - Площадка EDA

Загрузка. ..

Внимание! Это упражнение было открыто в другой вкладке; автосохранение отключено. Закройте эту вкладку или обновите ее для повторной активации.

Инструменты и симуляторы

Выберите... Aldec Riviera Pro 2022.04Cadence Xcelium 20.09Mentor Questa 2021.3Synopsys VCS 2021.09Aldec SyntHESer 2022.05Mentor Precision 2021.1Yosys 0.9.0VTR 7.0GHDL 0.37Icarus Verilog 0.9.7Icarus 0.6Iverilog 0.37 23.11.14GPL Версия 2.12 .aVeriWell 2.8.7C++CshPerlPython

  Параметры компиляции

  Параметры выполнения

  Параметры компиляции

  Параметры выполнения

  Параметры компиляции

  Параметры выполнения

  Время выполнения:

Используйте файл run. do Tcl

  Параметры компиляции

  Параметры выполнения

  Время выполнения:

  9 Параметры компиляции

9000 Параметры запуска

  Время выполнения:

Используйте файл run.do Tcl

Используйте сценарий оболочки run.bash

  Параметры компиляции

  Параметры выполнения

  Время выполнения:

Используйте run. do Tcl-файл

Используйте сценарий оболочки run.bash

  Параметры компиляции

  Параметры выполнения

  Время выполнения:

Используйте файл run.do Tcl

Используйте run.bash сценарий оболочки

  Параметры компиляции

  Параметры выполнения

  Время выполнения:

Используйте файл run.do Tcl

Используйте сценарий оболочки run. bash

  Параметры импорта   Параметры настройки   Параметры запуска   Параметры симулятора

  Параметры компиляции

  Параметры выполнения

Используйте файл run.do Tcl

Используйте run.bash сценарий оболочки

  Параметры компиляции

  Параметры выполнения

Используйте файл run.do Tcl

Используйте сценарий оболочки run. bash

  Параметры компиляции

  Параметры выполнения

Используйте файл run.do Tcl

Используйте сценарий оболочки run.bash

  Параметры компиляции

  Параметры выполнения

Используйте файл run.do Tcl

Используйте run.bash сценарий оболочки

использовать ABC с памятью библиотеки ячеек -nomap fsm -nomap пропустить шаг FSM

Вместо этого используйте файл run. ys .

Показать диаграмму после запуска

Показать список соединений после запуска

Показать схема после пробега

Показать HTML после запуска

  Параметры компиляции Выберите... C++98 C++03 C++11 C++14 C++17

Используйте -pedantic -Wall -Wextra

  Параметры запуска

  Аргументы

  Аргументы

Открыть EPWave после запуска

Скачать файлы после запуска

Примеры

с помощью игровой площадки EDA
VHDL
Верилог/СистемВерилог
УВМ
ЛегчеUVM
SVAUnit
SVUnit
VUnit
TL-Verilog
е + Верилог
Питон + Верилог
Только Python
С++/SystemC

Подпишитесь на @edaplayground


  • testbench. sv

Тестовый стенд SV/Verilog

Имя файла

или

Загрузить файлы...

(перетащите куда угодно)

Имя файла

Подтвердите удаление:

  • Эда игровая площадка
  • EPWave
  • Тривиальный пример
  • Оперативная память от EDA Playground
  • Пример OpenCores

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

Создание, удаление и переименование файлов не поддерживаются во время совместной работы. Чтобы поощрить разработку этих функций для совместной работы, отправьте твит на @EDAPlayground

.

Возможно, эта игровая площадка была изменена. Пожалуйста, сохраните или скопируйте перед началом совместной работы.

Поделиться ссылкой

Поделиться в Твиттере

Поделиться на Facebook

Внимание! Курс не выбран.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *