Vengineerの妄想

人生を妄想しています。

Xilinx xsim で Software Driven Verification ができるっぽい (その2)

はじめに

昨日のブログでは、Xilinx xsim で Software Driven Verification ができるっぽいということを書きました。

Xilinx Simulator Interface を使えば、Verilator での C++ を使ったケースと同じような感じにすればいいのでは?と思った次第です。

Xilinx Simulator Interface

docs.xilinx.com

APIは、次のようなもので、かなり簡単なものの

  • xsi_load で データベースからDesignを取り出す
  • xsi_open でシミュレーションのオープン
  • xsi_get_port_number でポート名からポート番号を取り出す
  • xsi_get_value でポート番号の信号にデータをリード
  • xsi_put_value でポート番号の信号にデータをライト
  • xsi_trace_all で信号のダンプ
  • xsi_run で、シミュレーションを進める
  • xsi_get_time でシミュレーション時間を得る
  • xsi_restart で、シミュレーションのリセット
  • xsi_close で終了

xsi_load 関数では、第1引数がデザイン、第2引数がシミュレータエンジン。

xsi_loader("xsim.dir/mySnapshot/xsimk.so","librdi_simulator_kernel.so");
  • xsi_open 関数で指定する引数は、ログファイル名と波形ファイル名。
typedef struct t_xsi_setup_info {
    char* logFileName; 
    char* wdbFileName;
} s_xsi_setup_info, *p_xsi_setup_info;
xsiHandle xsi_open(p_xsi_setup_info setup_info); 

デザインは、HDLをコンパイルしたときに作成された xsim.dir ディレクトリの下にあるデザイン(ここでは、mySnapshot) の下にある xsimk.so です。 シミュレータエンジンは、lib/lnx64.o の下の librdi_simulator_kernel.so です。

  • xsi_get_port_number 関数では、ポート名からポート番号を返します。このポート番号を使って、データのリード・ライトを行います。

  • xsi_get_value 関数で、ポートの信号のリードを、xsi_put_value 関数で、ポートの信号へのライトを行います。しかしながら、値は、Vivado Simulator Verilog Data Formatにて設定する必要があります。

typedef struct t_xsi_vlog_logicval {
    XSI_UINT32 aVal;
    XSI_UINT32 bVal;
} s_xsi_vlog_logicval, *p_xsi_vlog_logicval;

Verilatorは2値ですが、xsim は4値のシミュレータなので、上記のような Data Format を使って、4値の表現を行っています。Verilog HDL/SystemVerilogにおける、PLI (Programming Language Interface) での表現と基本的には同じですね。

  • xsi_trace_all 関数を実行すると、各信号を xsi_open で指定したファイル (wdbFileName) にダンプされます。

  • xsi_run 関数で、シミュレーションを実行します。引数でしていする値は、`timescale で指定した精度で実行される。

  • xsi_get_time 関数で、シミュレーション時間を獲得できる。

  • xsi_reset 関数で、シミュレーションが時間 0 に リセットされます。

  • xsi_close 関数で、終了します。

  • xsi_get_status 関数では、各APIを実行した時のステータスを、xsi_get_error_info 関数ではエラーの情報を得ることができます。

おわりに

今回は、Xilinx Simulator Interface の各APIについて見てみました。次回は、これらAPIを使って、どのようにシミュレーションを実行するかをみていきます。