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
小ネタでした。