【发布时间】:2015-04-01 07:45:32
【问题描述】:
我想写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
- 当我将
( $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.那么我知道你总是会去(-1)**(signa)*(2**expa);
这意味着 fa2*(2**expa) 是 0 !但我不知道为什么以及我该怎么做才能使它正确。
我认为即使我没有更改我的fa2 和fa2(其中添加了一个)提供正确的输出,我的ta 也可能有问题。
3.我的模块还有一个问题,真的很奇怪!
加法器代码模块的一小部分来自测试台代码。
就是当我调试我的代码时,fb 的第 63 位是 0!有什么想法吗?
【问题讨论】:
-
你认为
$bitstoreal是做什么的?您是否已单独检查此功能,是否按预期工作?如果模块加法器与问题无关,可以将其删除。 -
我预计它将二进制数转换为实数,并且在我看到的示例中是这样做的。我错了吗?问题3.关于模块加法器@morgan
-
我以为它只是用于类型转换,允许将实数转换为 64 位,以便可以通过 64 位端口传递,使用
$realtobits和$bitstoreal我的印象是他中间的位暴露了 IEEE 754 定义的浮点双精度位。除非设置了部分指数,否则这看起来是正确的数字。 -
你能解释更多吗?我不明白你的意思。我说过它像你的想法一样转换,我不明白你想在这些句子中说什么:“我的印象是他在中间的位暴露了 IEEE 754 定义的浮点双精度位。这个除非设置了部分指数,否则它看起来像是正确的数字。”我的代码有什么问题?@morgan
-
$bitstoreal将 IEEE 754 双位部分转换为实数。$realtobits将实数转换为 IEEE 754 双位模式。在您的代码中,您对这些功能的使用对我来说并不明显。您对变量名的使用并不清楚什么是指数和分数IEEE 754 double。
标签: verilog