2013-02-22 13 views
5

Verilog'da bir ortam değişkenini nasıl okuyabilirim? BenVerilog/System Verilog'da bir ortam değişkenini nasıl okuyabilirim?

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

$ PATH başarmaya çalışıyorum

(bir VCS simülatörde Running) bir ortam değişkendir.

+2

Yaygın bir çözüm geçerli dizine gerekli dosyayı kopyalamak için ve sadece '$ fopen ("FileName"," r "); '. Çalışan simülasyonlar genellikle bir betiğin parçasıdır, bu yüzden bu betikte bir adım daha olacaktır. – toolic

cevap

12

Ortam almak için SystemVerilog DPI uygulamasını kullanabilirsiniz. Ve getenv her POSIX platformu için standart bir C kütüphanesi olduğundan, tekrar işlev tanımı için kendi getenv() eşdeğer fonksiyonunuzu uygulamanıza gerek yoktur.

Örnek kod SV'de.

vcs -sverilog dpi.v 

O

env = /home/user/FileName 

Ve orijinal soruya bir daha konuyu gösterecektir

ncverilog -sv dpi.v 

veya

Running

import "DPI-C" function string getenv(input string env_name); 

module top; 

    initial begin 
    $write("env = %s\n", {getenv("HOME"), "/FileName"}); 
    end 
endmodule 

, YOL yürütülebilir arama yolu için bir ortamdır ve ile birleştirmek ":" karakteri. Burada bir örnek olmalı, gerçekten "PATH" ortamı değil. Aksi takdirde, fopen dosya adınız "/bin:/usr/bin:/usr/local/bin/FileName" olabilir, bu yanlıştır.

+0

Yazım hatası bildirdiğiniz için teşekkür ederiz. – jclin

2

Bir ortam değişkenini okumak için basit bir PLI uygulaması kullanabilirsiniz. Aşağıda örnek bir hata kontrolleri olmadan var:

#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 dokümantasyon simülatör içine bu bağlantı nasıl açıklamalıdır.

+0

Bu, DPI kullanılarak çok daha basit. Diğer cevabı gör. –

0

Icarus'u ile kullanmak

$(SIM) -DPATH_FILENAME=\"$PATH/FileName\" blah.v ...

ikame edilmesi Sonra Makefile'ı/kabuk Belirlenmesi değeri simülatörü çağırmak Verilog önişlemci

File = $fopen(`PATH_FILENAME, "r"); 

kullanımı çoğu zaman basit 'iverilog sık sık, vsim ve arkadaşlar muhtemelen benzer destekler.

Önişlemci, değişmez bir değerin içinde yer almayacağı için, tırnaklar, değiştirilen değere dahil edilmeleri için kaçtı. Mesela bu kombinasyon çalışmaz:

File = $fopen("`PATH_FILENAME", "r"); 

...

`$(SIM) -DPATH_FILENAME=$PATH/FileName blah.v ...` 
İlgili konular