SystemVerilogの小ネターdebug_printf()マクロ
リクエストがあったので、公開します。
DEBUGマクロが定義されてたら、プリント出力します。小ネタとしての工夫は、このマクロは、フォーマット文字列と可変個の引数を渡すことができるのです。
可変個のリストとして渡して、$sformatf()が良きに計らってくれます。カッコが二重ですから、よろしく。
使い方(フォーマット文字列は修正が必要、スペースを取ってください。うまく書けない。)
`debug_printf(("addr:% 08x data: % 08x",addr,data));
ついでに出力位置がわかるようにファイル名と行数もヘッダーも付けました。Vivadoのシミュレータで動作確認してます。
この小ネタを使ってみてください。
function string basename( string p ); int i; for( i = p.len(); i>=0; i-- ) begin if( p[i] == "/" ) break; end if( i < 0 ) return p; else begin return p.substr(i+1,p.len()-1); end endfunction // basename `ifdef DEBUG `define debug_printf( msg ) $display( "[Debug ] % 8d : %s(% 1d) %s", $stime, basename( `__FILE__ ), `__LINE__, $sformatf msg ) `else `define debug_printf( msg ) `endif
コードハイライト中で"% 8d"と書きたいけど、うまく書けない。スペースを余分に入れてます。 ソースコードは、githubに有りますのでそちらから持って行ってください。
https://github.com/shipinsworks/BeD/blob/master/bed/sv/macro.svh
小ネタでした。
対向モデル AXi4-Lite Slave BFMを作ろう
対向が無いと通信のバリエーションテストが出来ない。
まずは、AXI4-Lite Slave BFMを作ろうと思う。 マスタの逆だから何とかなるかな?
マスタとスレーブを対向でテストベンチに置いて、 マスタはC言語から能動的にアクセスを起こす。 スレーブは、ドライバからのコールバックで反応する。
まずはやってみよう。
AXI4-Liteでもいける?
AXI4でつながるなら 、十分にLiteでもつながるよね。
というわけで、今度は自分でbfmを記述してみます。
ハンドシェイク出来れば、送受信できると思ったけど、やっぱりそうなんだ。
出来たよ。AXI4-LiteのマスターBFMドライバ。
正常ケースのみの動作しかしないので、もう少しテストらしい動作もさせたい。
今時は、バスインタフェースはメーカ製IPを使うのだろうか。
DPI-CでAXIバスが動くぞ
へへ…とほくそ笑んでしまいます。
動いてる。スマートとは言い難いけど、 書き込んでどうなったと読み出すとC言語側に戻って来るやん。
当たり前のことですが 、なぜか自分の手で動かして見ると嬉しい。 これはやはり趣味の世界ですね。
@marsee101さんありがとうございます。
http://marsee101.blog19.fc2.com/blog-entry-2510.html からAXI_Master_BFM.vとAXI Slaveインタフェースのメモリシミュレーション用IPを拝借させていただきました。
AXI_Master_BFM.vは 、環境の都合でAXI_Master_BFM.svと名称を変えて、DPI-Cインタフェースをつないだけで動作しました。
そして、このDPI-C利用の検証環境は以下のところにあります。 https://github.com/shipinsworks/BeD
今はまだ4バイトの読み書きのみですので、バースト転送にも対応できるようにしようと考えてます。
久々に嬉しかった。楽しかった。
BFMをつなぐぞ
AXIのBFMをSim環境につなぐぞ。
縁あって利用させていただけるAXIのMatsreBFMは、module記述で内部が 複数のTaskで記述されている。interfaceでDPI-Cと接続して、Taskをキックすれば動作すると思われる。
とにかく動かしたい。Interfaceの接続部分を記述すれば良いのですが、時間が無い、時間が欲しい。
ああすればいい、こうしようかな、と考えているのが楽しい。
DPI-Cをバスインタフェースのように見る
DPI-Cのところをバスインタフェースのように見せられたら、簡単になるのではないか。と言うのが始まりで、read/writeができて、割り込みぐらいできて、DMAのようなバースト転送が出来れば良さそうな感じです。あとはなにも付け足さず、インタフェースを使うことに専念します。
バスだからアドレス幅もデータ幅も固定で他の信号線も決まった本数である。 ソフトウエアならば、パケット通信のようなもんだ。構造体のパケットをread/writeできれば、良い感じで通信できるように思いました。
* アドレスのような識別子でどこに転送するかと、どのように処理するかを指定します。
* 転送サイズやバースト数で転送形態を指定します。
何を転送するかが問題なだけなのに、DPI-Cのところは、どうもわかりにくいエラーやハングアップを起こす。私だけがそう思っているのだろか。