verilog IEEE 754单精度到整数转换

时间:2011-04-22 18:14:01

标签: integer verilog ieee-754

我正在尝试将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位输入并提供整数输出?如果是,我如何在我的程序中包含该功能? 谢谢。

更新:上面的代码段会正常工作吗?

2 个答案:

答案 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)

一种方法是:

  1. 以64位双精度格式重新打包操作数
  2. 使用$bitstoreal
  3. 将值转换为实数
  4. 使用本机verilog浮点数学来操作实数
  5. 使用$realtobits
  6. 将实数转换回位
  7. 将64位双精度转换回单精度格式。如果值超出可表示的范围,则需要对其进行限制(存在“距离零太远”和“太接近零”的情况需要进行限制)。
  8. 如果要使用问题中的策略将浮点数转换为固定点,请记住Verilog没有本机定点支持。你不能有意义地评估2 ^(负指数)作为整数,你只会得到零。要么重构算法,要么指数总是正数,要么使用右移(>>)而不是乘以2的负幂。