在verilog中显示一个真实但bitstoreal仅返回0.000000

时间:2013-10-31 14:26:45

标签: verilog modelsim

我试图在modelsim中模拟我的verilog代码时显示一个实数。但我只输出0作为输出。我正在尝试使用bitstoreal系统函数。我不太擅长verilog所以这可能是一个愚蠢的初学者的错误。

以下是我的代码:

reg [31:0] y[1:0];
integer    file;
localparam [31:0] test = 32'h3fb0d05d;

task read_data_from_fifo();
   begin
     file = $fopen("/tmp/data.fifo", "r");
     $fread(y, file);
     $display("y0 = %d, %f, %h", $bitstoreal(y[0]), $bitstoreal(test), $bitstoreal(y[0]));
     $display("y1 = %f, %f, %h", y[1], $bitstoreal(32'h5dd0_b03f), y[1]);    
   end
endtask

(从初始开始块调用任务) 输出:

# y0 =          0, 0.000000, 00000000
# y1 = 3742779199.000000, 0.000000, df16473f

所有帮助表示赞赏。

更新

看起来bitstoreal仅支持双精度浮点数(64位)。因为

localparam [63:0] test = 64'h_3FF61A0BE5109071;
$display("%f", $bitstoreal(test));

结果

1.381359

2 个答案:

答案 0 :(得分:2)

$ bitstoreal采用64位输入双精度浮点数。

解决方案:从单精度浮点数到双精度浮点数进行一点转换。像这样:

reg [31:0] z;      // single precision float
reg [63:0] double; // double precision float

double = {z[31], z[30], {3{~z[30]}}, z[29:23], z[22:0], {29{1'b0}}};

$display("%f", $bitstoreal(double));

免责声明:我不确定这种单一到双重转换是否安全/正确。

更新

这应在工具提到的IEEE文件中阅读:

$ realtobits将值从实数类型转换为实数的64位向量表示。 $ bitstoreal将$ realtobits创建的位模式转换为实际类型的值。

答案 1 :(得分:2)

使用$ bitstoshortreal: ... $ shortrealtobits将值从shortreal类型转换为real的32位向量表示 数。 $ bitstoshortreal将$ shortrealtobits创建的位模式转换为shortreal的值 类型。 ...