Задавать вопрос
спросил
Изменено 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
Так в чем тут проблема?
В имени вашей переменной есть пробел.
запись 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.
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Электронная почта
Обязательно, но не отображается
Электронная почта
Требуется, но не отображается
спросил
Изменено 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;
Что происходит, когда выполняются оба условия? Каково здесь поведение оператора присваивания? Я считаю, что это плохая привычка программирования.
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 ведут себя одинаково; первое истинное условие имеет наивысший приоритет. Как только условие оценивается как истинное, все следующие , иначе пунктов игнорируются.