Предупреждение «Направление выбора диапазона не определяет направление диапазона агрегатного индекса» при компиляции VHDL с QuestaSim - PullRequest
2 голосов
/ 19 марта 2019

Я получаю предупреждение, которое не понимаю при компиляции 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 Ответ

3 голосов
/ 19 марта 2019

Агрегат

(foo'high => '1', foo'high - 1 downto foo'low => '0')

имеет направление диапазона индекса «к». Ваше предупреждение гласит: не думайте, что его направление "вниз" только потому, что вы включили в него массив, который определен как "вниз" .

Почему направление по умолчанию «к»? Что ж, нам нужно подумать о том, какого типа этот агрегат. (Давай - это VHDL - у него должен быть тип).

В моем коде это тип unsigned. Зачем? Ну, потому что я связал его с входом для процедуры типа unsigned. В вашем коде его тип также unsigned. Зачем? Ну, потому что это правый аргумент оператора =, левый аргумент которого определенно равен unsigned. Существует только одна возможная версия оператора =, которая может быть проверена двумя unsigned с.

Теперь нам нужно посмотреть, как объявлен тип unsigned, и когда мы увидим, что он объявлен как неограниченный массив с типом индекса natural:

type unsigned is array (natural range <>) of std_logic;

Левое значение типа natural равно 0. Итак, именно поэтому ваш агрегат имеет направление диапазона индекса «к».


Если вы выполните этот код, вы увидите, как 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= " & integer'image(foo'left);
      report "foo'right= " & integer'image(foo'right);
      report "foo'high= " & integer'image(foo'high);
      report "foo'low= " & integer'image(foo'low);
     end procedure;
  begin
    display((foo'high => '1', foo'high - 1 downto foo'low => '0'));
    wait;
  end process;

end architecture A;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...