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

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

免責事項: この single から double への変換が安全/正しいかどうかはわかりません。

アップデート

これは、toolic で言及されている IEEE ドキュメントで読む必要があります。

$realtobits は、値を実数型から実数の 64 ビット ベクトル表現に変換します。$bitstoreal は、$realtobits によって作成されたビット パターンを実数型の値に変換します。

于 2013-10-31T15:27:39.787 に答える