我当前的项目在perl模块中设置一个环境变量,然后稍后从SystemVerilog文件调用一个使用该变量的函数。要求是我们在perl模块中添加的内容在调用时存在于环境变量中。
然而问题是perl模块和systemverilog之间的某些东西调用了我的变量。我无法弄清楚它是什么,修复这个问题与我的项目无关,所以我只想将变量设置为perl模块设置的内容并继续前进。
在Perl中有一个方便的getenv函数,我也可以在SV中使用getenv。但似乎并不是一个setenv。在SV中设置环境变量的适当方法是什么?
答案 0 :(得分:1)
使用$ system()调用从SystemVerilog中调用perl代码吗?如果是这样,perl代码所做的环境更改肯定不会传播回SV世界,因为这些更改只在$ system()子进程的环境中进行。
setenv()系统调用在我使用的所有工具(最近的Fedora OS,最新版本的Mentor / Cadence / Synopsys模拟器)中通过SystemVerilog DPI-C为我工作,但可能有一些较旧的* nix系统它不可用。我使用了“man 3 setenv”中给出的原型。看看其他StackOverflow论坛上的讨论,似乎使用putenv()并不是一个好主意,尤其是来自DPI,你不知道用于DPI字符串参数的内存会发生什么。 setenv()制作其参数字符串的副本,不应该受到该问题的威胁。
在我看来,如果你的工具流没有以你想要的方式正确地传播环境变量,那么你遇到的问题比如何搞乱SystemVerilog的env要大。我特意选择不向svlib实用程序库添加环境修改函数,正是因为使用环境是在SV模拟中传递信息的一种非常糟糕的方式。我想如果您需要为某些外部程序设置一个环境,然后使用SV $ system()调用来调用它,这是有意义的。
答案 1 :(得分:0)
Mh ......事实证明答案是微不足道的,但这是解决这个问题的唯一主题,所以我会留下它以防其他人发现他们遇到类似情况:
SystemVerilog没有setenv()或getenv()函数。它们实际上是使用以下构造从C实现的:
module/program foo();
import "DPI-C" function <return type> foonction(<function arguments>);
endmodule/program;
显然在我的情况下有人为getenv()做了这个,但从来没有setenv()。我没有理解的原因是因为我的代码包括以下方式:
**foo.sv**
if(var.bit) begin
call_function();
use_environment_variable();
end
**bar.sv**
module bar();
<do stuff>
`include foo.sv <-- foo code is copied in after calculations have occured.
endmodule
尝试在foo.sv中导入DPI-C会触发错误,因为导入将在计算完成后到达。要解决这个问题,我们需要像这样导入bar.sv:
module bar();
import "DPI-C" function int setenv(string name, string value, int override);
<do stuff>
`include foo.sv
endmodule
答案 2 :(得分:0)
除非您从SV运行另一个可执行文件,否则从SV设置环境变量不是很有用。
如果您想获取环境变量,可以使用Verilab's svlib函数:
function automatic string sys_getEnv(string envVar);
function automatic bit sys_hasEnv(string envVar);