如何在Verilog中讀取環境變量? (在VCS模擬器運行)如何在Verilog/System Verilog中讀取環境變量?
我試圖完成
File=$fopen("$PATH/FileName","r");
$ PATH是一個環境變量。
如何在Verilog中讀取環境變量? (在VCS模擬器運行)如何在Verilog/System Verilog中讀取環境變量?
我試圖完成
File=$fopen("$PATH/FileName","r");
$ PATH是一個環境變量。
您可以簡單地使用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"
,這是錯誤的。
感謝您指出錯字。 – jclin 2016-08-16 01:25:09
您可以使用簡單的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文檔應解釋如何把這個鏈接進入模擬器。
使用DPI這非常簡單。見另一個答案。 – 2013-02-27 13:31:36
它往往是簡單的使用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 ...`
常見的解決方案是將所需文件複製到當前目錄,只是'$的fopen(「文件名」,」 R「);'。運行模擬通常是腳本的一部分,因此這只是腳本中的一個步驟。 – toolic 2013-02-25 16:19:18