Jump to content
    

Условный Timing Control на Verilog

Решил я оптимизировать один простой контроллер, чтобы был кратким (как выстрел, ЛОЛ) и полностью конфигурируемым. В частности чтобы можно было ему задавать фронт, по которому работать. Ну и пишу:

 

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 by Dantist2k17

Share this post


Link to post
Share on other sites

Но define - это устаревшая конструкция, ...

А где написано, что она устаревшая? Можете привести цитату из стандата на SV или хотя бы ссылку на страницу этого стандарта?

 

Использую повсеместно define и уже начинаю беспокоиться за своё чувство прекрасного.. ;)

Share this post


Link to post
Share on other sites

Сам не пробовал, ну а вдруг

 

Объявите

`define EDGE_CLK posedge

ну или

`define EDGE_CLK negedge

 

и используйте

 

always@(`EDGE_CLK my_clk) begin

end

Это несомненно возможно, только мне не это надо. Надо, чтобы это зависело от parameter. А в верилоге условная компиляци работает только от define (ifdef/ifndef), параметр как аргумент эти директивы принимать не могут.

 

Share this post


Link to post
Share on other sites

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

Это несомненно возможно, только мне не это надо. Надо, чтобы это зависело от 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.

Share this post


Link to post
Share on other sites

А где написано, что она устаревшая? Можете привести цитату из стандата на SV или хотя бы ссылку на страницу этого стандарта?

У Сазерленда есть статья с примерно таким названием: "скажи дефайну - прощай"...

 

Share this post


Link to post
Share on other sites

У Сазерленда есть статья с примерно таким названием: "скажи дефайну - прощай"...

Ну я только что просканировал весь стандарт на SV и никаких намеков на "прощай, дефайн" не нашел.

 

Почему я должен верить какому-то Сазерленду и не верить IEEE?

Share this post


Link to post
Share on other sites

Ну я только что просканировал весь стандарт на SV и никаких намеков на "прощай, дефайн" не нашел.

 

Почему я должен верить какому-то Сазерленду и не верить IEEE?

Я и не скзал о стандарте ни одного слова... А Сазерленд - один из основателей верилога и более ничего.. :)

 

Share this post


Link to post
Share on other sites

А Сазерленд - один из основателей верилога и более ничего.. :)

Видимо, в то время он ещё не догадывался, что у Altera, Xilinx, Lattice и Synopsys'a будут разные атрибуты синтеза для выполнения одних и тех же архитектурно зависимых фич. :biggrin:

 

Например, тот же (* use_dsp48 = "no" *) в Vivado 2017.3 уже выглядит как (* use_dsp = "no" *).

 

В Quartus'e и в Synplify'e есть аналогичные, но другие атрибуты.

 

Переписывать ради этого кучу файлов нет никакого желания. Пусть этим занимается компилятор.. А я просто изменю одну строку в define. :biggrin:

Share this post


Link to post
Share on other sites

define - это когда их используют как параметры. Тут все как с С, и проблемы те же. Им и прощай.

А дефайн для ветвления - ок и он все еще с нами

 

`define EDGE_CLK posedge

именно такое решение я и видел. Я бы предпочел генерайт, именно в силу ограничений дефайна.

 

Боюсь реально необходимость настраиваемого фронта для модуля - ненужная вещь, которая множит ошибки. Если же вы думаете про технику улучшения времянок когда не успевая принять по переднему фронту, переходят на задний - так это порочная практика, ее надо пресекать. Да, да...

 

Share this post


Link to post
Share on other sites

Лично я больше предпочитаю параметры в RTL, чем дефайны. Потому что при синтезе тулы (эсик) добавляют названия и значения параметров в название модуля: после синтеза в любой момент можно узнать, какие параметры использовались. А вот значения дефайнов синтезатор никуда не сохраняет. Итого, из-за дефайнов возникает больше всего ошибок при сборке проекта, и найти баг намного сложнее, чем при неверном задании параметра. Вместе с тем, дефайны до сих пор есть в каждом втором проекте, с которым приходится работать.

Share this post


Link to post
Share on other sites

хочу настраивать его константой времени компиляции.

 

generate
    if(a)begin
        ...
    end
    else begin
        ...
    end
endgenerate

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...