如何在Verilog中读取环境变量?(在VCS模拟器上运行)
我正在努力完成
File=$fopen("$PATH/FileName","r");
$PATH是一个环境变量。
发布于 2013-02-27 11:15:27
您可以简单地使用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"
,这是错误的。
发布于 2013-02-23 08:30:59
您可以使用简单的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-07-17 01:00:38
使用Verilog预处理器通常更简单
File = $fopen(`PATH_FILENAME, "r");
然后从您的Makefile/shell脚本调用模拟器,指定要替换的值
$(SIM) -DPATH_FILENAME=\"$PATH/FileName\" blah.v ...
我经常在伊卡洛斯的iverilog
上使用它,vsim
和朋友们可能也支持类似的功能。
由于预处理器不会在文字值中进行替换,因此会对引号进行转义,以便将它们包含在被替换的值中。例如,这种组合不起作用
File = $fopen("`PATH_FILENAME", "r");
..。
`$(SIM) -DPATH_FILENAME=$PATH/FileName blah.v ...`
https://stackoverflow.com/questions/15034019
复制相似问题