Выполнение арифметики c параметров для инициализации других констант - PullRequest
0 голосов
/ 01 августа 2020

У меня есть дизайн, который принимает несколько важных параметров. Ему необходимо выполнить некоторые арифметические операции c (сравнения, добавления и т. Д. c.) По заданным основным параметрам, а затем инициализировать другие параметры (или константы) на основе результатов. Например, посмотрите на приведенный ниже код

module foo(a,b);

parameter wl_in = 8;
parameter sc_in = 3;
parameter wl_out = 9;
parameter sc_out = 2;

parameter big_wl = //to be determined...
parameter big_sc = //to be determined...

//some logic

endmodule

. Я хочу определить, какой из двух wl s больше, а затем назначить его big_wl. Аналогично для sc. Затем я буду использовать эти параметры для определения массивов, определения границ массива и т. Д. c.

Я пробовал использовать операторы if/else, но при таком подходе у меня возникли ошибки. Я это делаю в Verilog-2001?

1 Ответ

1 голос
/ 01 августа 2020

Вы можете использовать условный оператор a ? b : c для этого

parameter big_wl = wl_in > wl_out ? wl_in : wl_out;

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

function integer max(integer v1,v2);
begin
  if (v1 > v2)
     max = v1;
  else
     max = v2;
end
endfunction

parameter big_wl = max(wl_in, wl_out);

В SystemVerilog вы можете использовать конструкцию let

let max(v1,v2) = v1>v2 ? v1 : v2;

Преимущество этого заключается в том, что аргументы не имеют типа и не имеют целого числа.

...