Verilogで環境変数を読み取るにはどうすればよいですか?(VCSシミュレータで実行)
私は達成しようとしています
File=$fopen("$PATH/FileName","r");
$PATHは環境変数です。
Verilogで環境変数を読み取るにはどうすればよいですか?(VCSシミュレータで実行)
私は達成しようとしています
File=$fopen("$PATH/FileName","r");
$PATHは環境変数です。
SystemVerilogDPIを使用して環境を取得できます。また、はすべてのPOSIXプラットフォームの標準Cライブラリであるため、関数定義用にgetenv
独自の同等の関数を再度実装する必要はありません。getenv()
SVのサンプルコード。
import "DPI-C" function string getenv(input string env_name);
module top;
initial begin
$write("env = %s\n", {getenv("HOME"), "/FileName"});
end
endmodule
ランニング
ncverilog -sv dpi.v
また
vcs -sverilog dpi.v
表示されます
env = /home/user/FileName
また、元の質問のもう1つの問題として、PATHは実行可能な検索パスの環境であり、「:」文字で連結されます。これは、実際には「PATH」環境ではなく、ここでの例である必要があると思います。そうしないと、fopenファイル名が"/bin:/usr/bin:/usr/local/bin/FileName"
、間違っている可能性があります。
単純な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のドキュメントでは、これをシミュレータにリンクする方法を説明する必要があります。
多くの場合、Verilogプリプロセッサを使用する方が簡単です。
File = $fopen(`PATH_FILENAME, "r");
次に、Makefile /シェルスクリプトからシミュレーターを呼び出して、置換する値を指定します
$(SIM) -DPATH_FILENAME=\"$PATH/FileName\" blah.v ...
私はこれをIcarusでiverilog
よく使用しますが、vsim
友人はおそらく同様のことをサポートしています。
プリプロセッサはリテラル値内で置換されないため、引用符は置換された値に含まれるようにエスケープされます。たとえば、この組み合わせは機能しません:
File = $fopen("`PATH_FILENAME", "r");
..。
`$(SIM) -DPATH_FILENAME=$PATH/FileName blah.v ...`
ここでは、いくつかのDPIを使用しているか、コマンドライン引数が必要であるかのいずれかで、すべての回答を確認できます。だから私はSystemVerilog構文だけで私の答えを共有しています。回答はどのシミュレーターにも固有のものではありません。しかし、確かにそれはLinux環境用です。他のOSの場合は、$systemコマンドを変更する必要があります。
シミュレーションを開始する前に、前処理スクリプトまたはシミュレーションスクリプトを使用して、この「logPath」システム変数を設定する必要があります。
string myPath;
initial begin
//Writing System Variable To A File
$system("echo ${logPath} > logPath.txt");
//Opening that file and reading to a string variable
fh = $fopen ("./logPath.txt", "r");
void'($fscanf(fh,"%s",myPath));
//Appending File Name To That Path
myPath = {myPath,"/note.txt"};
//Closed and remove this temporary file
$fclose(fh);
$system("rm -rf logPath.txt");
//Open a file at the path that you have extracted from System Variable
//Do whatever you want now
fh = $fopen (myPath, "w");
repeat(10) begin
$fdisplay (fh, "%t %M: Write Line Number =|%0d| ", $time, i);
i++;
end
$fclose(fh);
end