我刚开始学习verilog。我为此编写了两个程序。这是我的第一个项目:
module test1(i,o);
input i;
output o;
wire[0:63] i;
wire[0:63] o;
assign o = i * 2.0;
endmodule
module test1_tb();
reg[0:63] inp;
wire[0:63] outp;
initial
begin
assign inp = 2.0;
$monitor("input=%f, output=%f",inp,outp);
end
test1 t1(inp,outp);
endmodule
当我在ModelSim中运行时,这给了我以下结果:
# input=2.000000, output=4.000000
然后我按如下方式编辑了上述程序:
module test1(i1,i2,h1,w1,w2,b1);
input i1;
input i2;
input w1;
input w2;
input b1;
output h1;
wire[0:63] i1;
wire[0:63] i2;
wire[0:63] h1;
wire[0:63] w1;
wire[0:63] w2;
wire[0:63] b1;
assign h1 = 1/(1+ 2.718281828459**((-1.0)*(i1 * w1 + i2 * w2 + b1)));
endmodule
module test1_tb();
reg[0:63] i1;
reg[0:63] i2;
reg[0:63] w1;
reg[0:63] w2;
reg[0:63] b1;
wire[0:63] h1;
initial
begin
assign i1 = 0.05;
assign i2 = 0.10;
assign w1 = 0.15;
assign w2 = 0.20;
assign b1 = 0.35;
$monitor("i1=%f, i2=%f, w1=%f, w2=%f, b1=%f, h1=%f",i1,i2,w1,w2,b1,h1);
end
test1 n1(i1,i2,h1,w1,w2,b1);
endmodule
对于这个程序,我得到输出:
# i1=0.000000, i2=0.000000, w1=0.000000, w2=0.000000, b1=0.000000, h1=1.000000
似乎模块没有在第二个程序中获得初始值。但我所做的只是在第一个程序中添加更多输入行并更改计算。
现在我不知道这个错误是什么。请帮忙。
答案 0 :(得分:2)
类型reg
不是为隐式处理浮点数学而设计的。因此,分配给reg
变量的实常数四舍五入到最接近的整数(参见IEEE1800-2012第5.7.2节,SystemVerilog LRM;抱歉,我没有IEEE1364,Verilog LRM,在那里找到参考)。
如果您只是想做一些浮点数学,可以使用与double相同的real
类型。否则,如果你想在硬件中进行浮点数学运算,你需要自己处理它的复杂性(或从IP核借用)。另请注意,Verilog不是脚本语言,而是硬件描述语言,因此除非您尝试设计硬件,否则最好将Python,Ruby或Perl用于通用目的。