2013-12-17 3 views
7

Я-запись определяется следующим образомИнициализация массива записей в 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')); 

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

+0

Какой инструмент вы используете и какое сообщение об ошибке вы видите? Он отлично работает в компиляции ModelSim. –

+0

При этом сообщение об ошибке «Формальное не имеет фактического значения или значения по умолчанию», и код выполняется в «Симулятор ISim: Синтаксис проверки поведения». – mohit

+0

Просто попробовал ISIM 14.6 (nt64), который передает «Синтаксис проверки поведения» без ошибок. Возможно, ошибка связана с некоторыми отношениями с другим кодом. Вы можете попытаться вырезать модуль только на сущность, архитектуру и код выше, а затем посмотреть, проходит ли он. В противном случае, пожалуйста, разместите здесь весь вырезанный модуль. –

ответ

7

Как сказано в комментарии, 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); 
+0

Спасибо за ответ. Тем не менее его не работает. Сообщение об ошибке «Формальное не имеет фактического значения или значения по умолчанию» – mohit

+0

Ключом является слово «Формальный» ...есть код, о котором вы нам не рассказываете, параметр порта или процедуры, который называется «pair_in», который неправильно подключен к этому сигналу (или иначе инициализирован). Найдите это и добавьте его в вопрос. –

+0

И это звучит как a) Не существует выражения по умолчанию, где 'pair_in' объявляется как« формальный порт или формальный родословный объект проектирования, оператор блока или формальный параметр подпрограммы »(LRM-словарь для формального), и он не управляется. Вы используете имя 'pair_in' в нескольких местах? – user1155120

2

Моей первой реакцией видеть совокупность в ваше значение по умолчанию для 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; 

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

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

Вы заметите это имеет странное сходство с выражением значения, найденного в постоянном заявлении Мортена принято отвечать, а на самом деле рассказывает о совместимости для агрегатного выражения.

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

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

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

Существует также раздел «Типы», подраздел «Композитные типы», с дополнительным подразделением «Типы записей».

Смежные вопросы