2015-04-01 86 views
0

我想寫floating point double precision adder。在測試臺上,我有一些問題。Verilog中浮點加法器的測試臺

*加法器是一個獲取兩個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(添加了一個)給出正確的輸出,我的ta可能有問題。

3.我的模塊有另一個問題,它真的很奇怪! 加法器代碼模塊的一小部分來自測試臺代碼。 它是當我調試我的代碼時,fb的第63位是0!任何想法?

+0

你覺得'$ bitstoreal'有什麼用?你是否單獨檢查了這個函數,按預期工作?如果模塊加法器與問題無關,它可以被刪除。 – Morgan 2015-04-01 08:49:56

+0

我希望它將二進制數字轉換爲真實的,並且在我看到它的那些例子中,我錯了嗎?問題3.關於模塊加法器@morgan – user3813380 2015-04-01 11:14:19

+0

我認爲它只是用於類型轉換,允許一個實數轉換爲64位,所以它可以通過64位端口傳遞,使用'$ realtobits'和'$ bitstoreal'我的印象是他位於中間位置,暴露了IEEE 754定義的浮點雙位。除非部分指數被設置,否則這看起來像正確的數字。 – Morgan 2015-04-01 13:38:11

回答

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] ; 
+0

這裏我做了一些事情,就像你的第二個代碼,但我想計算這些表示的實數,所以表示的十進制值是:*( - 1)^ sxfx 2^e其中e = E - 偏置和f =(F /(2^n))+ 1,然後將這兩個小數加起來,並將答案與模塊答案進行比較以瞭解它是否正確。 (你可以在我的問題中提到的鏈接中看到公式*)@morgan – user3813380 2015-04-02 15:13:16

+0

h23在這裏是偏見(在我的代碼中),n是52,所以我寫這個:'fa2 =($ bitstoreal(fa)/( 2 ** 52))+ one;'fa2是f並且fa在之前的評論中是F.也是'ta =( - 1)**(signa)* fa2 *(2 ** expands);'是公式 – user3813380 2015-04-02 15:16:59

+0

是錯嗎?@morgan – user3813380 2015-04-03 11:05:11