我试图在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
答案 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的值 类型。 ...