2013-02-22 3 views
5

Как прочитать переменную окружения в Verilog? (Запуск на VCS тренажере)Как прочитать переменную окружения в Verilog/System Verilog?

Я пытаюсь выполнить

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

$ PATH является переменной окружения.

+2

Обычным решением является скопировать нужный файл в текущем каталоге и просто '$ Еореп («FileName»,» г ");'. Запуск моделирования обычно является частью скрипта, поэтому это будет всего лишь еще один шаг в скрипте. – toolic

ответ

12

Вы можете просто использовать 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", что неверно.

+0

Спасибо за указание опечатки. – jclin

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. См. Другой ответ. –

0

Часто бывает проще использовать 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 ...` 
Смежные вопросы