VivadoHLS

Vivado HLSでの浮動小数点演算のシミュレーションやってみたらなんか変だった

概要

Vivado HLSで浮動小数点演算回路を作りたくてシミュレーションをやってたんですが、
普通にシミュレーションすると上手く行かなかったんでそこんところ軽くメモ程度に
残しておきます。

似たようなところで躓いた人とか居るかもしれませんし…。

環境によっては動作するといったご報告いただいたので正常に動作しなかった手元の環境を以下に示しておきます。
Ryzen7 1700X   (Windows10 pro): Vivado HLS 2017.4
i7-4770S  (Windows7 professional): Vivado HLS 2017.4 および 2016.4

もし他に正常に動作する環境があればご報告頂ければと思います。

通常のCによるシミュレーションと実行コード

先に言っておくと普通にシミュレーションすると正常な結果が出ませんでした。
流れだけコードと一緒に書いておきます。

calcflp.c(単純なfloat型で計算をする関数を書いたもの)を用意
  ↓
calcflp_tb.c(テストベンチ)を用意
  ↓
コンパイルして動作確認
  ↓
>失敗<

calcflp.c
float calcflp(float a, float b)
{
    float c = a * b;

    return c;
}
calcflp_tb.c
#include <stdio.h>

int main()
{

    const float n = 30.0, p = 4.0;
    float a = 5.0;
    printf("default: %f \n", a);
    a = calcflp(n, p);
    printf("1 print: %f \n", a);

    a = calcflp(25.0, 3.0);
    printf("2 print: %f \n", a);
    return 0;
}

Run C Simulationの結果はこんな感じ

・
・
・
INFO: [APCC 202-1] APCC is done.
   Generating csim.exe
default: 5.000000 
1 print: 0.000000 
2 print: 0.000000 
INFO: [SIM 1] CSim done with 0 errors.
INFO: [SIM 3] *************** CSIM finish ***************

1 printと2 printで120.0と75.0が出ていなければいけないはずが、
2つとも0になっています。

C/RTLでのシミュレーション

対してC/RTLシミュレーションだと上手く行きます。
コードは上のものをそのまま使います。

結果は以下の通り

INFO: [APCC 202-1] APCC is done.
   Generating cosim.tv.exe
INFO: [COSIM 212-302] Starting C TB testing ... 
default: 5.000000 
1 print: 120.000000 
2 print: 75.000000 
INFO: [COSIM 212-333] Generating C post check test bench ...
・
・
・

正常に125.0と75.0と出力されていますね。

ざっくりまとめ

普通のCシミュレーションでは、正常な結果が得られませんでしたが
C/RTLシミュレーション試したら上手く数値が出ました。

なぜこのような仕様になっているのかわからないですが(バグなのかも?)
とりあえずこちらで暫くはどうにかシミュレーションできそうです。