Verilogで環境変数を読み取るにはどうすればよいですか?私はVerilog/System Verilogで環境変数を読み取るにはどうすればよいですか?
File=$fopen("$PATH/FileName","r");
の$ PATHを達成しようとしています
(VCSシミュレータ上で実行する)環境変数です。
Verilogで環境変数を読み取るにはどうすればよいですか?私はVerilog/System Verilogで環境変数を読み取るにはどうすればよいですか?
File=$fopen("$PATH/FileName","r");
の$ PATHを達成しようとしています
(VCSシミュレータ上で実行する)環境変数です。
SystemVerilog DPIを使用して環境を取得できます。 getenv
はすべてのPOSIXプラットフォーム用の標準Cライブラリであるため、関数定義のために独自のgetenv()
同等の関数を再度実装する必要はありません。
SVのコード例。
それはあなたの元の質問でenv = /home/user/FileName
そして、もう一つの問題は、PATHは、実行可能な検索パスの環境で表示されます
ncverilog -sv dpi.v
または
vcs -sverilog dpi.v
を実行
import "DPI-C" function string getenv(input string env_name);
module top;
initial begin
$write("env = %s\n", {getenv("HOME"), "/FileName"});
end
endmodule
連結して ":" キャラクター。私はそれが本当に "PATH"環境ではなくここの例であるべきだと思います。それ以外の場合、fopenファイル名は"/bin:/usr/bin:/usr/local/bin/FileName"
になりますが、これは間違っています。
タイプミスを指摘してくれてありがとう。 – jclin
シンプルなPLIアプリケーションを使用して、環境変数を読み取ることができます。ここでは、エラーチェックなしのサンプルを示します。
#include <stdlib.h>
#include <string.h>
#include "vpi_user.h"
PLI_INT32 pli_getenv (PLI_BYTE8 * arg) {
vpiHandle tf_obj = vpi_handle (vpiSysTfCall, NULL);
vpiHandle arg_iter = vpi_iterate (vpiArgument, tf_obj);
vpiHandle arg1, arg2;
arg1 = vpi_scan (arg_iter);
arg2 = vpi_scan (arg_iter);
s_vpi_value vi, vo;
vi.format = vpiStringVal;
vpi_get_value (arg2, &vi);
vo.format = vpiStringVal;
vo.value.str = strdup (getenv (vi.value.str));
vpi_put_value (arg1, &vo, NULL, vpiNoDelay);
return 0;
}
VCSドキュメントには、これをシミュレータにリンクする方法を説明する必要があります。
これはDPIを使用するほうがずっと簡単です。他の答えを見てください。 –
その後、私はイカルスでこれを使用
$(SIM) -DPATH_FILENAME=\"$PATH/FileName\" blah.v ...
を置換するためにあなたのMakefile /シェルスクリプトから指定値をシミュレータを起動するVerilogのプリプロセッサに
File = $fopen(`PATH_FILENAME, "r");
を使用することがしばしば簡単です'iverilog
、しばしばvsim
と友人はおそらく同様のサポートします。
引用符は、置換された値に含まれるようにエスケープされます。プリプロセッサはリテラル値の代わりに使用されないためです。たとえば、この組み合わせはを動作しません:
File = $fopen("`PATH_FILENAME", "r");
...
`$(SIM) -DPATH_FILENAME=$PATH/FileName blah.v ...`
一般的な解決策は、現在のディレクトリに必要なファイルをコピーすることで、単に '$のfopen(「ファイル名を」、」 r "));'。実行シミュレーションは通常スクリプトの一部ですので、これはスクリプトのもう1つのステップに過ぎません。 – toolic