如何阅读的Verilog / Verilog的系统环境变量?(How do I read an en

2019-08-17 03:42发布

如何阅读Verilog内的环境变量? (在VCS模拟器运行)

我试图完成

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

$ PATH是一个环境变量。

Answer 1:

你可以简单地使用SystemVerilog的DPI用于获取环境。 而且由于getenv是一个标准C库为每POSIX平台,所以你并不需要实现自己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" ,这是错误的。



Answer 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文档应解释如何把这个链接进入模拟器。



Answer 3:

它往往是简单的使用Verilog的预处理

File = $fopen(`PATH_FILENAME, "r");

然后从生成文件/壳脚本调用模拟器的指定值被取代

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

我用这个与伊卡洛斯iverilog时候, vsim和朋友大概都支持类似。

引号转义使得它们包括在取代的值,因为预处理器将不会立即数值内替换。 例如这种组合不工作

File = $fopen("`PATH_FILENAME", "r");

...

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


文章来源: How do I read an environment variable in Verilog/System Verilog?