Vivadoってどうやるの?
Xilinxさんの力を借りようとしたけど、どうもVivadoの使い方が分かっていないことが判明しました。
なんかそれらしく使っていたけど、テストベンチはどこでどうのように作れば良いのだろう?
勉強します。
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側ドライバを設定して、タイミングを少し設定変更できるようにします。 ゆっくり動作させても正常動作するかテストできないと困る。
どこまで作りこむかが問題ですが、そこは気楽に必要になったら作ることにします。