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