Module verilog组件值传递

Module verilog组件值传递,module,verilog,Module,Verilog,我刚刚开始学习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

我刚刚开始学习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
模块似乎没有在第二个程序中获得初始值。但我所做的只是在第一个程序中增加了几行输入,并更改了计算


现在我不知道这有什么错。请帮忙

类型
reg
不是为隐式处理浮点数学而设计的。因此,分配给
reg
变量的实数常量被四舍五入到最接近的整数(请参阅IEEE1800-2012第5.7.2节,SystemVerilog LRM;抱歉,我没有IEEE1364,Verilog LRM来查找其中的引用)


如果您只是想做一些浮点运算,可以使用与double相同的
real
类型。否则,如果你想在硬件中进行浮点运算,你需要自己处理它的复杂性(或者借用IP核)。另外请注意,Verilog不是一种脚本语言,而是一种硬件描述语言,因此除非您试图设计硬件,否则最好使用Python、Ruby或Perl作为通用工具。

谢谢。我想我现在应该坚持真正的价值观。我应该用Verilog做一个非常复杂的程序,因为我对它一无所知,我想我应该从一个非常高的层次开始。所以我以后必须一个组件一个组件地设计。