Procedurální rozhraní Verilog - Verilog Procedural Interface
The Procedurální rozhraní Verilog (VPI), původně známý jako PLI 2.0, je rozhraní primárně určené pro C programovací jazyk. Umožňuje chování Verilog kód pro vyvolání funkcí C a funkce C pro vyvolání standardních systémových úkolů Verilog. Procedurální rozhraní Verilog je součástí IEEE 1364 Standard programovacího jazykového rozhraní; nejnovější vydání normy je z roku 2005. VPI se někdy také označuje jako PLI 2, protože nahrazuje zastaralé Programovací jazykové rozhraní (PLI).
Zatímco PLI 1 byl zastaralý ve prospěch VPI (aka. PLI 2), PLI 1 se stále běžně používá přes VPI kvůli jeho mnohem více dokumentovanému funkčnímu rozhraní tf_put, tf_get, které je popsáno v mnoha verilogových referenčních knihách.
Použití C ++
C ++ je integrovatelný s VPI (PLI 2.0) a PLI 1.0 pomocí klíčového slova „extern C / C ++“ zabudovaného do kompilátorů C ++.
Příklad
Jako příklad zvažte následující fragment kódu Verilog:
val = 41; $ přírůstek (val); $ display ("Po $ přírůstku, val =% d", val);
Předpokládejme přírůstek
systémová úloha zvýší svůj první parametr o jeden. Pomocí C a mechanismu VPI přírůstek
úkol lze implementovat následovně:
// Implementuje úlohu přírůstkového systémustatický int přírůstek(char *uživatelská data) { vpiHandle systfref, args_iter, argh; struktur t_vpi_value argval; int hodnota; // Získejte popisovač do seznamu argumentů systfref = vpi_handle(vpiSysTfCall, NULA); args_iter = vpi_iterate(vpiArgument, systfref); // Uchopte hodnotu prvního argumentu argh = vpi_scan(args_iter); argval.formát = vpiIntVal; vpi_get_value(argh, &argval); hodnota = argval.hodnota.celé číslo; vpi_printf("Rutina VPI přijala% d n", hodnota); // Zvýší hodnotu a vloží ji zpět jako první argument argval.hodnota.celé číslo = hodnota + 1; vpi_put_value(argh, &argval, NULA, vpiNoDelay); // Vyčištění a vrácení vpi_free_object(args_iter); vrátit se 0;}
Nezbytná je také funkce, která zaregistruje tento systémový úkol. Tato funkce je vyvolána před zpracováním nebo řešením odkazů, když je umístěna zvnějšku vlog_startup_routines []
pole.
// Zaregistruje úlohu přírůstkového systémuprázdnota register_increment() { s_vpi_systf_data data = {vpiSysTask, 0, „přírůstek $“, přírůstek, 0, 0, 0}; vpi_register_systf(&data);}// Obsahuje seznam funkcí s nulovým zakončením, které mají být vyvolány při spuštěníprázdnota (*vlog_startup_routines[])() = { register_increment, 0};
Kód C je kompilován do sdíleného objektu, který bude používán simulátorem Verilog. Simulace dříve zmíněného fragmentu Verilog nyní vyústí v následující výstup:
Rutina VPI obdržela 41 Po přírůstku $, val = 42
Viz také
Zdroje
Zdroje pro rozhraní Verilog VPI
- Šedozelená, pro C ++
- JOVE, pro Jáva
- Ruby-VPI, pro Rubín
- ScriptEDA, pro Perl, Krajta, Tcl
- Cocotb, pro Krajta
- OrigenSim, pro Rubín