Как мне сгенерировать параметры, зависящие от предыдущих параметров в systemverilog
Недавно я перешел с VHDL на SystemVerilog и конвертирую некоторые из своих кодов. Я хочу сгенерировать массив локальных параметров на основе 3 параметров SZ,L,max.
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 generate, но как я могу ссылаться на начальное значение? Есть ли другое решение?
Я использую симулятор Verilator, но я также хочу, чтобы дизайн работал в Xilinx Vivado.
Изменить: я не хочу генерировать параметры из внешнего скрипта, потому что я теряю возможность использовать способность Vivado запускать многократный синтез / реализацию в одном проекте с разными параметрами. Это то, что я делал в VHDL.
2 ответа
Вы можете использовать функцию для инициализации параметра, вам просто нужно получить вывод всего массива как результат функции. Для этого вам понадобится 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();
Я получил его, используя упакованный массив из 32 бит. Верилятор не поддерживает распакованные int с константами. Packed int также не поддерживается, поэтому мне пришлось изменить тип на pack 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();