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

小ネタでした。