1的方法。PLI函数介绍VerilogPLI(ProgrammingLanguageInterface)是Verilog代码调用C/C++函数的一种机制。它允许Verilog像调用一些系统调用(如$display/$stop/$random)一样调用用户编写的C/C++函数,这样我们就可以使用C/C++语言启动自己的系统任务/函数,实现使用verilog不太方便的功能和与外界的连接。PLI可以完成以下功能:功耗分析代码覆盖工具修改Verilog仿真数据结构(比如修改为更精确的延时,即sdf反标记)自定义输出显示协同仿真设计调试功能仿真分析加速仿真C模型接口Testbench建模VerilogPLI提供了一些任务函数集(TF例程)用于访问Verilog内部数据结构:大部分以tf_开头,主要用于一些用户自定义的系统任务和函数变量的操作,工具函数(例如设置回调函数和将数据写入输出)访问程序集(ACC例程):第二代PLI。全部以acc_开头。提供对SV结构的面向对象访问。主要用于访问和修改比延迟值、逻辑值部分重复的信息。ACC例程和TF例程。验证过程接口组件(VPI例程):第三代PLI。大多数以vpi_开头。提供对SV结构、行为、断言、覆盖对象的面向对象访问。它包含了TF和ACC例程的所有功能。2、自定义任务/函数命名规则如下:第一个字符必须是$,其余字符可以是字母、数字、下划线或$。区分大小写的名称可以是任意长度。3.用户自定义任务/函数参数示例:$get_vector("test_vector.pat",input_bus);PLI程序可以使用一组PLI例程来读取/写入这些参数4.任务/函数用户定义的任务可以在任何可以使用SV任务的地方使用使用,并且可以返回该值。长度由用户提供的sizetf决定。5、用户提供的PLI应用程序等C函数不是独立的C程序,而是链接到工具中。当调用任务/函数时,它们可能被调用6.PLI包含文件定义常量结构数据这些文件是vpi_user.hsv_vpi_user.h7。NCExampleFilestest.vmodule测试;电线a,b,c;初始开始$module_info;端管p1(a,b,c);//stimuli//monitorresponseendmodulepipe.vmodulepipe(out,in,clk);输出;注册;输入,clk;总是@(in)@(posedgeclk)out<=repeat(2)@(posedgeclk)in;endmodulemod_info.c#include#include"vpi_user.h"#include"vpi_user_cds.h"voidmodule_info(){vpiHandlemoditH,topmodH;moditH=vpi_iterate(vpiModule,NULL);if(!moditH){vpi_printf("错误:设计中没有模块n\n");}while(topmodH=vpi_scan(moditH)){vpi_printf("顶级模块全名:%s\n",vpi_get_str(vpiFullName,topmodH));vpi_printf("顶级模块名称:%s\n",vpi_get_str(vpiName,topmodH));}}voidregister_my_systfs(){s_vpi_systf_datatask_data_s;p_vpi_systf_datatask_data_p=&task_data_s;task_data_p->type=vpiSysTask;task_data_p->tfint="$module_infof_=>task(*)())module_info;task_data_p->compiletf=0;vpi_register_systf(task_data_p);}pli.map$module_infocall=module_infovpi_user.c#include#include"vpi_user.h"#include"vpi_user_cds.h"externvoidregister_my_systfs();void(*vlog_startup_routines[VPI_MAXARRAY])()={register_my_systfs,0/***finalentrymustbe0***/};RUN在NC上运行有三种方法,但第一种方法失败:1.使用irunUtilityiruntest.vpipe.vmodule_info.c-loadvpi:module_info在运行期间不会找到$module_info。2.使用PLI/VPIMapFileplimap文件见上iruntest.vpipe.vmod_info.c-plimapfilepli.map-gui在运行时加载-plimapfile或iruntest.vpipe.vmod_info.c-afilepli.map-gui当可以加载elab时。方法3:将C函数与具有C函数的新系统任务相关联以注册您的VPI程序初始化s_vpi_systf_data结构调用vpi_register_systf()以向模拟器提供已注册函数的名称typedefstructt_vpi_systf_data{inttype;int系统函数类型;字符*tfname;int(*calltf)();int(*compiletf)();整数(*sizetf)();char*user_data;}s_vpi_systf_data,*p_vpi_systf_data;运行命令如下:gcc-fPIC-c-ovpi_user.ovpi_user.cmod_info.c-I${IES_HOME}/tools/include-I${IES_HOME}/tools/inca/includegcc-shared-fPIC-olibvpi.sovpi_user.oirun-ctest.vpipe.virun-64bit-Rtools会自动加载libvpi.so或gcc-fPIC-shared-olibmyvpi.sovpi_user.cmod_info.c-I${IES_HOME}/tools/include-I${IES_HOME}/tools/inca/includencvlogtest.vpipe.vncelab-access+rwtest-loadvpilibmyvpi:register_my_systfsncsimtest-输入对于PLI,使用-sv_lib不起作用gcc-fPIC-shared-olibmyvpi.sovpi_user.cmod_info.c-I${IES_HOME}/tools/include-I${IES_HOME}/tools/inca/includeirun-ctest.vpipe.virun-R-64bit-sv_liblibmyvpi.so会报错:irun(64):15.10-s020:(c)Copyright1995-2016CadenceDesignSystems,Inc.加载快照worklib.test:v.......完成$module_info;|ncsim:*E,MSSYSTF(./test.v,5|17):用户定义的系统任务或功能($module_info)在详细说明期间注册并在模拟中使用,但在模拟期间尚未注册。注:由于第7部分引用了Cadence软件中的图例,该部分版权归Cadence所有