2014-02-12 6 views
1

Мой вопрос может быть грубейным, я не уверен, что входной сигнал можно использовать в качестве параметра в verilog.Verilog: Входной сигнал как параметр

Мой вопрос основан на необходимости выбрать один из двух экземпляров, доступных на основе входного сигнала. Этот сигнал был бы статическим постсинтезом.

module DUT (signal1 ....) 
    input signal1; // this signal to be used as parameter 
    `ifdef signal1 
     X U1 
    `else 
     Y U1 
    `endif 
endmodule 

Здесь X и Y - два разных модуля. Альтернативные предложения также доступны для реализации.

рассматривает


Далее Explaination:

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

+0

Вы не можете изменить оборудование во время выполнения.Ваш вопрос предполагает, что у вас есть фундаментальное неправильное представление о том, как Verilog и HDL в целом используются для проектирования аппаратного обеспечения. –

+0

Он пояснил это: signal1 будет постоянным, поэтому он хочет, чтобы синтезатор распознал, что он является постоянным, и выбрал модуль для создания экземпляра, основанного на этом. – nguthrie

ответ

0

Нет. Экземпляры подразумевают аппаратные блоки. Вы не можете создавать и уничтожать аппаратные средства на лету, если только ваш злой робот.

Что вы можете сделать, это использовать входной сигнал в качестве разрешения/запрета для обоих блоков, так что только 1 является активным, либо OR результаты вместе, либо подразумевают мультиплексор, чтобы выбрать нужный результат.

module DUT (
    input signal1, //sel_x 
    output tx 
); 
reg x_tx; 
reg y_tx; 

     X U1(.en(signal1), .out(x_tx) ...); 
     Y U1(.en(~signal1), .out(y_tx) ...); 

     assign tx = (signal1) ? x_tx : y_tx ; 

endmodule 
+0

Морган, я считаю, что у меня может быть misexplained требование. После синтеза я хочу только один из двух блоков оборудования. Я хочу синтаксис, который может быть настроен сигналом, который будет иметь статическое значение. Signal1 будет подключен к 0 или 1 в какой-либо другой части дизайна. – user1495523

+0

Тогда вы не можете использовать параметр, сигналы действительны только во время выполнения, поэтому вы можете использовать их для этого. Должна быть какая-то статическая логика, которая используется для определения 'signal1', ее просто нужно определить как параметр. – Morgan

1

Как говорит Морган, вы можете использовать parameters с generate блока, чтобы сделать то, что вы хотите вместо этого. Работа здесь примера: http://www.edaplayground.com/x/2w2

module X(); 
    initial begin 
     $display("%m is module X!"); 
    end 
endmodule 

module Y(); 
    initial begin 
     $display("%m is module Y!"); 
    end 
endmodule 

module top(); 

    parameter USE_X_NOT_Y = 1'b0; 

    generate 
     if(USE_X_NOT_Y == 1'b1) begin 
      X U1(); 
     end 
     else begin 
      Y U1(); 
     end 
    endgenerate 

endmodule 

Тогда при создании экземпляра этого модуля вы можете изменить параметр, чтобы получить требуемое поведение:

top #(.USE_X_NOT_Y(1)) top_inst(); 
2

Если вы действительно хотите, чтобы избежать использования параметров и хотите использовать сигналы , в зависимости от вашего инструмента синтеза, вы получите , чтобы получить то, что вы хотите.

Вам необходимо убедиться, что сигнал1 заставляет вывод модуля, который вы не хотите использовать , не волнует. Если ваши инструменты синтеза достаточно умны (большинство из них), он будет оптимизировать этот модуль.

Вот пример:

module DUT (signal1, out....) 
    input signal1; // this signal to be used as parameter 

     X U1 (in,out_x) 
     Y U2 (in,out_y) 

     assign out = (signal1) ? out_x : out_y; 
endmodule 

Если в процессе разработки, инструмент синтеза видит, что SIGNAL1 всегда 1, он может оптимизировать модуль Y вне.

Как уже упоминалось, это не обычная/рекомендуемая практика.

Кроме того, вы не можете достичь этого, используя `ifdef, потому что они обрабатываются во время компиляции. Значение сигналов и тот факт, что если сигнал статически 1 или 0 обрабатывается во время разработки.

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