Как исправить предупреждение Xilinx ISE о списке конфиденциальности?

Я синтезировал свой дизайн с помощью Xilinx ISE 13.1. Целевое устройство — Virtex 5. Затем я столкнулся с этим предупреждением:

 WARNING:Xst:819 - "F:/FRONT-END/h264/inter/src/eei/eei_mvd.vhd" 
line 539: One or more signals are missing in the process sensitivity list. 
To enable synthesis of FPGA/CPLD hardware, XST will assume that all necessary signals are present in the sensitivity list. 
Please note that the result of the synthesis may differ from the initial design specification. The missing signals are:    
<mvd_l0<3><3>>, <mvd_l0<3><2>>, <mvd_l0<3><1>>, <mvd_l0<3><0>>, <mvd_l0<2><3>>, <mvd_l0<2><2>>,
 <mvd_l0<2><1>>, <mvd_l0<2><0>>, <mvd_l0<1><3>>, <mvd_l0<1><2>>, <mvd_l0<1><1>>, <mvd_l0<1><0>>,
 <mvd_l0<0><3>>, <mvd_l0<0><2>>, <mvd_l0<0><1>>, <mvd_l0<0><0>>, <mvd_l1<3><3>>, <mvd_l1<3><2>>,
 <mvd_l1<3><1>>, <mvd_l1<3><0>>, <mvd_l1<2><3>>, <mvd_l1<2><2>>, <mvd_l1<2><1>>, <mvd_l1<2><0>>,
 <mvd_l1<1><3>>, <mvd_l1<1><2>>, <mvd_l1<1><1>>, <mvd_l1<1><0>>, <mvd_l1<0><3>>, <mvd_l1<0><2>>, 
<mvd_l1<0><1>>, <mvd_l1<0><0>>, <mvd<0>>, <mvd<1>>

Вот мой исходный код:

proc_update_next: process(mvd_l0, mvd_l1, mvd, subMBPart_Idx, MBPart_Idx, eei_info )
  begin
    --// Init
    next_mvd_l0 <= mvd_l0;
    next_mvd_l1 <= mvd_l1;
    --// Change
    if eei_info.mb_type =  BLK_8x8 then
      for  i in 3 downto 0 loop
        for  j  in 3 downto 0  loop
          if i = to_integer(unsigned(MBPart_Idx))  and j = to_integer(unsigned(subMBPart_Idx)) then
            next_mvd_l0(i)(j)  <=  mvd(0);
            next_mvd_l1(i)(j)  <=  mvd(1);
          end  if;
        end  loop;
      end loop;
    else
      for  i in 3 downto 0 loop
        if i = to_integer(unsigned(MBPart_Idx)) then
          next_mvd_l0(i)(0)  <=  mvd(0);
          next_mvd_l1(i)(0)  <=  mvd(1);
        end  if;
      end loop;
    end if;
  end process;

Обновление: я немного изменил свой код и все еще это предупреждение.

mvd_l0 и mvd_l1 — это двумерный массив, и он появился в списке чувствительности. Я знаю, что мой исходный код слишком абстрактен, и ISE может его не понять.

Я пробовал с Virtex 7 (не доступен в лаборатории), тогда ошибок нет. Итак, мой вопрос: как исправить это предупреждение? Я не могу игнорировать это предупреждение, потому что оно может привести к защелке.


