シミュレーションは早いがコンパイルが遅い

コンパイルが通るようにしたところ segmentation fault で落ちた。問題は RAM クラスにある。 RAM といってもラインバッファ向けのアドレスが 15bit x 192 word だったりする。アドレスバスは 8bit あるものの、有効なアドレスは 0 から 0xbf まで。処理の都合でアドレスバスには 0xc0 以上の値が入ることがあり、 RAM コントローラからそのアドレスのデータを取り込むことはないのだがシミュレーション上は落ちると言うこと。

verilog だと出力は不定になるのだが、こういったことはソフトウェアらしいというか。ほかには nsl ソースで内部 RAM として実装していたもののどうも処理がおかしいので自分で C++ で書いた RAM クラスを組み込んで動くようにした。

そんな対応があってようやく Verilog で出したときと同じシミュレーションができるようになった。1フレームのシミュレーション実行時間はネイティブコードになるので 17 秒という短い処理時間でこの点は満足できた。シミュレーションは17秒、波形観測も時間の変化なし。

問題はコンパイル時間にある。現状では NSLcore から出力される C++ のクラスは定義と実装が分離されていないので全てのモジュールを 1 つのファイルから #include してつなぎ合わせる必要があって、コンパイルに30秒もかかる。観測点を増やすという1行だけの変更にも毎回 30 秒のコンパイル時間と数秒のリンク時間のあとにシミュレーションが開始される。

Verilog 変換,波形観測無し, ModelSIM から計算すると1分かかる。波形観測点が増えるとシミュレーション時間は増えて2分かかる場合もがあるが、コンパイルの時間は一瞬である。

処理速度的には SystemC のほうが圧倒的に早いのだがコンパイルの時間がかかるのが問題で、今回のあまり複雑ではない回路構成であっても30秒かかるということだ。 NSLcore の人に聞いたら技術的には分割コンパイルはあまり効果が得られないという回答をいただいたので、うーーーーーんとうなってしまった。

現状では SystemC 側の画像出力は Verilog のときと同じ writememh 互換で出力してそのファイルを読み込んで画面に出力ということにしてある。この後、結果が良ければ画像出力を画面出力プログラム(ときどきだしてる自作プログラムの lineview) に直結させて、シミュレーション途中に随時画面更新ということも考えていた。

コンパイルに時間がかかりすぎるということと個人的な都合でこの機能の評価はあまり重要ではないこと、優先度の高い別機能の評価が必要という点だ。ということで SystemC 編はここらへんでおわりで、次回のこの手の評価には Verilator を試してみたい。今回は SystemC だけだったし、SystemC なしで使えるのかとか。