andrew_b 14 22 октября, 2018 Опубликовано 22 октября, 2018 · Жалоба Прошу прощения, но в Гугле не нашёл. Есть модуль, который должен работать на двух FPGA разных вендоров (Intel и Xilinx). В модуле используется FIFO, оно сгенерено как IP core. В остальном код платформенно-независимый. Проблема в том, интерфейсы FIFO разные. Хотелось бы так: параметризовать модуль и использовать параметр в препроцессоре: module foo #( parameter XILINX = 1 ) (...) `if (XILINX != 0) fifo fifo_inst ( ... ); `else fifo fifo_inst ( ... ); `endif endmodule Тут вопрос: будет ли в препроцессоре использоваться значение параметра, установленного при инстанцировании модуля, или препроцессор отработает раньше? Второе, что приходит в голову, это generate: module foo #( parameter XILINX = 1 ) (...) generate if (XILINX != 0) fifo fifo_inst ( ... ); else fifo fifo_inst ( ... ); endgenerate endmodule Но мне это не очень нравится. Третий вариант -- написать врапперы. Но это мне не нравится совсем, так как появляются в проекте лишние файлы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 22 октября, 2018 Опубликовано 22 октября, 2018 · Жалоба Приветствую! Первый вариант не будет работать - так как препроцессор ни чего не знает о подстановке параметров. В этом случае нужен глобальный define задающий тип вендора либо в общем include файле, либо в опциях компилятора/синтезатора. Вариант с generate более уместный. Но как по мне так вариант с враппером наиболее достоин использования! Нужно только один раз написать свой враппер для FIFO покрывающий ваши основные запросы к интерфейсу и параметрам FIFO. И везде использовать его. А уж весь зоопарк реализаций разводить внутри этого враппера. Приводя интерфейс вендоровских корок к своему любимому. Ну а там недалеко и до своей реализации FIFO. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZwergNase 0 23 октября, 2018 Опубликовано 23 октября, 2018 · Жалоба Можно написать: `define XILINX module foo #( ) (...) fifo fifo_inst `ifdef XILINX ( ... ); `else ( ... ); `endif endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 23 октября, 2018 Опубликовано 23 октября, 2018 · Жалоба 38 минут назад, Zwerg_nase сказал: Можно написать: `define XILINX module foo Это самый очевидный и наихудший вариант. Его я даже упоминать не стал. Нужно иметь модуль, который был бы полностью идентичен в двух проектах. А так получатся два файла, отличающихся дифайном. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZwergNase 0 23 октября, 2018 Опубликовано 23 октября, 2018 · Жалоба Тогда можно убрать `define XILINX из модуля и задавать этот define в скрипте при компиляции. в виваде:"-verilog_define XILINX=1" как я понимаю про это писал RobFPGA. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 19 ноября, 2018 Опубликовано 19 ноября, 2018 · Жалоба Вот только недавно у меня была похожая задачка. Делал wrapper для FIFO и многих других модулей, которые должны были быть портабельными между ПЛИС разных вендоров. Вот у Altera я такого не нашел. Поэтому решил если нет дефайна то значит Altera, а если есть то это Xilinx. В Vivado это Project Settings -> General -> Verilog Options и просто "плюсируем" туда нужные define. Более того, у Vivado есть аналогичные Verilog Options, куда можно ляпнуть SIM. И таким образом код может автоматом модифицироваться когда он для симулятора (меньше задержки, другие инит состояния), и когда для железа. У Modelsim, что я использую для Altera, можно так: vlog +define+SIM my_sweet_module.v Таким образом, у меня есть глобальные define, о которых я не думаю и не парюсь, которые всегда актуальны в своей среде своего вендора, и актуальны для симуляции. Удобно, просто то, о чем я мечтал как раз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться