проблема при запуске модуля в другом модуле - PullRequest
0 голосов
/ 21 февраля 2019

Я получаю ошибку при создании экземпляра функции exp в модуле активации.Я не могу понять ошибку в коде.я сделал ошибку в отношении создания экземпляра?

, пожалуйста, помогите мне узнать!

код -

module exp (input [15:0] g, output [15:0] f);
real base = 2.71828;
assign f = $realtobits(base ** g) ;
endmodule

module activation(input method,
input ctrl,
input [15:0] imgin[127:0],
output reg [15:0] imgo[127:0]
);

`define ONE 16'h0100;

reg [15:0] y; 

integer i;
always@(ctrl)
for(i=0; i<128 ; i=i+1)
begin 

if(method == 1'b0)   begin  // for relu unit 
if (imgin[i][15])
imgo[i] = 16'h0000;

else if(imgin[i] > 16'b0)
imgo[i]= imgin[i];

else if(imgin[i]>16'b1)
imgo[i]=16'd1;

end

if(method == 1'b1)   begin  // for sigmoid function
  exp f1(.g(imgin[i]),.f(y));   // error here
  imgo[i] = 1/(1+ y);

end
end


endmodule 

1 Ответ

0 голосов
/ 21 февраля 2019

Редактировать: Первоначально я пытался ответить на вопрос, также предлагая решение с использованием модуля, и только предлагал использовать функцию.Однако, как указал Грег в комментарии к этому ответу, функция - это путь.Поэтому я удалил попытку ответить на этот вопрос с помощью модуля.


То, что вы пытаетесь сделать, - создать экземпляр модуля при определенных условиях.Это невозможно, как вы пытаетесь это сделать.Как описано в разделе 27 IEEE Std 1800-2012. («Руководство Verilog»), вы можете использовать конструкции generate для условной реализации модулей.Обычно это выглядит так:

generate
  if (SOME_CONDITION)
     // Instantiate a module
  else
     // Instantiate another module or do nothing
endgenerate

Однако в вашем случае это не обязательно.Вместо этого вы должны использовать функцию для этого.В разделе 13.4 вышеупомянутого руководства указано, как использовать функции, а также это руководство nandland.com .Вы можете условно вызывать функции.По сути, ваш код будет выглядеть так с функцией:

module activation(input             method,
                  input             ctrl,
                  input      [15:0] imgin   [127:0],
                  output reg [15:0] imgo    [127:0]);

  function exp;
    input [15:0] g;
    real         base;

    begin
      base = 2.71828;
      exp  = $realtobits(base ** g);
    end
  endfunction

  `define ONE 16'h0100;

  reg [15:0] y;

  integer i;
  always@(ctrl)
    for(i=0; i<128 ; i=i+1)
    begin

    if(method == 1'b0)   begin  // for relu unit 
      if (imgin[i][15])
        imgo[i] = 16'h0000;
      else if(imgin[i] > 16'b0)
        imgo[i]= imgin[i];
      else if(imgin[i]>16'b1)
        imgo[i]=16'd1;
    end
    else if (method == 1'b1) begin  // for sigmoid function
       y = exp(imgin[i]);
       imgo[i] = 1/(1+ y);
    end
  end
endmodule
...