Предупреждение «Направление выбора диапазона не определяет направление диапазона совокупного индекса» при компиляции VHDL с помощью QuestaSim

#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.