Как прочитать переменную окружения в 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
является стандартной библиотекой C для каждой платформы POSIX, вам не нужно снова использовать свою эквивалентную функцию 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
Вы можете использовать простое приложение 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. См. Другой ответ. –
Часто бывает проще использовать Verilog препроцессора
File = $fopen(`PATH_FILENAME, "r");
Затем вызовите имитатор из вашего Makefile сценария/оболочек значения указывающего, необходимо заменить
$(SIM) -DPATH_FILENAME=\"$PATH/FileName\" blah.v ...
Я использую это с Икаром 'iverilog
часто, vsim
и друзья, вероятно, поддерживают похожие.
Котировки экранированы так, что они включены в замещенное значение, так как препроцессор не будет заменять внутри буквального значения. Например, эта комбинация делает не работает:
File = $fopen("`PATH_FILENAME", "r");
...
`$(SIM) -DPATH_FILENAME=$PATH/FileName blah.v ...`
Обычным решением является скопировать нужный файл в текущем каталоге и просто '$ Еореп («FileName»,» г ");'. Запуск моделирования обычно является частью скрипта, поэтому это будет всего лишь еще один шаг в скрипте. – toolic