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

Условный 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

Изменено пользователем Dantist2k17

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


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

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

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

 

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

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


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

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

 

Объявите

`define EDGE_CLK posedge

ну или

`define EDGE_CLK negedge

 

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

 

always@(`EDGE_CLK my_clk) begin

end

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

 

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


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

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

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

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


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

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

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

 

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


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

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

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

 

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

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


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

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

 

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

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

 

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


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

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

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

 

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

 

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

 

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

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


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

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

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

 

`define EDGE_CLK posedge

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

 

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

 

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


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

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

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


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

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

 

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

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


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

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

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

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

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

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

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

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

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

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