Перейти к содержанию
    

IP ядро. Работает в ISE, не работает в Vivado

Здравствуйте.

Сложилась неприятная ситуация.

Есть стороннее IP ядро. 

В симуляторе Acitive-HDL - корректно работает.

Если развести в ISE 14.7 и залить в плис (Virtex6) -  корректно работает.

Если моделировать в симуляторе оригинальное IP ядро Vivado - корректно работает.

Если развести в Vivado 2017.4 и залить в плис (Virtex7) -  не корректно работает.

Если после синтеза сделать write_verilog -force IP.v и моделировать с IP.v вместо оригинального IP - не корректно работает.

IP ядро реализовано на VHDL, используются примитивы V6, много функций. Обвязку к ядру пишу я.

Нормального описания как оно устроено нет. Как оно работает имею поверхностное представление.

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

Всем спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, Tpeck сказал:

Сложилась неприятная ситуация.

Есть стороннее IP ядро. 

....

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

Пока Вы разбираетесь, время идет.

Поэтому я бы пошел таким путем. Разработчик ядра известен? Я бы для начала написал ему и спросил, какие примитивы и библиотечные узлы из либгайда там использованы. Вероятно что они работают на 6-й серии, но не работают на 7-й серии...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

37 minutes ago, Tpeck said:

Здравствуйте.

Сложилась неприятная ситуация.

....

