Редактировать: Первоначально я пытался ответить на вопрос, также предлагая решение с использованием модуля, и только предлагал использовать функцию.Однако, как указал Грег в комментарии к этому ответу, функция - это путь.Поэтому я удалил попытку ответить на этот вопрос с помощью модуля.
То, что вы пытаетесь сделать, - создать экземпляр модуля при определенных условиях.Это невозможно, как вы пытаетесь это сделать.Как описано в разделе 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