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

Verilog else if: if statement — If else condition precedence in Verilog

Несколько условий в выражении If Verilog

Задавать вопрос

спросил

Изменено 1 год, 7 месяцев назад

Просмотрено 10 тысяч раз

У меня есть следующий оператор if/else:

 если ((запись1 && запись 2) && ( read_reg1== read_reg2))
      reg_file[write_reg1] = write_data1;
    else if((write1 && write 2) && ( read_reg1!=read_reg2)) начать
      reg_file[write_reg2] = write_data2;
      reg_file[write_reg1] = write_data1;
    конец
    иначе если (напишите1)
      reg_file[write_reg1] = write_data1;
    еще
      reg_file[write_reg2] = write_data2;
 

Я получаю следующие ошибки:

 ОШИБКА VCP2000 "Синтаксическая ошибка. Неожиданный токен: 2[_UNSIGNED_NUMBER].
Ожидаемые токены: '[' , '(*' , '(' , 'with' , '++' .. ..." "design.sv" 23 28 ОШИБКА VCP2000 "Синтаксическая ошибка. Неожиданный токен: ). Ожидаемые токены: '(*' , '++' , '--'." "design.sv" 23 58 ОШИБКА VCP2000 "Синтаксическая ошибка. Неожиданный токен: 2[_UNSIGNED_NUMBER]. Ожидаемые токены: '[' , '(*' , '(' , 'with' , '++' ... . "design.sv" 25 31 ОШИБКА VCP2000 "Синтаксическая ошибка. Неожиданный токен: ). Ожидаемые токены: '(*' , '++' , '--'." "design.sv" 25 60 ОШИБКА VCP2000 "Синтаксическая ошибка. Неожиданный токен: else[_ELSE]. Ожидаемые токены: '#' , ''' , '(' , ';' , '@' ... . "design.sv" 299

Так в чем тут проблема?

  • verilog

В имени вашей переменной есть пробел.

 запись 2
 

Должно быть

 запись2
 

Обратите внимание, что это происходит дважды — в «если» и в первом «иначе если»

Для тех, кто наткнется на этот вопрос в поисках синтаксиса, ниже приведены выдержки из разделов « 4.1.9 Логические операторы

». и « 9.4 Условный оператор » в одной из редакций стандарта Verilog.

Это синтаксис оператора if :

 conditional_statement ::=
    если (выражение)
        оператор_или_нулевой [ иначе оператор_или_нулевой ]
    | if_else_if_statement
 

Если выражение оценивается как истинное (то есть имеет ненулевое известное значение), должен быть выполнен первый оператор. Если он оценивается как false (имеет нулевое значение или значение равно x или z ), первый оператор не должен выполняться. Если есть оператор else и выражение являются ложными, оператор else должен быть выполнен.

А это около логических операторов для объединения нескольких условий в одно выражение:

Операторы логический и (

&& ) и логический или ( || ) являются логическими связками. Результат оценки логического сравнения должен быть 1 (определено как истина ), 0 (определено как ложно ) или, если результат неоднозначен, неизвестное значение ( x ). Старшинство && выше, чем у || , и оба ниже, чем операторы отношения и равенства.

Третий логический оператор — это унарный оператор логического отрицания ( ! ). Оператор отрицания преобразует ненулевой или истинный операнд в 0 и нулевой или ложный операнд в 1 .

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

оператор if — Приоритет условий If else в Verilog

спросил

Изменено 1 год, 2 месяца назад

Просмотрено 677 раз

Я заметил, что существует приоритет присваивания при использовании условий if-else в Verilog. Например, как в коде ниже:

 если (счетчик < 6)
  г <= 1;
иначе если (счетчик < 12)
  г <= 2;
еще
  г <= 3;
 

Я заметил, что пока счетчик меньше 6, значению z присваивается значение 1 ( z <= 1 ) и как только значение счетчика превышает 6 и меньше 12, z присваивается значение 2 ( z <= 2 ).

Что делать, если в условных выражениях используются разные переменные, как в приведенном ниже коде?

 если (wire1_is_enabled)
  г <= 1;
иначе если (wire2_is_enabled)
  г <= 0;
 

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

  • оператор if
  • Verilog
  • системный Verilog

1

Да, вложенные операторы ветвления if-else естественным образом имеют приоритет в порядке выполнения. Подумайте об использовании инструкции case вместо глубокой вложенности , если операторы гораздо более читабельны.

В этом стиле кодирования нет ничего плохого, если только у вас нет такого кода:

 if(counter < 6)
  г <= 1;
иначе если (счетчик < 2)
  г <= 2; // недоступен
еще
  г <= 3;
 

Тогда утверждение z <= 2; становится недостижимым , потому что, когда первое условие ложно, второе условие никогда не может быть истинным. К счастью, есть ряд инструментов, которые могут отметить эту проблему для вас.

Оба оператора if и case предполагают логику приоритета. Однако у вас есть возможность явно добавить ключевое слово

с приоритетом или уникальное ключевое слово перед ключевыми словами if или case , чтобы объявить и проверить свое намерение. См. разделы 12.4 и 12.5 в IEEE 1800-2017 SystemVerilog LRM.

Операторы 2 if/else ведут себя одинаково; первое истинное условие имеет наивысший приоритет. Как только условие оценивается как истинное, все следующие , иначе пунктов игнорируются.

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

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