2015-05-09 3 views
2

Мне нужно сделать некоторые вычисления во время компиляции для видеодрайвера. Когда экземпляр модуля создается, определяются параметры WIDTH и HEIGHT. Затем я вычисляю некоторые значения из них.Verilog - вычисления времени компиляции

parameter X_BLOCK = $floor(640/WIDTH); 
parameter Y_BLOCK = $floor(480/HEIGHT); 
parameter BLOCK = X_BLOCK < Y_BLOCK ? X_BLOCK : Y_BLOCK; 
parameter X_SPAN = WIDTH * BLOCK; 
parameter Y_SPAN = HEIGHT * BLOCK; 
parameter X_START = $floor((640 - X_SPAN)/2); 
parameter Y_START = $floor((480 - Y_SPAN)/2); 
parameter X_STOP = X_START + X_SPAN; 
parameter Y_STOP = Y_START + Y_SPAN; 

Эти расчеты должны выполняться во время компиляции, но я получаю ошибки, что $ floor не синтезируется. Я думал, что параметры будут вычисляться во время компиляции, так почему это волнует, если он не может синтезировать $ floor?

+0

Это может быть ограничение с вашим синтезатором. Если я правильно помню, целочисленное деление обычно округляется вниз. Вы также можете попробовать 'параметр X_BLOCK = int '(640/WIDTH);' или 'параметр int X_BLOCK = $ floor (640/WIDTH);' для получения эквивалента '$ floor' – Greg

ответ

1

Основная проблема: $floor - это функция, которая возвращает значение с помощью типа real. Поскольку вы явно не указали типы данных для своих параметров, они неявно определяются с типом инициализации по умолчанию или типом любого выражения, которое они переопределили. Поэтому, когда вы ссылаетесь на эти параметры в выражении в своем дизайне, они станут выражениями real.

В SystemVerilog всегда рекомендуется предоставлять явный тип данных для ваших параметров, как предлагает @Greg.

+0

явные типы данных действительно устраняют проблему –

Смежные вопросы