激活模块中的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
答案 0 :(得分:2)
编辑:最初,我尝试通过使用模块提供解决方案来回答这个问题,仅建议使用功能。但是,正如格雷格(Greg)在针对该答案的命令中指出的那样,函数是必经之路。因此,我删除了使用模块来回答这个问题的尝试。
您想要做的是在特定条件下实例化模块。您尝试执行此操作的方式是不可能的。如IEEE Std 1800-2012.(“ Verilog手册”)第27节所述,您可以使用generate
构造有条件地实例化模块。大致如下所示:
generate
if (SOME_CONDITION)
// Instantiate a module
else
// Instantiate another module or do nothing
endgenerate
但是,对于您而言,这不是必需的。相反,您应该为此使用一个函数。上述手册的第13.4节指出了如何使用函数以及this tutorial of 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