Xilinxさんの助けを借りるのが良さそう

AXI-Liteのマスタ・スレーブのBFMを作るところまでやってみた。

しかしまあ大変、一人ではペースが上がらない。ということで巨人の肩をお借りすることにしました。Xilinxさんよろしく。

次の目標は、C言語でXilinxさんのAXI-VIPを呼び出すことにします。

バグを対策したよ。

  • リセット期間中の信号ドライブリクエストへの応答を待たせる。

  • リセット期間中に信号ドライブが無い。

  • 信号ドライブのリクエスト要求信号の立ち下げ不足

まだありそうな気配。

連続して動作させるとどうなるのだろう。

危なそうです。修行します。

C言語側からBFMの設定変更可能(スレーブ側モデルだけだけど…)

スレーブBFMで応答信号をサイクル単位で遅らせることを可能にして、DPI-Cインタフェースから設定変更可能にしました。

何が良いかというと、テスト内容をすべてC言語側に記述できるのです。 テストデータの投入やテストの動作順序指定だけでなく、信号の応答サイクル数も指定可能になりました。

ということは、…

=>他の設定にも応用が効く

ということです。

どのような設定が可能になるかは、BFMの作り次第ということになります。

今は、関数名とかディレクトリ名称とか、気に入らない名称がまだあるので、整理中です。

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

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

バグ発見ーリセット中の信号値

Awreadyはリセット中lowであるべきところ、hiになってます。

リセット中は、アドレス情報を受け取ることはできないはずなので、おかしな動作ですね。 同件でalreadyとbvalidも問題があるようです。

AXIの勉強もしなくてはと思ってます。

他にも問題が無いか、注意して見ていきます。

AXI4-Liteの対向動作

AXI4-LiteのBFMを作成して、スレーブも動作し始めたようです。

と言っても、マスタBFMとスレーブBFMを対向接続しての動作であり、 タイミングも正常動作のデフォルト値のままだから、動作して当然です。

スレーブBFMの先は、C言語側で単純な256ワードのメモリ機能モデル(単なる配列)を置きました。 このC言語モデルももう少しモデルらしくしたいですね。

その前に、C言語側からSim側ドライバを設定して、タイミングを少し設定変更できるようにします。 ゆっくり動作させても正常動作するかテストできないと困る。

どこまで作りこむかが問題ですが、そこは気楽に必要になったら作ることにします。