《《编程语言接口》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《编程语言接口》PPT课件.ppt(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、EDA技术与技术与Verilog HDL语言语言第十三章 编程语言接口(PLI)Page 2概述概述Verilog语言提供了一组标准的系统任务和函数C。在设计时,经常会遇到一些特殊的情况,需要通过定义自己的系统任务和函数才能实现设计目标。为了做到这一点,设计者需要与表示设计的内部数据结构以及Verilog仿真器的仿真环境进行交互。编程语言接口(PLI)提供了一组接口子程序,用于访问(读/写)内部的数据表示,并可以提取仿真环境信息。用户自定义的系统任务和函数可以通过这组预定义的PLI接口子程序来创建。Verilog PLI的发展经历了三代。1任务/函数(tf_)子程序(又称实用子程序)组成了第一
2、代PLI。这些子程序主要用于以下几类操作:用户自定义的任务和函数、实用函数、回调机制和把数据写到输出设备。2存取(acc_)子程序组成了第二代PLI。这些子程序可直接在Verilog HDL内部数据结构中进行面向对象的数据存取。这些子程序能用于访问和修改Verilog HDL描述的多种对象。3Verilog过程接口(vpi_)子程序组成了第三代PLI。这些子程序是acc_和tf_子程序功能扩展的集合。Page 3本章学习目标本章学习目标解释在解释在Verilog仿真中如何使用仿真中如何使用PLI子程序。子程序。描述描述PLI的用途。的用途。定义用户自定义系统任务和函数以及用户自定义定义用户自定
3、义系统任务和函数以及用户自定义C子程序。子程序。理解用户自定义系统任务的连接和调用。理解用户自定义系统任务的连接和调用。从概念上解释在从概念上解释在Verilog仿真器内部如何表示仿真器内部如何表示PLI。区别并描述怎样使用两类区别并描述怎样使用两类PLI库子程序:库子程序:access子程序和子程序和utility子程序。子程序。学习如何创建用户自定义系统任务和函数,并学习如何在仿真中使用它们学习如何创建用户自定义系统任务和函数,并学习如何在仿真中使用它们。Page 4使用使用PLI子程序的规范仿真流程子程序的规范仿真流程设计者使用标准Verilog结构和系统任务来描述设计和激励。此外,也可
4、以在设计和激励中调用用户自定义系统任务。设计和激励文件经过编译被转换成表示设计的内部格式。这种内部数据结构通常采用Verilog仿真器特定的专利格式,对设计者是不公开的,因此他们无法理解。接着这一内部数据结构被用于运行实际的仿真并产生输出。用户自定义系统任务都被连接到一个用户自定义C子程序。该C子程序以PLI接口子程序标准库的方式实现,它可以存取表示设计的内部数据结构。标准C子程序可以用C编译器编译。标准PLI库由Verilog仿真器提供。Page 513.1 PLI的使用的使用由于PLI允许用户自己定义实用工具来存取(读、写或修改)表示设计的内部数据结构,因此它具有强大的能力,可以对Veri
5、log语言的功能进行扩展。PLI具有很多种用途,如下所示:1.PLI可用于定义其他系统任务和函数。典型的例子有监控任务、激励任务、调试任务和复杂操作等,这些任务和操作难以用标准的Verilog结构实现。2.一些应用软件,比如翻译器和延迟计算工具,可以用PLI编写。3.PLI可用于提取设计信息,比如层次、互连、扇出及特定类型逻辑元件的数目等。4.PLI可用于编写专用或自定义的输出显示子程序。波形观察器可用它生成波形、逻辑互连、源代码浏览器和层次信息。5.为仿真提供激励的子程序也可以用PLI编写。激励可以自动生成或者从其他形式的激励转换而来。6.普通的基于Verilog的应用软件可以用PLI子程序
6、编写。这种软件可以与任何Verilog仿真器一起工作,因为PLI接口提供了统一的存取方式。Page 613.2 PLI任务的连接和调用任务的连接和调用设计者可以通过使用PLI库子程序来编写自定义的系统任务。然而,Verilog仿真器必须知道用户自定义系统任务和相应的用户自定义C函数的存在。这是通过把用户自定义系统任务连接到Verilog仿真器来实现的。为了理解这个过程,以一个简单的系统任务$hello_verilog为例进行说明。当$hello_verilog这个任务被调用时,它只是简单地输出一条消息“Hello Verilog World”。首先,实现该任务的C子程序必须用PLI库子程序定义
7、。文件hello_verilog.c中的子程序hello_verilog如下所示:io_printf是PLI库子程序,其功能类似于printf。Page 713.2.1 PLI任务的连接任务的连接在Verilog代码中,任务$hello_verilog无论什么时候被调用,C子程序hello_verilog都必须执行。仿真器需要意识到存在一个名为$hello_verilog的新系统任务,并且该仿真器要连接到C子程序hello_verilog。这一过程称为把PLI子程序连接到Verilog仿真器。不同的仿真器提供不同的方法来连接PLI子程序。虽然各种仿真器的连接方法不尽相同,但是连接过程的基本原理
8、仍然是相同的。有关细节可参考仿真器的参考手册。在连接阶段的最后,生成了一个包含$hello_verilog新系统任务的特殊的二进制可执行文件。例如,连接生成了一个新的二进制可执行文件,设文件名为hverilog,这已不是惯用的运行仿真器的二进制可执行文件。仿真时,不要运行惯用的仿真器可执行文件(如Verilog-XL),只需要运行hverilog就可以了。Page 813.2.2 PLI任务的调用任务的调用一旦用户自定义任务被连接到Verilog仿真器中,它就能像任何其他Verilog系统任务那样,通过关键字$hello_verilog来调用。文件hello.v中定义了一个名为hello_to
9、p的Verilog模块,该模块调用了用户自定义任务$hello_verilog,如下所示:输出结果:Page 913.2.3 添加和调用添加和调用PLI任务的典型流程任务的典型流程Page 1013.3 内部数据表示内部数据表示在我们理解怎样使用PLI库子程序之前,首先需要理解在仿真器内部设计是如何表述的。每个模块被看做一组对象类型。对象类型是Verilog中定义的元素,例如:模块实例、模块端口、模块的端到端路径以及模块之间的路径 顶层模块 原语实例和原语端口(terminal)线网类型(net)、寄存器类型(register)、参数类型(parameter和 specparam)整型、时间型
10、和实型变量 时序检查 命名事件 Page 1113.3 内部数据表示(续)内部数据表示(续)Page 1213.3 内部数据表示(续)内部数据表示(续)包括原语实例、原语实例端口(terminal)、模块端口和网络。其他对象类型在本模块中没有出现 Page 1313.4 PLI库子程序库子程序PLI库子程序提供了对表示设计的内部数据结构进行存取的标准接口。为定义用户自己的系统任务而编写的用户自定义C子程序是用PLI库子程序编写的。前面的例子中,$hello_verilog是用户自定义系统任务,hello_verilog是用户自定义C子程序,io_printf是PLI库子程序。PLI库子程序有两
11、大类:存取子程序和实用子程序。注意,vpi_子程序是存取子程序和实用子程序的扩展集合,未在本课程中讨论。Page 1413.4 PLI库子程序(续)库子程序(续)存取子程序提供了对内部数据结构访问的接口;它允许用户的C子程序遍历数据结构并提取与设计有关的信息。实用子程序主要用于在Verilog和编程语言的边界之间传送数据并做一些日常管理维护工作。Page 1513.4.1 存取子程序存取子程序存取子程序通常也称为acc子程序。存取子程序可以完成下列工作:1.从内部数据结构的有关项读取特定对象的信息 2.把特定对象的信息写入内部数据结构的有关项存取子程序可以读取设计中的对象信息。对象可以是下列类
12、型中的任何一种:1.模块实例、模块端口、模块的端到端路径以及模块之间的路径 2.顶层模块 3.原语实例和原语端口 4.网络类型(net)、寄存器类型(register)、参数类型(parameter和specparam)整型、时间型和实型变量 5.时序检查 6.命名事件Page 1613.4.1 存取子程序存取子程序 存取子程序的特征存取子程序的特征存取子程序总是以前缀acc_开头。使用存取子程序的用户自定义C子程序必须调用子程序acc_initialize(),以初始化环境。退出时,用户自定义子程序必须调用acc_close()。如果一个文件中用到存取子程序,那么必须包含头文件acc_use
13、r.h。所有存取子程序的数据类型和常量都预定义在文件acc_user.h中。存取子程序使用句柄的概念来访问对象。句柄是预定义的指向设计中特定对象的数据类型。获得对象句柄就能获得对象的所有信息。这与C语言编程中访问文件的句柄具有类似的概念。对象句柄标识符由关键字handle声明。Page 1713.4.1 存取子程序存取子程序 存取子程序的类型存取子程序的类型句柄子程序。它们将句柄返回给设计中的对象。句柄子程序的名字总是以前缀acc_handle_开头。后继子程序。它们将句柄返回给设计中特定类型对象集合中的下一个对象。后继子程序总是以前缀acc_next_开头,而且以引用的对象作为参数。值变链接
14、(VCL)子程序。这类子程序使用户的系统任务可以从监视对象值变化的对象列表中添加和删除对象。VCL子程序总是以前缀acc_vcl_开头,没有返回值。取值(fetch)子程序。它们能够提取各种对象信息,比如完整的层次路径名、相对名以及其他属性信息。取值子程序总是以前缀acc_fetch_开头。实用存取子程序。它们用于执行与存取子程序相关的杂项操作。例如,acc_initialize()和acc_close()都是实用子程序。修改子程序。它们可以修改内部数据结构。本书不讨论这类子程序。关于修改子程序的详细内容可参考IEEE Standard Verilog Hardware Description
15、 Language文档。Page 1813.4.1 存取子程序存取子程序 存取子程序例存取子程序例1例例1:获取模块端口列表:获取模块端口列表 写一个用户自定义系统任务$get_ports,用于寻找模块中的所有input,output和inout端口的完整层次名称,并且计算input,output和inout端口的数目。这个用户自定义系统任务在Verilog中以$get_ports(“”)的形式调用。文件get_ports.c中描述了实现任务$get_ports的用户自定义C子程序get_ports,如下例。Page 19Page 2013.4.1 存取子程序存取子程序 存取子程序例存取子程序
16、例1(续)(续)顶层模块:仿真输出:Page 2113.4.2 实用子程序实用子程序 实用子程序的特征实用子程序的特征 1.实用子程序总是以前缀tf_开头。2.如果一个文件中使用了实用子程序,必须包含头文件veriuser.h。实用子程序的类型实用子程序的类型 1.获取Verilog系统调用任务的信息 2.获取参数列表信息 3.获取参数值 4.把参数新值回传给调用它的系统任务 5.监视参数值的改变 6.获取仿真时间和被调度事件的信息 7.执行日常管理维护任务,例如保存工作区,保存任务指针 8.执行long类型的算术运算 9.显示信息 10.挂起、终止、保存和恢复仿真 Page 2213.4.2
17、 实用子程序(续)实用子程序(续)实用子程序举例实用子程序举例 目前只用到过一个实用子程序io_printf()。现在再来看一些在Verilog设计和用户自定义C子程序之间传输数据的实用子程序。Verilog提供了系统任务$stop和$finish,它们分别用于挂起和终止仿真。下面定义自己的系统任务$my_stop_finish,根据不同的参数值,它可以分别完成挂起和终止两项任务。用户自定义系统任务$my_stop_finish的完整说明如下表所示。Page 2313.4.2 实用子程序(续)实用子程序(续)程序源码:见书顶层模块:仿真输出:Page 2413.5 小结小结PLI接口提供了一组
18、C语言接口子程序来读出、写入和提取设计的内部数据结构信息。设计者可以编写自己的系统任务来完成各种实用功能。PLI接口可用于监视器、调试器、格式翻译器、延迟计算工具、自动激励生成器、转储文件生成器和其他实用工具。用户自定义系统任务由相应的用户自定义C子程序实现。C子程序调用PLI库函数。通知仿真器把一个新的用户自定义系统任务与相应的用户C子程序联系起来的过程称为连接。仿真器不同,连接的过程也不相同。用户自定义系统任务与标准的Verilog系统任务调用方式类似,例如$hello_verilog()的调用与标准的系统任务调用一致。该用户自定义系统任务启动时,相应的用户自定义C子程序hello_ver
19、ilog被执行。Page 2513.5 小结(续)小结(续)在Verilog仿真器中,用多个对象集合组成的一个庞大数据结构来表示设计。可以通过PLI库子程序来存取内部数据结构。存取子程序(acc)和实用子程序(tf)是两类PLI库子程序。实用子程序代表了第一代Verilog PLI。实用子程序用于在用户C子程序和原始Verilog设计之间来回传输数据。实用子程序以前缀tf_开头。实用子程序与对象处理互不影响。存取子程序代表了第二代Verilog PLI。存取子程序可以读写设计的特定对象的信息。存取子程序以前缀acc_开头。存取子程序主要用在用户C子程序和内部数据表示的接口上。存取子程序与对象处理相互影响。值变链接(VCL)是一类特殊的存取子程序,它们可以监视设计中的对象。当被监视的对象发生变化时,就执行最终用户子程序。Verilog过程接口(VPI)子程序代表了第三代Verilog PLI。VPI子程序扩展了acc_和tf_子程序的功能。VPI子程序不在本书的讨论范围之内。
限制150内