繁体   English   中英

Verilog中的浮点加法器测试台

[英]Testbench of floating point adder in verilog

我想写浮点双精度加法器 在测试台上,我遇到了一些问题。

* 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) 所以我将代码更改为类似的代码以避免与一个代码相加,但是出现另一个问题!

我对tatbresultmodulesum :(例如fa)

 fa2 = ( $bitstoreal(fa)/(2**52) ) ;
 ta=(-1)**(signa)*(fa2*(2**expa)+(2**expa));

2.然后我明白ta总是会达到(-1)**(signa)*(2**expa) ; 这意味着fa2*(2**expa)为0! 但是我不知道为什么以及如何做才能使它正确。 我认为,即使我没有更改fa2fa2 (添加了一个fa2 )以提供正确的输出,我的ta也可能有问题。

3.我的模块中还有另一个问题,那就是真的很奇怪! 加法器代码模块的一小部分放在测试平台代码之后。 这是当我调试代码时, 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] ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM