8

Verilogで環境変数を読み取るにはどうすればよいですか?(VCSシミュレータで実行)

私は達成しようとしています

File=$fopen("$PATH/FileName","r");

$PATHは環境変数です。

4

4 に答える 4

13

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"、間違っている可能性があります。

于 2013-02-27T03:15:27.397 に答える
2

単純な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のドキュメントでは、これをシミュレータにリンクする方法を説明する必要があります。

于 2013-02-23T00:30:59.177 に答える
1

多くの場合、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 ...`
于 2013-07-16T17:00:37.527 に答える
0

ここでは、いくつかの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
于 2021-08-10T09:48:20.567 に答える