Verilog Procedural Interface

The Verilog Procedural Interface (VPI), originally known as PLI 2.0, is an interface primarily intended for the C programming language. It allows behavioral Verilog code to invoke C functions, and C functions to invoke standard Verilog system tasks. The Verilog Procedural Interface is part of the IEEE 1364 Programming Language Interface standard; the most recent edition of the standard is from 2005. VPI is sometimes also referred to as PLI 2, since it replaces the deprecated Program Language Interface (PLI).

While PLI 1 was deprecated in favor of VPI (aka. PLI 2), PLI 1 is still commonly used over VPI due to its much more widely documented tf_put, tf_get function interface that is described in many verilog reference books.

Use of C++
C++ is integrable with VPI (PLI 2.0) and PLI 1.0, by using the "extern C/C++" keyword built into C++ compilers.

Example
As an example, consider the following Verilog code fragment:

Suppose the  system task increments its first parameter by one. Using C and the VPI mechanism, the  task can be implemented as follows:

Also, a function that registers this system task is necessary. This function is invoked prior to elaboration or resolution of references when it is placed in the externally visible  array.

The C code is compiled into a shared object that will be used by the Verilog simulator. A simulation of the earlier mentioned Verilog fragment will now result in the following output:

VPI routine received 41 After $increment, val=42

Sources for Verilog VPI interface

 * Teal, for C++
 * JOVE, for Java
 * Ruby-VPI, for Ruby
 * ScriptEDA, for Perl, Python, Tcl
 * Cocotb, for Python
 * OrigenSim, for Ruby