Проверка следующего условия в операторе if, когда все условие будет истинным

Определяет ли стандарт языка VHDL поведение условий проверки в операторе if в следующей ситуации:

constant one: std_logic: = '1'; -- always '1'
signal vector: std_logic_vector (2 downto 0);

(...)
if (one or vector(3) ) begin

(...)

в таком случае должна быть ошибка компиляции / разработки / выполнения (вне допустимого диапазона) или если условие должно быть всегда истинным (следовательно, нет необходимости проверять значение вектора (3)?

Это не C. Вы получите ошибку времени компиляции вне допустимого диапазона.

Oldfart 26.10.2018 17:18

IEEE Std 1076-2008 9.4 Статические выражения, 9.4.1 «Некоторые формы выражения могут быть оценены во время анализа единицы проектирования, в которой они появляются; такое выражение называется локально статичный». Ограничение локального статического индекса (2 до 0, 9.4.2 Локально статические первичные цвета) можно оценить по выражению локально статического индекса (3). 8.4 Проиндексированные имена «... Будет ошибкой, если значение индекса не принадлежит диапазону соответствующего диапазона индексов массива». Независимо от того, оценивается ли вектор нестатического выражения (3) (9.2.2 Логические операторы «операции короткого замыкания»).

user1155120 26.10.2018 21:08

Оператор if имеет тогда после своего условия, а не начинать в VHDL. Ваш фрагмент не использует допустимый синтаксис.

user1155120 27.10.2018 20:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
366
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У вас будет ошибка в процессе разработки. Но обычно, когда вы пишете код VHDL, вам не нужны подобные уловки.

Вы пытаетесь использовать этот код для решения проблемы зачатия? Если, например, вы хотите использовать vector (3) только с вектором больше 3, вы можете использовать оператор if ... generate или if ... then для этого.

ghdl -a --std = 08 foo.vhdl (анализ, -2008) производит foo.vhdl:13:26:error: static expression violates bounds для if one or vector(3) then, семантическую ошибку, определенную в IEEE Std 1076-2008 8.4 Индексированные имена "... Это ошибка, если значение индекса не принадлежит диапазону соответствующего диапазона индекса множество." Ошибка может быть обнаружена во время анализа (ограничение индекса и значение индекса являются локально статическими, 9.4 Статические выражения). Знаете ли вы об инструменте VHDL с детекцией, а не с определением времени анализа?
user1155120 27.10.2018 21:17
Ответ принят как подходящий

Операторы And, nand, or и nor в VHDL в некоторых случаях являются операторами короткого замыкания. Поведение зависит от типов операндов.

Вы используете тип std_logic, которого нет в списке:

9.2 Operators - General
In general, operands in an expression are evaluated before being associated with operators. For certain operations, however, the right-hand operand is evaluated if and only if the left-hand operand has a certain value. These operations are called short-circuit operations. The binary logical operations and, or, nand, and nor defined for operands of types BIT and BOOLEAN are all short-circuit operations; furthermore, these are the only short-circuit operations.

[...]

NOTE 2—A user-defined operator that has the same designator as a short-circuit operator (i.e., a user-defined operator that overloads the short-circuit operator) is not invoked in a short-circuit manner. Specifically, calls to the user-defined operator always evaluate both arguments prior to the execution of the function.

В случае оператора or, если первый операнд истинен, второй операнд не будет оцениваться. В случае оператора and, если первый операнд ложен, второй операнд не будет оцениваться.


Я думаю, что std_logic не указан, это ошибка, сделанная при включении IEEE Std. 1164 в IEEE Std. 1076 для VHDL-2008.

Другие вопросы по теме