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のところは、どうもわかりにくいエラーやハングアップを起こす。私だけがそう思っているのだろか。

 

 

 

シミュレータの設定

基本的なことを説明し忘れていました。

マシン

LinuxOS搭載PCを前提としてます。環境はBashシェルスクリプトで作成されていますので、Cygwin環境でも動作はすると思います。私はLinuxOSとしてUbuntu16.04を使ってます。

Vivadoのインストール

方法はXilinx社のサイトにPDFがありますので、省略します。バージョンは2017.2です。

他の制限は良きに計らって頂きたく。(?日本語おかしい?)