параметр должен быть parameter
типа по всей конструкции. Вы не можете передавать переменную в качестве параметра.
Вы можете использовать генерировать блок управления конкретизации:
module core_module#(parameter realtime P=1)(input in, output out);
always @(in) out <= #(P) in; // p should be constant
endmodule
module some_module (input in, output out);
generate
if (GLOBAL_PARAMETER == 1) begin : cfg_1
core_module #(5.8) core (in, out);
end
else if (GLOBAL_PARAMETER == 2) begin : cfg_2
core_module #(4.4) core (in, out);
end
else begin : cfg_dflt
core_module #(3.5) core (in, out); // default
end
endgenerate
endmodule
Можно также вычислить параметр в одной строке:
module some_module (input in, output out);
parameter P = (GLOBAL_PARAMETER == 1) ? 5.8 : (GLOBAL_PARAMETER == 2) ? 4.4 : 3.5;
core_module #(P) core (in, out); // default
endmodule
В качестве альтернативы (так как вы не можете синтезировать), вы можете имеет значение задержки, которое является переменной, а затем заставлять значение через иерархическую ссылку. Пример:
module core_module (input in, output out);
realtime p = 1;
always @(in) out <= #(p) in; // this p is a variable
endmodule
module some_module (input in, output out);
realtime p = 3.5;
core_module core (in, out);
initial begin
if (GLOBAL_PARAMETER == 1)
p = 5.8;
else if (GLOBAL_PARAMETER == 2)
p = 4.4;
force core.p = p; // force hierarchical variable assignment
end
endmodule
Примечания: Весь пример совместимы с IEEE Std 1364-2001 и IEEE Std 1364-2005, используя стиль заголовка ANSI и генерировать блоки. Эти функции не существуют в IEEE Std 1364-1995
Я не знаю ни чистых Verilog только решений. Вы можете попробовать внедрить код (например, EP3 Perl, Ruby's eRuby/ruby_it, Python's prepro и т. Д.) Как я уже упоминал в другом ответе на несколько похожий вопрос, here. Задача со встроенным заключается в необходимости предварительной компиляции/обработки, что делает их более похожими на параметры `define
.
Если SystemVerilog является вариант, вы можете сделать следующее: (см IEEE Std 1800-2012 § 6,20 Константы; пример ближе к концу § 6.20.2)
module some_module (input in, output out);
parameter realtime P [3] = '{3.5, 5.8, 4.4};
core_module #(P[GLOBAL_PARAMETER]) core (in, out);
endmodule
«не имитировать-состоянии» или нет компиляции? –
Ошибка при компиляции, извините за недоразумение –