如何阅读Verilog内的环境变量? (在VCS模拟器运行)
我试图完成
File=$fopen("$PATH/FileName","r");
$ PATH是一个环境变量。
如何阅读Verilog内的环境变量? (在VCS模拟器运行)
我试图完成
File=$fopen("$PATH/FileName","r");
$ PATH是一个环境变量。
你可以简单地使用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"
,这是错误的。
您可以使用一个简单的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");
然后从生成文件/壳脚本调用模拟器的指定值被取代
$(SIM) -DPATH_FILENAME=\"$PATH/FileName\" blah.v ...
我用这个与伊卡洛斯iverilog
时候, vsim
和朋友大概都支持类似。
引号转义使得它们包括在取代的值,因为预处理器将不会立即数值内替换。 例如这种组合不工作 :
File = $fopen("`PATH_FILENAME", "r");
...
`$(SIM) -DPATH_FILENAME=$PATH/FileName blah.v ...`