Tpeck 0 26 ноября, 2018 Опубликовано 26 ноября, 2018 · Жалоба Здравствуйте. Сложилась неприятная ситуация. Есть стороннее IP ядро. В симуляторе Acitive-HDL - корректно работает. Если развести в ISE 14.7 и залить в плис (Virtex6) - корректно работает. Если моделировать в симуляторе оригинальное IP ядро Vivado - корректно работает. Если развести в Vivado 2017.4 и залить в плис (Virtex7) - не корректно работает. Если после синтеза сделать write_verilog -force IP.v и моделировать с IP.v вместо оригинального IP - не корректно работает. IP ядро реализовано на VHDL, используются примитивы V6, много функций. Обвязку к ядру пишу я. Нормального описания как оно устроено нет. Как оно работает имею поверхностное представление. Подскажите в какую сторону копать, чтобы в симуляторе можно было бы эту багу воспроизвести. Всем спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 26 ноября, 2018 Опубликовано 26 ноября, 2018 · Жалоба 12 минут назад, Tpeck сказал: Сложилась неприятная ситуация. Есть стороннее IP ядро. .... Подскажите в какую сторону копать, чтобы в симуляторе можно было бы эту багу воспроизвести.. Пока Вы разбираетесь, время идет. Поэтому я бы пошел таким путем. Разработчик ядра известен? Я бы для начала написал ему и спросил, какие примитивы и библиотечные узлы из либгайда там использованы. Вероятно что они работают на 6-й серии, но не работают на 7-й серии... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 26 ноября, 2018 Опубликовано 26 ноября, 2018 · Жалоба Приветствую! 37 minutes ago, Tpeck said: Здравствуйте. Сложилась неприятная ситуация. .... Да уж не позавидуешь такому :( Я не совсем понял исходники IP открыты или нет? Хотя это не столь важно чтобы понять в чем разница - можно попробовать синтезировать с сохранением иерархии. Затем отсимить оригинал и получившийся нелист и сравнить результаты сима на интерфейсах модулей. При определенной удаче можно быстро выйти на источник различий. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tpeck 0 28 ноября, 2018 Опубликовано 28 ноября, 2018 · Жалоба On 11/27/2018 at 12:00 AM, RobFPGA said: Приветствую! Да уж не позавидуешь такому :( Я не совсем понял исходники IP открыты или нет? Хотя это не столь важно чтобы понять в чем разница - можно попробовать синтезировать с сохранением иерархии. Затем отсимить оригинал и получившийся нелист и сравнить результаты сима на интерфейсах модулей. При определенной удаче можно быстро выйти на источник различий. Удачи! Rob. Ну сначала так и делал. Только выяснилось, что из-за оптимизации самописной функции в глубине дизайна, оптимизировались функции в верхнем уровне и смотреть в глубь проекта перестало иметь смысл. Очень похоже, что причиной проблем стала проверка на переполнение, очень интересна она была реализована. Сначала от std_logic_vectora брался модуль с помощью самописной функции и знак, как старший бит. После этого модуль сравнивался с порогом и результат проверки возвращался с помощью функции, которая преобразовала модуль и знак в std_logic_vector. Все это было параметризуемо, что только добавляло радости. До этого куска, тоже пришлось вносить исправления, но после исправления данного участка, данные с IP ядра в Virtex7 стали адекватными. Всем спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Koluchiy 0 28 ноября, 2018 Опубликовано 28 ноября, 2018 · Жалоба Поддерживаю предложение обратиться к разработчику. Вообще, довольно часто вижу в людях странное желание сначала сломать чужой код и совсем запутаться, а потом уже спросить того, кто этот код написал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 28 ноября, 2018 Опубликовано 28 ноября, 2018 · Жалоба 3 часа назад, Tpeck сказал: Очень похоже, что причиной проблем стала проверка на переполнение, очень интересна она была реализована. Сначала от std_logic_vectora брался модуль с помощью самописной функции и знак, как старший бит. После этого модуль сравнивался с порогом и результат проверки возвращался с помощью функции, которая преобразовала модуль и знак в std_logic_vector. Все это было параметризуемо, что только добавляло радости. А покажите эту функцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tpeck 0 28 ноября, 2018 Опубликовано 28 ноября, 2018 · Жалоба 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Koluchiy 0 28 ноября, 2018 Опубликовано 28 ноября, 2018 · Жалоба 1 hour ago, Tpeck said: Разработчик писал IP ядро под V6, под V6 оно работает. Какие к разработчику могут быть вопросы? :) Спрашивали, отвечаем: вопрос должен быть "не могли бы Вы добавить в своё IP-ядро поддержку V7"? Естественно, данный вопрос должен быть подкреплен соответствующими финансовыми вливаниями. Другое дело, если такая постановка вопроса отнимает Ваш хлеб. Тогда можно задавать разработчику вопросы типа "где документация". P.S. Когда переходил с V6 на K7, переписывать приходилось много. В основном, конечно, из-за прекращения поддержки PLB. Но из-за замены примитивов тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба 14 часов назад, Tpeck сказал: function func_modul ( signal data_in: in std_logic_vector) function func_real_value ( signal modul_in: in std_logic_vector; Ну, можно, конечно, и так писать. Но уж очень на обфускацию похоже. Не нужно соревноваться с оптимизирующим синтезатором. Пишите так, чтобы код был легкопонимаем человеком. Но это лирика. Ошибка явно нет здесь. Этот код платформеннонезависим и должен работать везде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tpeck 0 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба 18 hours ago, Koluchiy said: Естественно, данный вопрос должен быть подкреплен соответствующими финансовыми вливаниями. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tpeck 0 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба 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. Может проблема с либами или еще с чем-то. Если кто сможет объяснить, буду очень рад. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба 27 минут назад, Tpeck сказал: замена этого ... на это Сравните оба варианта в симуляторе. Там и увидите, совпадает ли выход или нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tpeck 0 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба 3 minutes ago, andrew_b said: Сравните оба варианта в симуляторе. Там и увидите, совпадает ли выход или нет. В симуляторе оба варианта работают. Вариант в с функциями не заработал в железе на V7, тогда как на V6 работал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба 57 минут назад, Tpeck сказал: Это не мой код, а стороннего разработчика. Не знаю в чем магия, но замена этого ... на это Если кто сможет объяснить, буду очень рад. :) Попробуйте все же в Ксайлинкс написать в техподдержку. Ведь тут требуется явный ответ от них... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба Тут скорее не V6/V7, а синтезаторы ISE vs Vivado. Если на простом примере повторяется ошибка синтеза тех функций то можно разобраться, хоть зарепортить в Xilinx. А иначе гиблое дело, которое в потрохах чужого модуля не разберешь /в разумное время/... PS В работающем коде, например, пропали объекты max_LLR_abs и max_LLR_abs_vector, которые могли тоже вносить свое влияние на синтез конструкции Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться