Инициализация массива записей в VHDL

у меня есть запись определяется следующим образом

type ifx_t is
record
  data                        : std_logic_vector(127 downto 0);
  address                     : std_logic_vector (19 downto 0); 
  WrReq                       : std_logic;-- 
  RdReq                       : std_logic; --
end record;
type Array_ifx_t is array (0 to 2) of ifx_t;

и я должен инициализировать экземпляр этого массива записей, и я попробовал следующий способ, и он не работает

signal pair_in       : Array_ifx_t:= (others =>((others =>'0'),(others=>'0'),'0','0')); 

просьба помочь.

2 ответов


Как сказано в комментарии, ModelSim работает при компиляции кода из вопроса с ModelSim. Однако другие инструменты могут быть более строгими в использовании типизированного значения для элементов в Array_ifx_t.

для типизированного назначения и использования именованных элементов записи, которые, я думаю, дают обзор геттера и избегают ошибок по ссылкам на позиции, вы можете сделать инициализацию с:

constant IFX_T_0S : ifx_t := (data => (others =>'0'),
                              address => (others=>'0'),
                              WrReq => '0',
                              RdReq => '0');

signal pair_in : Array_ifx_t:= (others => IFX_T_0S);

моя первоначальная реакция на то, чтобы увидеть агрегат в вашем значении по умолчанию для pair_in, заключалась в том, что было слишком много "других", поэтому я независимо написал один, используя само объявление типа записи:

library ieee;
use ieee.std_logic_1164.all;

package some_record is

    type ifx_t is
    record
      data                        : std_logic_vector(127 downto 0);
      address                     : std_logic_vector (19 downto 0); 
      WrReq                       : std_logic;-- 
      RdReq                       : std_logic; --
    end record;
    type Array_ifx_t is array (0 to 2) of ifx_t;
    -- positional association in an aggregate used for initialization:
    signal pair_in:    ifx_t := ((others => '0'), (others => '0'),'0','0');
end package;

и это успешно проанализированы. Агрегат имеет два типа ассоциаций: позиционные или именованные. Приведенное выше выражение значения по умолчанию-positional. С именованной ассоциацией:

signal pair_in:    ifx_t := -- named association of record elements:
                           (
                             data => (others => '0'), 
                             address => (others =>'0'), 
                             WrReq => '0',
                             RdReq => '0'
                           );

вы заметите, что это имеет жуткое сходство с выражением value найден в постоянном объявлении принятого ответа Мортена и фактически рассказывает историю совместимости для агрегированного выражения.

агрегат, совместимый с типом записи, содержит выражение значения, совместимое с каждым элементом типа записи. Это делается для данных и адреса элементов массива, предоставляя агрегаты для их значений по умолчанию, в то время как WrReq и RdReq предоставляются с их значениями по умолчанию напрямую.

дополнительные другие заявления найденное в первоначальной попытке было бы уместно, если бы pair_in был составным типом, состоящим из массива, состоящего из ifx_t элементы типа записи.

LRM (например, IEEE Std 1076-1993) имеет раздел по выражениям, подраздел по агрегатам с дополнительным подразделом по агрегатам записей.

есть также раздел о типах, подраздел о составных типах, с дополнительным подразделом о типах записей.