2019年 03月 28日
tiny-dnn アクセラレータのシミュレータを C++ モードに戻す
畳み込み用の配列インデックス生成回路を SystemC 記述に変更するに先立ち、Verilator を C++ モードから SystemC モードに変更しました。
続いて畳み込み用の配列インデックス生成回路を SystemC 記述に変更しましたが、シミュレーション速度がとっても遅くなりました。
そんなわけで、Verilator を C++ モードに戻してみたいと思います。
Verilator で C++ に変換されたモジュールと SystemC で記述した回路を連結して検証するには、クロック同期化の工夫が必要になります。
SystemC でクロックを生成するのは
sc_clock clk ("clk", 10, SC_NS);sc_start(5, SC_NS);sc_start(5, SC_NS);
こんな感じ。
この clk を Verilog モジュール側でも使いたいと思います。
じゃあ、1個目の sc_start で何が起きるのか?
クロックを立ち上げて、回路を評価して、5ns 進める。
ここまでで、クロックの立ち下げはしないようです。
クロックのトグルの後に時間を進められては、Verilog モジュールとの同期が不便です。
そんなわけで、Verilogモジュール側を先行して評価するのがやりやすい模様。
verilator_top->clk = !clk;verilator_top->eval();sc_start(5, SC_NS);データ交換波形取得main_time += 5;
これがクロック半サイクルの動作になります。
他に、ビルドの方法を試行錯誤したり、たくさんの地道な修正を入れたりでやっと動くようになりました。
では、シミュレーション実行時間を計ってみたいと思います。
学習サンプルは 1600 個、ミニバッチ=2、エポック=1 での結果です。
全 Verilog & C++ モード (SystemC にする前の環境) 64秒
クロックだけ SystemC に変更 (参考) 115秒
インデックス回路を SystemC 化 & C++ モード (今日からの環境) 155秒
インデックス回路を SystemC 化 & SystemC モード (昨日までの環境) 214秒
微妙だ…
SystemC を使うととにかく遅くなるって事らしい。
ついでに、今日からの環境を sim_lv1 ブランチで偽物の FPU を使って高速化すると 100秒になります。
ちなみに IN2OUT のパスがあると、この検証環境ではちゃんと動かない気がします。
by tom01h
| 2019-03-28 17:16