Да уж не позавидуешь такому :( 

Я не совсем понял исходники IP открыты или нет?   

Хотя это не столь важно чтобы понять в чем разница - можно попробовать синтезировать с сохранением иерархии. Затем отсимить оригинал и получившийся нелист и сравнить результаты сима на интерфейсах модулей. При определенной удаче можно быстро выйти на источник различий. 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/27/2018 at 12:00 AM, RobFPGA said:

Приветствую!

Да уж не позавидуешь такому :( 

Я не совсем понял исходники IP открыты или нет?   

Хотя это не столь важно чтобы понять в чем разница - можно попробовать синтезировать с сохранением иерархии. Затем отсимить оригинал и получившийся нелист и сравнить результаты сима на интерфейсах модулей. При определенной удаче можно быстро выйти на источник различий. 

Удачи! Rob.

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

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

Сначала от std_logic_vectora брался модуль с помощью самописной функции и знак, как старший бит.

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

Все это было параметризуемо, что только добавляло радости.

До этого куска, тоже пришлось вносить исправления, но после исправления данного участка, данные с IP ядра в Virtex7 стали адекватными.

Всем спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поддерживаю предложение обратиться к разработчику.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, Tpeck сказал:

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

Сначала от std_logic_vectora брался модуль с помощью самописной функции и знак, как старший бит.

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

Все это было параметризуемо, что только добавляло радости.

А покажите эту функцию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

39 minutes ago, Koluchiy said:

Поддерживаю предложение обратиться к разработчику.

Разработчик писал IP ядро под V6, под V6 оно работает.

Какие к разработчику могут быть вопросы? :)

Шутки шутками, но вероятность такого ответа далеко не нулевая. 

32 minutes ago, andrew_b said:

А покажите эту функцию.

function func_modul  (    signal data_in: in std_logic_vector) 
                        return std_logic_vector is
    variable modul : std_logic_vector(data_in'high-1 downto 0);
    variable xor_var : std_logic_vector(data_in'high-1 downto 0);
   
     begin
     xor_gen:
       for i in 0 to data_in'high - 1 loop
            xor_var(i) := data_in(data_in'high);
       end loop;
       modul := (xor_var xor data_in(data_in'high - 1 downto 0)) + data_in(data_in'high);
       return modul; 
     end func_modul;

 

function func_real_value  (    signal modul_in: in std_logic_vector;
                        signal sign_in: in std_logic) 
                        return std_logic_vector is
    variable real_value : std_logic_vector(modul_in'high+1 downto 0);
    variable xor_var : std_logic_vector(modul_in'high downto 0);
   
     begin
     xor_gen:
       for i in 0 to modul_in'high loop
            xor_var(i) := sign_in;
       end loop;
       real_value := (sign_in &(xor_var xor modul_in)) + sign_in;
       return real_value; 
     end func_real_value;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Tpeck said:

Разработчик писал IP ядро под V6, под V6 оно работает.

Какие к разработчику могут быть вопросы? :)

 

Спрашивали, отвечаем: вопрос должен быть "не могли бы Вы добавить в своё IP-ядро поддержку V7"?

Естественно, данный вопрос должен быть подкреплен соответствующими финансовыми вливаниями.

Другое дело, если такая постановка вопроса отнимает Ваш хлеб.

Тогда можно задавать разработчику вопросы типа "где документация".

 

P.S. Когда переходил с V6 на K7, переписывать приходилось много. В основном, конечно, из-за прекращения поддержки PLB. Но из-за замены примитивов тоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 часов назад, Tpeck сказал:

function func_modul  (    signal data_in: in std_logic_vector)

function func_real_value  (    signal modul_in: in std_logic_vector;

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

Ошибка явно нет здесь. Этот код платформеннонезависим и должен работать везде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 hours ago, Koluchiy said:

Естественно, данный вопрос должен быть подкреплен соответствующими финансовыми вливаниями.

:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, andrew_b said:

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

 Ошибка явно нет здесь. Этот код платформеннонезависим и должен работать везде.

Это не мой код, а стороннего разработчика.

Не знаю в чем магия, но замена этого:

wieght_in_mod <= func_modul(wieght_in);
sign <= wieght_in(wieght_in'high);

process(clk)
begin
   if (clk'event and clk ='1') then
        if reset = '1' then 
            wieght_out <=  (others => '0');
        elsif ( wieght_in_mod >= max_LLR_abs ) then 
            wieght_out <= func_real_value(max_LLR_abs_vector,sign);
        else 
            wieght_out <= func_real_value(wieght_in_mod(max_LLR_abs_vector'high downto wieght_in_mod'low),sign);
        end if;
   end if; 
end process; 
    

на это 

 

process(clk)
begin
   if (clk'event and clk ='1') then
        if reset = '1' then 
            wieght_out <=  (others => '0');
        else
        
            if wieght_in(13)='0' then 
                if wieght_in(12 downto 8)="00000" then
                    wieght_out <= wieght_in(weight_size-1 downto 0); 
                else
                    wieght_out <= "0011111111"; 
                end if;
            elsif wieght_in(13)='1' then 
                if wieght_in(12 downto 8)="11111" then
                    wieght_out <= wieght_in(weight_size-1 downto 0); 
                else
                    wieght_out <= "1100000000"; 
                end if;
            end if;
            
        end if;
    end if;
end process; 

сделало поведение IP ядра на V7, аналогичным симулятору и V6. Может проблема с либами или еще с чем-то.

Если кто сможет объяснить, буду очень рад. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 минут назад, Tpeck сказал:

замена этого ... на это

Сравните оба варианта в симуляторе. Там и увидите, совпадает ли выход или нет.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, andrew_b said:

Сравните оба варианта в симуляторе. Там и увидите, совпадает ли выход или нет.

  

 

В симуляторе оба варианта работают. Вариант в с функциями не заработал в железе на V7, тогда как на V6 работал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

57 минут назад, Tpeck сказал:

Это не мой код, а стороннего разработчика.

Не знаю в чем магия, но замена этого ... на это 

Если кто сможет объяснить, буду очень рад. :)

Попробуйте все же в Ксайлинкс написать в техподдержку. Ведь тут требуется явный ответ от них...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут скорее не V6/V7, а синтезаторы ISE vs Vivado. Если на простом примере повторяется ошибка синтеза тех функций то можно разобраться, хоть зарепортить в Xilinx. А иначе гиблое дело, которое в потрохах чужого модуля не разберешь /в разумное время/...

PS В работающем коде, например, пропали объекты max_LLR_abs и max_LLR_abs_vector, которые могли тоже вносить свое влияние на синтез конструкции

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...