Dantist2k17 0 January 25, 2018 Posted January 25, 2018 (edited) · Report post Решил я оптимизировать один простой контроллер, чтобы был кратким (как выстрел, ЛОЛ) и полностью конфигурируемым. В частности чтобы можно было ему задавать фронт, по которому работать. Ну и пишу: clocking get_edge @((posedge clk iff a) or (negedge clk iff !a)); И сразу же выясняется, что ни clocking, ни даже iff синтезатором (Квартус) не поддерживаются. У кого-нибудь есть идеи, как это сделать элегантно с помощью синтезируемых конструкций? Я понимаю, как это сделать с помощью условной компиляции, но это мне кажется как-то... Не совсем современно, что ли. Сам не пробовал, ну а вдруг Объявите `define EDGE_CLK posedge ну или `define EDGE_CLK negedge и используйте always@(`EDGE_CLK my_clk) begin end Edited January 25, 2018 by Dantist2k17 Quote Share this post Link to post Share on other sites More sharing options...
blackfin 60 January 25, 2018 Posted January 25, 2018 · Report post Но define - это устаревшая конструкция, ... А где написано, что она устаревшая? Можете привести цитату из стандата на SV или хотя бы ссылку на страницу этого стандарта? Использую повсеместно define и уже начинаю беспокоиться за своё чувство прекрасного.. ;) Quote Share this post Link to post Share on other sites More sharing options...
DmitryR 4 January 25, 2018 Posted January 25, 2018 · Report post Сам не пробовал, ну а вдруг Объявите `define EDGE_CLK posedge ну или `define EDGE_CLK negedge и используйте always@(`EDGE_CLK my_clk) begin end Это несомненно возможно, только мне не это надо. Надо, чтобы это зависело от parameter. А в верилоге условная компиляци работает только от define (ifdef/ifndef), параметр как аргумент эти директивы принимать не могут. Quote Share this post Link to post Share on other sites More sharing options...
blackfin 60 January 25, 2018 Posted January 25, 2018 · Report post .. Quote Share this post Link to post Share on other sites More sharing options...
RobFPGA 58 January 25, 2018 Posted January 25, 2018 · Report post Приветствую! Это несомненно возможно, только мне не это надо. Надо, чтобы это зависело от parameter. А в верилоге условная компиляци работает только от define (ifdef/ifndef), параметр как аргумент эти директивы принимать не могут.Вы так и не ответили чем же тогда Вас не устраивает parameter clk_sel=0; wire real_clk = clk_sel ? clk : !clk; Так как после синтеза (для FPGA) в любом случае для клоков под negedge будет добавлен инвертор. А вот будет ли он (инвертор) : встроенным в примитив триггера, или как примитив для целой ALM или LCELL макро ячейки или даже как отдельный gobal buffer к инвертному выходу PLL или проосто инвертер на LUT или ... зависит от многих факторов, а не от того как это описанно в RTL - !clk или negedge. Удачи! Rob. Quote Share this post Link to post Share on other sites More sharing options...
iosifk 3 January 25, 2018 Posted January 25, 2018 · Report post А где написано, что она устаревшая? Можете привести цитату из стандата на SV или хотя бы ссылку на страницу этого стандарта? У Сазерленда есть статья с примерно таким названием: "скажи дефайну - прощай"... Quote Share this post Link to post Share on other sites More sharing options...
blackfin 60 January 25, 2018 Posted January 25, 2018 · Report post У Сазерленда есть статья с примерно таким названием: "скажи дефайну - прощай"... Ну я только что просканировал весь стандарт на SV и никаких намеков на "прощай, дефайн" не нашел. Почему я должен верить какому-то Сазерленду и не верить IEEE? Quote Share this post Link to post Share on other sites More sharing options...
iosifk 3 January 25, 2018 Posted January 25, 2018 · Report post Ну я только что просканировал весь стандарт на SV и никаких намеков на "прощай, дефайн" не нашел. Почему я должен верить какому-то Сазерленду и не верить IEEE? Я и не скзал о стандарте ни одного слова... А Сазерленд - один из основателей верилога и более ничего.. :) Quote Share this post Link to post Share on other sites More sharing options...
blackfin 60 January 25, 2018 Posted January 25, 2018 · Report post А Сазерленд - один из основателей верилога и более ничего.. :) Видимо, в то время он ещё не догадывался, что у Altera, Xilinx, Lattice и Synopsys'a будут разные атрибуты синтеза для выполнения одних и тех же архитектурно зависимых фич. Например, тот же (* use_dsp48 = "no" *) в Vivado 2017.3 уже выглядит как (* use_dsp = "no" *). В Quartus'e и в Synplify'e есть аналогичные, но другие атрибуты. Переписывать ради этого кучу файлов нет никакого желания. Пусть этим занимается компилятор.. А я просто изменю одну строку в define. Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 January 25, 2018 Posted January 25, 2018 · Report post define - это когда их используют как параметры. Тут все как с С, и проблемы те же. Им и прощай. А дефайн для ветвления - ок и он все еще с нами `define EDGE_CLK posedge именно такое решение я и видел. Я бы предпочел генерайт, именно в силу ограничений дефайна. Боюсь реально необходимость настраиваемого фронта для модуля - ненужная вещь, которая множит ошибки. Если же вы думаете про технику улучшения времянок когда не успевая принять по переднему фронту, переходят на задний - так это порочная практика, ее надо пресекать. Да, да... Quote Share this post Link to post Share on other sites More sharing options...
Shivers 0 January 26, 2018 Posted January 26, 2018 · Report post Лично я больше предпочитаю параметры в RTL, чем дефайны. Потому что при синтезе тулы (эсик) добавляют названия и значения параметров в название модуля: после синтеза в любой момент можно узнать, какие параметры использовались. А вот значения дефайнов синтезатор никуда не сохраняет. Итого, из-за дефайнов возникает больше всего ошибок при сборке проекта, и найти баг намного сложнее, чем при неверном задании параметра. Вместе с тем, дефайны до сих пор есть в каждом втором проекте, с которым приходится работать. Quote Share this post Link to post Share on other sites More sharing options...
_Sam_ 0 January 26, 2018 Posted January 26, 2018 · Report post хочу настраивать его константой времени компиляции. generate if(a)begin ... end else begin ... end endgenerate Quote Share this post Link to post Share on other sites More sharing options...