verilog 组件值传递

verilog component value passing

我刚开始学习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,无法在其中找到参考)。

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