如何在Verilog/System Verilog中读取环境变量?

9

如何在 Verilog 中读取环境变量?(在 VCS 仿真器上运行)

我试图完成的目标是:

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

$PATH是一个环境变量。

4个回答

16
你可以简单地使用 SystemVerilog DPI 来获取环境变量。 由于 getenv 是每个 POSIX 平台的标准 C 库,因此您无需为函数定义再次实现自己的 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

在你原来的问题中还有一个问题,PATH是可执行文件搜索路径的环境变量,并使用“:”字符连接。我认为这里应该是一个例子,而不是真正的“PATH”环境变量。否则,你的fopen文件名可能是"/bin:/usr/bin:/usr/local/bin/FileName",这是错误的。

这不是解决“包含路径”的方法。还有其他的想法吗? - Clement

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文档应该说明如何将其链接到模拟器中。

1
使用 DPI 就简单多了,可以看看其他答案。 - Paul S
好问题 - 为什么在这里使用PLI函数有用呢? - undefined

1
经常使用Verilog预处理器会更简单。
File = $fopen(`PATH_FILENAME, "r");

请在您的Makefile/shell脚本中调用模拟器,并指定要替换的值。 $(SIM) -DPATH_FILENAME=\"$PATH/FileName\" blah.v ... 我经常在Icarus' iverilog中使用它,vsim和其他类似工具可能也支持类似功能。
引号被转义以便包含在替换值中,因为预处理器不会在文字值内进行替换。例如,这种组合是不起作用的
File = $fopen("`PATH_FILENAME", "r");

...

`$(SIM) -DPATH_FILENAME=$PATH/FileName blah.v ...`

0

在这里我可以看到所有的答案,无论是使用某些DPI还是需要一些命令行参数。因此,我将用仅限SystemVerilog语法分享我的答案。 答案不特定于任何模拟器。 但肯定是针对Linux环境的; 对于其他操作系统,我们需要更改$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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接