2

我试图在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
4

2 回答 2

4

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

于 2016-01-04T09:58:53.737 回答
3

$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));

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

更新

这要在toolic提到的IEEE文档中阅读:

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

于 2013-10-31T15:27:39.787 回答