2015-07-10 46 views
0

我當前的項目設置環境變量的Perl模塊再後來就使得從SystemVerilog的文件調用使用該變量的函數。要求是,我們在perl模塊中添加的任何內容都會在調用時出現在環境變量中。如何使用SystemVerilog設置環境變量?

的問題但是就是Perl模塊,和SystemVerilog通話之間的事情與我的變量插手。我無法弄清楚它是什麼,解決這個問題與我的項目不相關,所以我只是想設置變量爲perl模塊設置它並繼續前進。

有Perl中的一個方便的getenv功能,我能夠在SV使用GETENV爲好。但似乎沒有一個setenv。在SV中設置環境變量的適當方式是什麼?

+0

你嘗試'運行putenv()'?它沒有在ANSI-C中定義,但是它被許多編譯器支持。不確定DPI-C是否接受它。 – Qiu

回答

0

MH ...原來答案是微不足道的,但是這是唯一的線索對這個問題,所以我會離開它,以防別人發現themselve了類似的情況:

的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 

試圖導入DPI-C在foo.sv會引發錯誤,因爲計算所發生後,進口將抵達。爲了解決這個問題,我們需要在bar.sv導入像這樣:除非你正在運行的SV其他可執行

module bar(); 
    import "DPI-C" function int setenv(string name, string value, int override); 
    <do stuff> 
    `include foo.sv 
endmodule 
+0

很高興你把它整理出來。請注意,通過這樣的DPI直接調用getenv()並不是很精彩,因爲無論env var是否存在,或者已經定義了空字符串值,它都會給出相同的結果(空字符串)。由於定義一個env var而不給它一個值是一個常見的,有意義的習慣用法,這實際上有點垃圾。通過在C方面做更多的工作,很容易區分;這就是爲什麼svlib同時提供getEnv和hasEnv函數的原因。 –

1

是使用$系統內的SystemVerilog從調用的Perl代碼()調用?如果是這樣,perl代碼所做的環境更改絕對不會傳播回SV世界,因爲這些更改僅在$ system()子進程的環境中進行。

在我使用的所有工具(最近的Fedora OS,最新版本的Mentor/Cadence/Synopsys仿真器)中,setenv()系統調用通過SystemVerilog DPI-C工作,但可能有一些較舊的* nix系統它不可用。我使用了「man 3 setenv」中給出的原型。看看其他StackOverflow論壇上的討論,似乎使用putenv()不是一個好主意,尤其是來自DPI,您不知道DPI字符串參數使用的內存會發生什麼情況。 setenv()創建了它的參數字符串的副本,並且不應該面臨這個問題的風險。

在我看來,如果你的工具流程不正確你想讓你的方式傳播環境變量,那麼你就比我的大問題,如何亂用從的SystemVerilog ENV。我特別選擇不將環境修改功能添加到svlib實用程序庫中,這正是因爲使用環境是在SV仿真內交流信息的一種非常糟糕的方式。我想如果你需要爲一些外部程序設置一個環境,那麼你就可以使用SV $ system()調用來調用它。

+0

感謝您的幫助。我同意。這是一種解決方法。我的導師說他正在解決問題,但同時我想繼續我的項目。 –

0

從SV設置環境變量是不是非常有用。

如果你想獲得的環境變量,你可以使用Verilab's svlib功能:

function automatic string sys_getEnv(string envVar); 
function automatic bit sys_hasEnv(string envVar);