我想寫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
- 當我添加
($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.然後我明白,TA總是以(-1)**(signa)*(2**expa)
; 這意味着fa2*(2**expa)
是0!但我不知道爲什麼,我能做些什麼才能使其正確。 我認爲,即使我沒有更改我的fa2
和fa2
(添加了一個)給出正確的輸出,我的ta
可能有問題。
3.我的模塊有另一個問題,它真的很奇怪! 加法器代碼模塊的一小部分來自測試臺代碼。 它是當我調試我的代碼時,fb
的第63位是0!任何想法?
你覺得'$ bitstoreal'有什麼用?你是否單獨檢查了這個函數,按預期工作?如果模塊加法器與問題無關,它可以被刪除。 – Morgan 2015-04-01 08:49:56
我希望它將二進制數字轉換爲真實的,並且在我看到它的那些例子中,我錯了嗎?問題3.關於模塊加法器@morgan – user3813380 2015-04-01 11:14:19
我認爲它只是用於類型轉換,允許一個實數轉換爲64位,所以它可以通過64位端口傳遞,使用'$ realtobits'和'$ bitstoreal'我的印象是他位於中間位置,暴露了IEEE 754定義的浮點雙位。除非部分指數被設置,否則這看起來像正確的數字。 – Morgan 2015-04-01 13:38:11