2015-06-03 4 views
0

У меня есть несколько блоков verilog (not system-verilog), где я хочу сгенерировать их в зависимости от других параметров. В качестве примера:Verilog: общие параметры

module some_module (in, out) 

realtime p = 3.5; // the parameter which I want to change 

initial begin 
if ('global_parameter == 1) 
    p = 5.8; 
if ('global_parameter == 2) 
    p = 4.4; 
end 

core_module #(p) core (in, out); 
endmodule 

Здесь «global_parameter» определен в заголовочном файле, но переопределены во время моделирования с использованием параметров тренажера. И мой основной модуль использует «р» для значения задержки, как в этом примере:

module core_module(in, out) 

parameter p = 1; 

always out <= #p in; // p should be constant 

endmodule 

Поэтому, я надеюсь иметь базовый модуль с обновленным параметром «р». Но этот сценарий не является симулирующим. Не могли бы вы порекомендовать мне возможное надежное решение этой проблемы, если это возможно?

Спасибо

+0

«не имитировать-состоянии» или нет компиляции? –

+0

Ошибка при компиляции, извините за недоразумение –

ответ

1

параметр должен быть 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 
+0

Ty для вашего ответа Грег, я уже пытался сгенерировать блоки, которые, кажется, хороши, но слишком много блоков генерируются таким образом. Вы знаете, есть ли другая альтернатива? –

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