2013-02-22 179 views
5

如何在Verilog中讀取環境變量? (在VCS模擬器運行)如何在Verilog/System Verilog中讀取環境變量?

我試圖完成

File=$fopen("$PATH/FileName","r"); 

$ PATH是一個環境變量。

+2

常見的解決方案是將所需文件複製到當前目錄,只是'$的fopen(「文件名」,」 R「);'。運行模擬通常是腳本的一部分,因此這只是腳本中的一個步驟。 – toolic 2013-02-25 16:19:18

回答

12

您可以簡單地使用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",這是錯誤的。

+0

感謝您指出錯字。 – jclin 2016-08-16 01:25:09

2

您可以使用簡單的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文檔應解釋如何把這個鏈接進入模擬器。

+0

使用DPI這非常簡單。見另一個答案。 – 2013-02-27 13:31:36

0

它往往是簡單的使用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 ...`