はじめに
昨日のブログでは、Xilinx xsim で Software Driven Verification ができるっぽいということを書きました。
Xilinx Simulator Interface を使えば、Verilator での C++ を使ったケースと同じような感じにすればいいのでは?と思った次第です。
Xilinx Simulator Interface
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を使って、どのようにシミュレーションを実行するかをみていきます。