Я использую 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) ДРУГОЙ выбор не может использоваться в неограниченном агрегировании массива.