verilog组件值传递

时间:2015-11-29 21:31:31

标签: 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, 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

似乎模块没有在第二个程序中获得初始值。但我所做的只是在第一个程序中添加更多输入行并更改计算。

现在我不知道这个错误是什么。请帮忙。

1 个答案:

答案 0 :(得分:2)

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

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