person Khanh N. Dang    schedule 26.02.2013    source источник
comment
Xilinx XST использует старый синтаксический анализатор VHDL для старых устройств и новый для новых устройств. Ни один из них не понимает VHDL так хорошо, как хотелось бы пользователям, поэтому они позволяют вам выбрать наименее плохой вариант с помощью параметра командной строки use_new_parser=yes (вероятно, также доступного в качестве флажка в диалоговом окне «Свойства» для инструмента синтеза). Это позволит вам использовать новый парсер для старых устройств Virtex-5. Кстати, я надеюсь, вы убедились, что этот код делает ТОЧНО то, что вы хотите в симуляции. Если нет, я думаю, вы будете разочарованы тем, что делает синтезированный код.   -  person user_1818839    schedule 26.02.2013
comment
@BrianDrummond: Стало лучше, спасибо. Мой дизайн реализован в прототипе ASIC и FPGA. Хотя у компилятора дизайна нет ошибок, Xilinx по-прежнему так делает. Поведение в ModelSim правильное, позже попробую с файлом sdf.   -  person Khanh N. Dang    schedule 26.02.2013
comment
В случае прототипирования ASIC: попробуйте синтезировать его также с Vivado, новым инструментом Xilinx (›=Series 7). Просто чтобы сопоставить результаты и усреднить предупреждение :-)   -  person vermaete    schedule 26.02.2013
comment
Затем у вас есть отдельный тактовый процесс, который копирует next_mvd_* в mvd_. Обычно лучше объединить два процесса в один процесс с синхронизацией, полностью исключить next_ и большой подверженный ошибкам список конфиденциальности. Но учитывая существующую рабочую кодовую базу, я понимаю нежелание этого делать...   -  person user_1818839    schedule 26.02.2013
comment
@vermaete: Другой инструмент не является хорошим методом, потому что у нас уже есть действующая лицензия Xilinx. Так что попробую в свободное время.   -  person Khanh N. Dang    schedule 26.02.2013
comment
@BrianDrummond: я не совсем понял ваш комментарий (мой родной язык не английский). Я разделил на два процесса. Вы рекомендовали объединить два процесса в один? Да, next_mvd* обновляется как mvd_*.   -  person Khanh N. Dang    schedule 26.02.2013
comment
Да, я рекомендовал объединить два процесса в один. Оба подхода работают (если они правильно написаны!) и должны генерировать одно и то же оборудование: однако один процесс меньше и его легче получить правильно (только часы и сброс в списке чувствительности!)   -  person user_1818839    schedule 26.02.2013


Ответы (3)


Используйте конструкцию process(all) VHDL-2008, чтобы указать инструментам, что вы хотите, чтобы список чувствительности включал все считываемые сигналы.

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

person Martin Thompson    schedule 27.02.2013

Такие сигналы, как next_mvd_l0 и next_mvd_l1, следует устанавливать только один раз для набора условий. Раздел «init» все еще остается проблемой. Возможно, лучше использовать локальные переменные, если вы избегаете сброса процесса.

Лучший вариант: добавьте сброс в список чувствительности и, если он включен, установите для next_mvd_* ваши значения инициализации.

--// Init
if (reset = '1') then
    next_mvd_l0 <= mvd_l0;
    next_mvd_l1 <= mvd_l1;
end if;

Второй вариант: использовать локальную переменную

proc_update_next: process(mvd_l0, mvd_l1, mvd, subMBPart_Idx, MBPart_Idx, eei_info )
    variable mvd_10_local : 2dArrayType;
    variable mvd_11_local : 2dArrayType;
begin
    --// Init
    mvd_10_local := mvd_l0;
    mvd_11_local := mvd_l1;
    --// Change
    if eei_info.mb_type =  BLK_8x8 then
        for  i in 3 downto 0 loop
            for  j  in 3 downto 0  loop
                if i = to_integer(unsigned(MBPart_Idx))  and j = to_integer(unsigned(subMBPart_Idx)) then
                    mvd_10_local(i)(j)  :=  mvd(0);
                    mvd_11_local(i)(j)  :=  mvd(1);
                end  if;
            end  loop;
        end loop;
    else
        for  i in 3 downto 0 loop
            if i = to_integer(unsigned(MBPart_Idx)) then
                    mvd_10_local(i)(j)  :=  mvd(0);
                    mvd_11_local(i)(j)  :=  mvd(1);
            end  if;
        end loop;
    end if;
    next_mvd_l0 <= mvd_10_local;
    next_mvd_l1 <= mvd_l1_local;
end process;
person Voider    schedule 26.02.2013
comment
Не правда. Нет ничего плохого в многократном присвоении этим сигналам, при условии, что разработчик четко понимает, что при активации любого одного процесса последнее присвоение побеждает. - person user_1818839; 26.02.2013

Вы используете конструкцию записи VHDL (eei_info.mb_type). Вы можете добавить каждый элемент записи в sens-list, чтобы сделать xst счастливым. Я просто игнорирую это предупреждение.

person user2099996    schedule 04.03.2013