#vhdl #questasim
#vhdl #questasim
Вопрос:
Я получаю предупреждение, которое я не понимаю при компиляции VHDL в QuestaSim:
(vcom-1514) Направление выбора диапазона (downto) не определяет направление диапазона совокупного индекса (to).
Код, который запускает предупреждение, аналогичен имеющему
signal foo : unsigned(4 downto 0);
в архитектуре перед begin
и затем внутри некоторого процесса
if foo = (foo'high => '1', foo'high - 1 downto foo'low => '0') then
Строка выше вызовет предупреждение, пока
if foo = (foo'high => '1', foo'low to foo'high - 1 => '0') then
не определяет, даже если направление индекса foo
равно downto
, а не to
.
У кого-нибудь есть идея, почему я должен выполнять индексацию с to
, а не с downto
в данном случае?
Комментарии:
1. Такое же предупреждение выдается при использовании
'range
атрибута вdownto
векторе (например,if foo = (foo'range => '1') then
). Аналогично исходному вопросу,reverse_range
не вызывает предупреждение дляdownto
вектора.
Ответ №1:
Совокупный
(foo'high => '1', foo'high - 1 downto foo'low => '0')
имеет направление диапазона индекса ‘to’. В вашем предупреждении говорится: не воображайте, что его направление «downto» только потому, что вы включили в него массив, в котором определено как «downto».
Почему по умолчанию используется направление «to»? Что ж, нам нужно подумать о том, к какому типу относится этот агрегат. (Да ладно — это VHDL — у него должен быть тип).
В моем коде это тип unsigned
. Почему? Ну, потому что я связал это с вводом в процедуру типа unsigned
. В вашем коде его тип также unsigned
. Почему? Ну, потому что это правый аргумент =
оператора, чей левый аргумент определенно unsigned
. Существует только одна возможная версия =
оператора, которым это может быть, та, которая проверяет два unsigned
s.
Теперь нам нужно посмотреть, как объявлен тип unsigned
, и когда мы это сделаем, мы увидим, что он объявлен как неограниченный массив с типом индекса natural
:
type unsigned is array (natural range <>) of std_logic;
Левое значение типа natural
равно 0. Итак, вот почему ваш агрегат имеет направление диапазона индекса ‘to’.
Если вы выполните этот код, вы сможете увидеть, как VHDL определил индексацию для агрегата:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity E is
end entity ;
architecture A of E is
signal foo : unsigned(4 downto 0);
begin
process
procedure display (constant foo : in unsigned) is
begin
report "foo'left= " amp; integer'image(foo'left);
report "foo'right= " amp; integer'image(foo'right);
report "foo'high= " amp; integer'image(foo'high);
report "foo'low= " amp; integer'image(foo'low);
end procedure;
begin
display((foo'high => '1', foo'high - 1 downto foo'low => '0'));
wait;
end process;
end architecture A;
Комментарии:
1. Правила определения диапазона индекса агрегата содержатся в стандарте IEEE Std 1076-2008 9.3.3.3 Агрегаты массива. Также смотрите 9.3.5 Квалифицированные выражения «Квалифицированное выражение — это базовая операция (см. 5.1), которая используется для явного указания типа и, возможно, подтипа операнда, который является выражением или агрегатом». Где
subtype foo_st is unsigned (4 downto 0);
и дляdisplay(foo_st'(foo'high => '1', foo'high - 1 downto foo'low => '0'));
агрегат будет иметь диапазон индекса от 4 до 0.