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.
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.
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
Runningimport "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.
Yazım hatası bildirdiğiniz için teşekkür ederiz. – jclin
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.
Bu, DPI kullanılarak çok daha basit. Diğer cevabı gör. –
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 ...`
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