C言語のprintfをかっぱらってSimログに投げ入れる

systemVerilogがらみで、小ネタをもう一つ。

DPI-Cを使っている時に、C言語側でprintf関数を使ってデバッグすることがある。

この場合、printf関数の出力はSimログファイルに書き出される。 Sim側の$displayシステム関数の出力と混在することになるのだが、ここに大きな問題がある。 出力の順序性が保証されていない。たまにどう考えてもおかしな順序になる場合を発見する。

バッファリングの利いているファイル入出力だから、二つの方向から出力したら、どっちが先になるかは運次第。

デバッグしているのに、どっちが先に動作したか分からんのは困るので、C言語のprintfをSim側の$displayに化かしてしまう方法を考えました。

処理手順

  • C言語のprintf関数を可変引数のマクロで再定義。
  • マクロから別関数を呼び出す。
  • 別関数でsprintf関数でフォーマット文字列に従い、書き出す文字列を作成
  • DPI-CでSim側のfunction呼び出しに書き出し文字列を与える。
  • functionで$display関数で出力

すごい手間‼️でも使うのは、簡単‼️

ソースコードは、リンク先です。 https://github.com/shipinsworks/BeD/blob/master/bed/c/scenario_task.h https://github.com/shipinsworks/BeD/blob/master/bed/sv/macro.svh

後は煮るなり焼くなりどうぞ。うまくいくかどうかは運?(腕?)次第