本文说的PLI,特指PLI 2, VPI。DPI是SV标准中组成,而DirectC和TLI是VCS中的功能组件。
关于PLI的文献只有Verilog PLI Handbook这本书。并且Verilog PLI是一本相对成熟的技术。PLI有三个libraries, TF(task/function) interface, ACC(access) interface, 以及VPI(Verilog Procedural Interface),连同DPI,四者的时间先后顺序是1985-1989-1995-2003。而前面两个已经在IEEE 1364-2005(IEEE 1364就是verilog std)中被删除。所以重要的就是VPI和DPI。
part 1 VPI
Handbook一书中part 1的7章介绍了VPI的构建及应用。
1. 创建VPI应用。共分为四步($hello system task为例)。
先是在Verilog module中引用,即调用$hello()或者$hello;
》》然后是编写一个calltf routine for $hello,这个routine 是VPI和C mixed,其中需要include "vpi_user.h"包含VPI的数据结构,也可以调用C std libraries 来使用C语言的相应函数。
》》注册编写的VPI 函数,因为是calltf routine,调用s_vpi_systf_data(s_vpi_systf_data,以s_开头的为struct结构体,以t_开头的表示数据类型,以p_开头的表示指针指向struct结构体)结构,并做好相应的注册。
》》Compiling and linking $hello system task。
2a. VPI的分类
calltf routines, ---The calltf routine is executed when simulation is running
compiletf routines, --- The compiletf routine should only be used for syntax checking, routine called before simulation time 0
sizetf的作用:The intent of the sizetf routine is to notify the simulator compiler or elaborator of the return size for system functions
注: even if a system function used multiple times in verilog code, sizetf routine is only called once.
simulation callback routines
} s_cb_data, *p_cb_data;
t_cb_data中包含了PLI_INT32 reason来提供PLI 回调的原因。
关于reason共分为五个部分,simulation related, time related, action related, added in 2001以及added in 2005。
在2005版的vpi_user.h中共有32种原因。
2b Special data types
PLI_INT32, PLI_UINT32, PLI_INT16, PLI_UINT16, PLI_BYTE8, PLI_UBYTE8
typedef unsigned char PLI_UBYTE8;
--from vpi_user.h
2c. 例子 $pow
A sizetf routine to establish the return size of $pow.
其中,simulation callback routine只是演示作用。
由于sizetf, compiletf, 和calltf三者之间的相互关系,它们也是一起被声明在同一结构(s_vpi_systf_data tf_data;)之中。
// PLI_INT32 sysfunctype; /* vpiSysTask, vpi[Int,Real,Time,Sized, SizedSigned]Func */
#define vpiSysFuncType vpiFuncType
#define vpiSysFuncSized vpiSizedFunc
vpi_register_systf(&tf_data);
而callback 则是单开一边。
vpiHandle callback_handle;
vpi_free_object(callback_handle); /* don’t need callback handle */
3a. VPI library
The VPI library can be divided into five basic groups of routines
3b. three relationships, one-to-one, one-to-many, many-to-one
vpi_handle(), --- one-to-one
vpi_iterate(), vpi_scan(), --- for one-to-many
and vpi_handle_multi (). --- for many-to-one
the VPI library refers to intermodule paths as a many-to-one relationship.
这里的intermodule path既可以像hardware那样考虑delay,也可以不用。但都是many-to-one relationship
4. VPI object diagram
更为详细介绍了VPI可以操作的变量类型。
尽管VPI操作复杂,但是可以对Verilog 嵌入更多的操作,如果是引入sv_vpi_user.h,也可以对更多的sv objects进行操作。
reference:
PLI vs DPI
http://www.sutherland-hdl.com/papers/2004-SNUG-presentation_Verilog_PLI_versus_SystemVerilog_DPI.pdf
http://1sutherland.com/papers/2004-SNUG-paper_Verilog_PLI_versus_SystemVerilog_DPI.pdf
由于是04年的文章,其中提及了plan中的05年Verilog HDL std已经将PLI 1.0 deprecate,而后来的标准也确实如此。
所以,paper的结尾也是改为“the PLI 1.0 is dead...long live PLI VPI and the SystemVerilog DPI!”
注:
$stop and $finish区别
stop会halt simulator,进入interactive mode。而finish,表示仿真结束,直接退出。