我正在尝试将IEEE single precision二进制格式编号转换为整数。我使用以下循环:
for(i=22;i>=0;i=i-1)
begin
a1=in1[i]*(2**(i-23));
end
a1=a1+1;
a1=a1*(2**(in1[30:23]-8'b01111111));
a1=((-1)**(in1[32]))*a1;
我需要在我的程序中再执行7次。我的问题是,如果有一个库来执行此操作,需要32位输入并提供整数输出?如果是,我如何在我的程序中包含该功能? 谢谢。
更新:上面的代码段会正常工作吗?
答案 0 :(得分:2)
对于行为代码,请使用$ rtoi()或$ realtobits()
real in1;
integer a1;
wire [63:0] b1;
a1 = $roti(in1); //Truncates fractional part
b1 = $realtobits(in1); //Probably not what you want
如果需要将位向量转换为实数类型,可以使用$ bitstoreal()。
编辑: 因此,如果我正确地遵循您的意见,那么您正在构建一个适用于32位数据值的浮点ALU模型。在这种情况下,您可以使用真正的数据类型,因为Verilog可以本机处理此格式。当然,您将无法检测到某些情况
task [31:0] realAdd(input [31:0] in1, input [31:0] in2, output [31:0] out);
begin
real rIn1,rIn2,rOut;
rIn1 = $bitstoreal(in1);
rIn2 = $bitstoreal(in2);
rOut = rIn1 + rIn2;
out = $realtobits(rOut);
end
endtask
这些函数都使用双精度,因此您需要执行一些简单的位扩展来处理单精度输入,以及输出上的一些非平凡边界检查/截断。您可以通过使用SystemVerilog来避免这种情况,SystemVerilog具有可用于单精度值的$ bitstoshreal()/ $ shortrealtobits()函数。
如果你想要硬件,Computer Organization & Design有一个多周期实现的描述。正如安迪所说,你的案件可能会有更好的资源。这些设计并不简单。
答案 1 :(得分:2)
一种方法是:
$bitstoreal
$realtobits
如果要使用问题中的策略将浮点数转换为固定点,请记住Verilog没有本机定点支持。你不能有意义地评估2 ^(负指数)作为整数,你只会得到零。要么重构算法,要么指数总是正数,要么使用右移(>>
)而不是乘以2的负幂。