Определяет ли стандарт языка VHDL поведение условий проверки в операторе if в следующей ситуации:
constant one: std_logic: = '1'; -- always '1'
signal vector: std_logic_vector (2 downto 0);
(...)
if (one or vector(3) ) begin
(...)
в таком случае должна быть ошибка компиляции / разработки / выполнения (вне допустимого диапазона) или если условие должно быть всегда истинным (следовательно, нет необходимости проверять значение вектора (3)?
IEEE Std 1076-2008 9.4 Статические выражения, 9.4.1 «Некоторые формы выражения могут быть оценены во время анализа единицы проектирования, в которой они появляются; такое выражение называется локально статичный». Ограничение локального статического индекса (2 до 0, 9.4.2 Локально статические первичные цвета) можно оценить по выражению локально статического индекса (3). 8.4 Проиндексированные имена «... Будет ошибкой, если значение индекса не принадлежит диапазону соответствующего диапазона индексов массива». Независимо от того, оценивается ли вектор нестатического выражения (3) (9.2.2 Логические операторы «операции короткого замыкания»).
Оператор if имеет тогда после своего условия, а не начинать в VHDL. Ваш фрагмент не использует допустимый синтаксис.
У вас будет ошибка в процессе разработки. Но обычно, когда вы пишете код VHDL, вам не нужны подобные уловки.
Вы пытаетесь использовать этот код для решения проблемы зачатия? Если, например, вы хотите использовать vector (3) только с вектором больше 3, вы можете использовать оператор if ... generate или if ... then для этого.
foo.vhdl:13:26:error: static expression violates bounds
для if one or vector(3) then
, семантическую ошибку, определенную в IEEE Std 1076-2008 8.4 Индексированные имена "... Это ошибка, если значение индекса не принадлежит диапазону соответствующего диапазона индекса множество." Ошибка может быть обнаружена во время анализа (ограничение индекса и значение индекса являются локально статическими, 9.4 Статические выражения). Знаете ли вы об инструменте VHDL с детекцией, а не с определением времени анализа?
Операторы 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.
Это не C. Вы получите ошибку времени компиляции вне допустимого диапазона.