Как мне сгенерировать параметры, зависящие от предыдущих параметров в systemverilog - PullRequest
0 голосов
/ 22 января 2020

Я недавно переключился с VHDL на SystemVerilog, и я конвертирую некоторые из моих кодов. Я хочу создать массив локальных параметров на основе 3 параметров SZ, L, макс.

formula

module test #(
    parameter int SZ = 1024,
    parameter int L = 35,
    parameter int MAX = 4
)()
//...
localparam int n[MAX:0] = ;//...

for(genvar i = 0; i < max; i++) begin: gg
//n[i] and n[i+1] will be used here
//There is a second generate loop here that uses n[i+1] and therefore n[i+1] has to be parameter.

end

Я пытался использовать функцию для генерации локальных параметров, но получаю ошибку это назначение элемента в функции не является постоянным. У меня никогда не было этой проблемы в VHDL.

Единственный другой вариант, который я могу придумать, - создать параметры внутри for, но как бы я сослался на начальное значение? Есть ли другое решение?

Я использую симулятор Verilator, но я также хочу, чтобы дизайн работал в Xilinx Vivado.

Редактировать: я не хочу генерировать параметры из внешнего сценарий, потому что я теряю способность использовать способность Vivado запускать несколько процессов синтеза / реализации в одном проекте с разными параметрами. Это было то, что я делал в VHDL.

Ответы [ 2 ]

1 голос
/ 22 января 2020

Вы можете использовать функцию для инициализации параметра, вам просто нужно получить вывод всего массива в качестве результата функции. Для этого вам нужен typedef

typedef int array_type[MAX:0];

function array_type f();
  f[0]=SZ;
  for(int i=0;i<MAX;i++)
      f[i+1]=f[i]-((2*i)+1)*L)/2;
endfunction
localparam array_type n = f();
0 голосов
/ 23 января 2020

Я получил это с помощью упакованного массива из 32 бит. Verilator не поддерживает распакованный int с константами. Packed int также не поддерживается, поэтому мне пришлось изменить тип на 32-битный пакет.

typedef [MAX:0][31:0] array_type;

function array_type f();
  f[0]=SZ;
  for(int i=0;i<MAX;i++)
      f[i+1]=f[i]-((2*i)+1)*L)/2;
endfunction
localparam array_type n = f();
...