如何在 Verilog 中读取环境变量?(在 VCS 仿真器上运行)
我试图完成的目标是:
File=$fopen("$PATH/FileName","r");
$PATH是一个环境变量。
如何在 Verilog 中读取环境变量?(在 VCS 仿真器上运行)
我试图完成的目标是:
File=$fopen("$PATH/FileName","r");
$PATH是一个环境变量。
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
"/bin:/usr/bin:/usr/local/bin/FileName"
,这是错误的。#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;
}
File = $fopen(`PATH_FILENAME, "r");
$(SIM) -DPATH_FILENAME=\"$PATH/FileName\" blah.v ...
我经常在Icarus' iverilog中使用它,vsim和其他类似工具可能也支持类似功能。File = $fopen("`PATH_FILENAME", "r");
...
`$(SIM) -DPATH_FILENAME=$PATH/FileName blah.v ...`
在这里我可以看到所有的答案,无论是使用某些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