verilog中浮点加法器的测试平台
Testbench of floating point adder in verilog
我要写floating point double precision adder。在那个测试台上,我遇到了一些问题。
*adder是一个获取两个64位数字并给出它们之和的模块。
这是我的测试台:
module testadder;
reg [63:0] a;
reg [63:0] b;
wire [63:0] sum;
reg[10:0] expa,expb,expsum;
reg signa,signb,signsum,one;
reg[51:0] fa,fb,fsum;
real ta,tb,fa2,fb2,sumcheck,fsum2,resultmodulesum;
integer i;
reg [10:0]h23;
adder nameofinstance(sum,a,b);
initial begin
for(i=0;i<1000;i=i+1)
begin
h23=1023;
one=1'b1;
a = {$random(),$random()};
b = {$random(),$random()};
#10;
expa=a[62:52]-h23;
expb=b[62:52]-h23;
fa=a[51:0];
fb=b[51:0];
signa=a[63];
signb=b[63];
fa2 = ( $bitstoreal(fa)/(2**52) )+ one ;
ta=(-1)**(signa)*fa2*(2**expa);
fb2 = ( $bitstoreal(fb)/(2**52) ) + one;
tb=(-1)**(signb)*fb2*(2**expb);
sumcheck=ta+tb;
fsum=sum[51:0];
signsum=sum[63];
fsum2 = ( $bitstoreal(fsum)/(2**52) ) +one;
expsum=$bitstoreal(sum[62:52])-1023;
resultmodulesum=(-1)**(signsum)*fsum2*(2**expsum);
if(sumcheck!=resultmodulesum)
$display("wrong");
end
end
endmodule
module adder(sum,a, b);
input [63:0] a;
input [63:0] b;
reg [63:0] fa,fb;
always @(a or b) begin
fa={1'b1,a[51:0],12'b0};
fb={1'b1,b[51:0],12'b0};
end
endmodule
- 当我用 1 添加
( $bitstoreal(fa)/(2**52) )
时,fa2 得到 1!但是当我不添加它时,fa2
得到 (fa/2^52)
的实际值。
所以我将我的代码更改为类似的代码以避免添加一个,但是出现了另一个问题!
我对 ta
、tb
和 resultmodulesum
所做的更改:
(fa 的示例)
fa2 = ( $bitstoreal(fa)/(2**52) ) ;
ta=(-1)**(signa)*(fa2*(2**expa)+(2**expa));
2.then 我知道 ta 总能到达 (-1)**(signa)*(2**expa)
;
这意味着 fa2*(2**expa)
是 0 !但我不知道为什么以及我该怎么做才能使其正确。
我认为即使我没有更改我的 fa2
和 fa2
(其中添加了一个)给出正确的输出,我的 ta
也可能有问题。
3.I我的模块还有一个问题,真的很奇怪!
加法器代码模块的一小部分位于测试台代码之后。
就是当我调试我的代码时,fb
的第 63 位是 0!有什么想法吗?
这不是一个完整的答案,但比评论中可以表达的要多。
对于浮点双精度模型,我希望看到类似以下内容的内容:
reg [63:0] a;
reg [63:0] b;
//Built in real for verification of code
real result;
real a_real;
real b_real;
initial begin
a = {$random(),$random()};
b = {$random(),$random()};
#1ps;
a_real = $bitstoreal(a);
b_real = $bitstoreal(b);
result = a_real + b_real;
$display("a %64b", a);
$display("b %64b", b);
$display("a_real %f", a_real);
$display("b_real %g", b_real);
$display("result %f", result);
#1ps;
$finish;
end
为了将随机双打分成几部分,我希望看到如下内容:
wire a_sign; // 1 bit
wire [10:0] a_exponent;//11 bit
wire [51:0] a_fraction;//52 bit
assign a_sign = a[63] ;
assign a_exponent = a[62:52];
assign a_fraction = a[51:0] ;
wire b_sign; // 1 bit
wire [10:0] b_exponent;//11 bit
wire [51:0] b_fraction;//52 bit
assign b_sign = b[63] ;
assign b_exponent = b[62:52];
assign b_fraction = b[51:0] ;
我要写floating point double precision adder。在那个测试台上,我遇到了一些问题。
*adder是一个获取两个64位数字并给出它们之和的模块。
这是我的测试台:
module testadder;
reg [63:0] a;
reg [63:0] b;
wire [63:0] sum;
reg[10:0] expa,expb,expsum;
reg signa,signb,signsum,one;
reg[51:0] fa,fb,fsum;
real ta,tb,fa2,fb2,sumcheck,fsum2,resultmodulesum;
integer i;
reg [10:0]h23;
adder nameofinstance(sum,a,b);
initial begin
for(i=0;i<1000;i=i+1)
begin
h23=1023;
one=1'b1;
a = {$random(),$random()};
b = {$random(),$random()};
#10;
expa=a[62:52]-h23;
expb=b[62:52]-h23;
fa=a[51:0];
fb=b[51:0];
signa=a[63];
signb=b[63];
fa2 = ( $bitstoreal(fa)/(2**52) )+ one ;
ta=(-1)**(signa)*fa2*(2**expa);
fb2 = ( $bitstoreal(fb)/(2**52) ) + one;
tb=(-1)**(signb)*fb2*(2**expb);
sumcheck=ta+tb;
fsum=sum[51:0];
signsum=sum[63];
fsum2 = ( $bitstoreal(fsum)/(2**52) ) +one;
expsum=$bitstoreal(sum[62:52])-1023;
resultmodulesum=(-1)**(signsum)*fsum2*(2**expsum);
if(sumcheck!=resultmodulesum)
$display("wrong");
end
end
endmodule
module adder(sum,a, b);
input [63:0] a;
input [63:0] b;
reg [63:0] fa,fb;
always @(a or b) begin
fa={1'b1,a[51:0],12'b0};
fb={1'b1,b[51:0],12'b0};
end
endmodule
- 当我用 1 添加
( $bitstoreal(fa)/(2**52) )
时,fa2 得到 1!但是当我不添加它时,fa2
得到(fa/2^52)
的实际值。 所以我将我的代码更改为类似的代码以避免添加一个,但是出现了另一个问题!
我对 ta
、tb
和 resultmodulesum
所做的更改:
(fa 的示例)
fa2 = ( $bitstoreal(fa)/(2**52) ) ;
ta=(-1)**(signa)*(fa2*(2**expa)+(2**expa));
2.then 我知道 ta 总能到达 (-1)**(signa)*(2**expa)
;
这意味着 fa2*(2**expa)
是 0 !但我不知道为什么以及我该怎么做才能使其正确。
我认为即使我没有更改我的 fa2
和 fa2
(其中添加了一个)给出正确的输出,我的 ta
也可能有问题。
3.I我的模块还有一个问题,真的很奇怪!
加法器代码模块的一小部分位于测试台代码之后。
就是当我调试我的代码时,fb
的第 63 位是 0!有什么想法吗?
这不是一个完整的答案,但比评论中可以表达的要多。
对于浮点双精度模型,我希望看到类似以下内容的内容:
reg [63:0] a;
reg [63:0] b;
//Built in real for verification of code
real result;
real a_real;
real b_real;
initial begin
a = {$random(),$random()};
b = {$random(),$random()};
#1ps;
a_real = $bitstoreal(a);
b_real = $bitstoreal(b);
result = a_real + b_real;
$display("a %64b", a);
$display("b %64b", b);
$display("a_real %f", a_real);
$display("b_real %g", b_real);
$display("result %f", result);
#1ps;
$finish;
end
为了将随机双打分成几部分,我希望看到如下内容:
wire a_sign; // 1 bit
wire [10:0] a_exponent;//11 bit
wire [51:0] a_fraction;//52 bit
assign a_sign = a[63] ;
assign a_exponent = a[62:52];
assign a_fraction = a[51:0] ;
wire b_sign; // 1 bit
wire [10:0] b_exponent;//11 bit
wire [51:0] b_fraction;//52 bit
assign b_sign = b[63] ;
assign b_exponent = b[62:52];
assign b_fraction = b[51:0] ;