Инициализация массива VHDL Modelsim выдает предупреждение (vcom-1320) - PullRequest
2 голосов
/ 14 июля 2020

Я использую VHDL-компилятор Modelsim (vcom) для линтинга кода с помощью SublimeText (VHDL 2008). При инициализации массива standard_logic_vector я получаю следующее предупреждение:

vcom: warning Предупреждение - (vcom-1320) Тип выражения "(OTHERS => '0')" неоднозначен; с использованием типа элемента STD_LOGIC_VECTOR, а не агрегированного типа t_a_reg.

Минимальный пример кода выглядит следующим образом:

library ieee;
use ieee.std_logic_1164.all;

entity module is
  port
  (
    clk : in std_logic;
    rst : in std_logic;
    ...
  );
end entity;

architecture rtl of module is

  type t_a_reg is array (integer range <>) of std_logic_vector(15 downto 0);
  signal s_event_reg : t_a_reg(1 downto 0) := (others => (others => '0'));   -- this gives the warning

  ...

begin
  ...

end architecture;

Я проверил в Modelsim, набрав verror 1320 в консоли tcl, который дает следующее объяснение:

vcom Сообщение № 1320: Выражение каждой ассоциации элементов агрегата массива может иметь тип элемента или тип самого агрегата. Когда агрегат массива относится к типу массива, подтип элемента которого является составным, некоторые виды его выражений ассоциации элементов могут быть интерпретированы как потенциально относящиеся к одному из этих двух типов. Обычно это происходит только в том случае, если неоднозначное выражение само по себе является агрегатом (поскольку тип агрегата должен определяться исключительно из контекста, в котором появляется агрегат, исключая сам агрегат, но используя тот факт, что тип агрегата должен быть составной тип) или вызов функции, который идентифицирует две перегруженные функции. Эта неоднозначность устранена в пользу типа элемента для поддержки обратной совместимости с предыдущими версиями VHDL, в которых тип элемента был единственным рассматриваемым типом. [DO C: IEEE Std 1076-2008 VHDL LRM - 9.3.3.3 Агрегаты массива]

Я нашел два способа инициализировать массив без предупреждения, но оба имеют fl aws.

Первый - проблема c, если размер std_logic_vector изменяется, так как мне нужно изменить инициализацию:

  type t_a_reg is array (integer range <>) of std_logic_vector(15 downto 0);
  signal s_event_reg : t_a_reg(1 downto 0) := (others => x"0000");            -- no warning

Второй метод довольно многословен, и я не очень нравится:

  subtype t_vec is std_logic_vector(15 downto 0);
  constant c_vec_init : t_vec := (others => '0');
  type t_a_reg is array (integer range <>) of std_logic_vector(15 downto 0);
  signal s_event_reg : t_a_reg(1 downto 0) := (others => c_vec_init);        -- no warning

Вопрос: есть ли правильный способ инициализации массива VHDL-2008, чтобы я не получал предупреждения? Вопрос скорее философский, поскольку код работает. Я просто хотел бы знать, если я что-то упускаю.

Заранее спасибо!

Питер

Редактировать: Я забыл упомянуть, я также попробовал квалифицированный выражение:

  type t_a_reg is array (integer range <>) of std_logic_vector(15 downto 0);
  signal s_event_reg : t_a_reg(1 downto 0) := (others => std_logic_vector'(others => '0'));

Однако это приводит к реальной ошибке:

vcom: error - Ошибка - (vcom-1076) ДРУГОЙ выбор не может использоваться в неограниченном агрегировании массива.

1 Ответ

1 голос
/ 14 июля 2020

Как насчет использования определения типа :

signal s_event_reg : t_a_reg(1 downto 0) := (others => std_logic_vector'(others => '0'));
--                                                     ^^^^^^^^^^^^^^^^^
...