Chapter 1
-
PLI:为verilog的终端用户提供一种用C语言(同时好像应该也有PLI library中的函数?)编写设计验证任务的方法,并用verilog logic simulators来执行这些C程序(其实就是在tb中执行?)
-
用途之一:
-
PLI application:是一个能够被verilog simulator执行的用户自定义的C语言应用
-
创建一个PLI application的步骤:(1.4)
步骤解读 -
PLI application和VPI routines的关系:PLI 标准中提供的VPI routines library用于编写PLI applications
-
register和structure的关系:注册信息包含在结构体中
1.3 系统任务和系统函数(2.2中也有一些详细说明)
-
系统任务:类似于编程语句,只能用于 initial/always procedure/verilog HDL task/HDL function,当系统任务被调用,仿真器执行该任务的功能;任务结束,仿真回到调用的任务的下一个语句
-
系统函数:类似于有返回值的编程函数,返回值传递给仿真;可在逻辑值可用时随处调用;可能在initial/always/HDL task/HDL function/assign/复合表达式的操作中调用;返回值类型可以int、向量、浮点
-
定义形式:
(1)IEEE标准内置:如display、random、finish等(Verilog language)
(2)仿真器特定的系统函数/任务(其实也算内置的)
(3)用户通过PLI自定义系统函数/任务的名字和功能 -
用户自定义的系统任务/系统函数会链接到一个自定义的C函数,当verilog仿真器遇到该系统函数的名字时,他将会执行与其链接的C函数, 所以也就是verilog中的系统函数的名字跟C函数名字可能不是一样的,但是存在一种链接的对应关系。(?)
-
自定义的可以和内置的取一样的名字,并以新功能覆盖内置函数
1.5 $show_value(system task)
- 用于:在verilog仿真中用PLI允许C routine来读取当下的逻辑值
- 需要参数:verilog design中的net/reg的名字
- 说明:calltf routine将会用VPI routines的Library来读取当下的net/reg的逻辑值,然后将其名字和逻辑值输出到仿真器的输出屏幕
- 应用举例:
1: compiletf routine:用于提供一个C routine来验证该系统任务是否被正确使用且拥有正确类型的参数(C函数+VPI函数)
2: calltf routine:是一个在仿真过程中如果遇到show_value系统任务时将会执行的C函数(C函数+VPI函数)
3: 注册show value PLI application:用于告知仿真器PLI application(C函数+VPI函数)
4: testcase:verilog 其中包含$show_value系统任务,并包含在initial中。(Verilog)
5: 输出:在仿真器输出执行show value系统任务的结果,获取到了某些位置的逻辑值。 - 该应用说明了参数如何从verilog仿真传递到PLI application以及application如何访问这些参数的信息,更多的举例在Chapter 3
Chapter 2 Interfacing VPI Applications to Verilog Simulators
2.1 PLI terms
- C 程序:包含C main 函数
- C 函数:不包含C main 函数
- Verilog function:只能被verilog source code调用
- 用户自定义的系统任务/函数:用于verilog source code;当仿真过程中遇到用户自定义的系统任务/函数时,仿真器将会执行与该系统任务/函数链接的PLI routines
- PLI applications:一个用户自定义的系统函数/任务和与其相链接的一个或多个PLI routines
- PLI routine:PLI application中的一部分的一个C 函数;当仿真遇到系统任务时被仿真器执行;VPI routine包括calltf、compilef、sizetf、simulation callback routines
- PLI library:Verilog PLI 标准中定义的C函数库;PLI library 函数被PLI routines调用,并使PLI routines与仿真交互;包括VPI/TF/ACC library
- VPI routines /TF routines /ACC routines:包含在PLI library中的C函数
2.3 Instantiated Verilog designs
P32
2.4 How PLI applications work
routine & system task/function
- VPI 部分定义了不同类型的routines,包括calltf/compiletf/sizetf/simualtion callback
- routine的种类决定了仿真器在何时执行routine:
一些routine是run-time的,在仿真过程中调用;一些是elaboration or linking time的,在仿真之前调用 - 一个系统函数/任务可以用多个PLI routines与之相链接,每个routine是不同类型
- calltf/compiletf/sizetf可以和系统函数/任务相链接;callback routine不是直接和系统函数/任务相链接,相反,他是为仿真过程中出现的不同类型的活动时调用,例如逻辑值改变/开始或完成仿真
PLI 数据类型
- VPI 库定义了固定宽度的数据类型,因为C语言中只保证了数据类型的最小宽度,数据在不同电脑和操作系统上会出现不同的宽度,为保证所有操作系统的通用性,VPI 库定义特殊的数据类型
- 数据类型定义包含在vpi_user.h 头文件中
- PLI application应该使用PLI 定义的数据类型来保证在操作系统上能够正确的工作
calltf routines
- 仿真过程中执行
compiletf routines
- 仿真开始之前执行,simulation time 0之前
- 目的是验证系统函数/任务是否被正确应用,如调用PLI application是否拥有正确数量的参数,以及这些参数数据类型是否正确
- 在仿真加载和准备仿真数据结构时,被仿真器的compiler/elaborater调用
- 每次执行用户自定义的系统任务/函数时将会被调用
- 只适用于语法正确性的检查,不能用来检查仿真过程中的任务如打开文件等,可用callback来代替实现
- 用于访问系统任务/函数的参数//使用vpi register cb注册callback routine用于elaborate/linking的结尾或仿真的开始
sizetf routine
- 仿真之前运行,只运行一次
- 用于注册为sysfunctype为vpisizefunc/vpisizesignedfunc的系统函数,通知编译器返回给系统函数的尺寸
- 返回给仿真器系统函数的返回值的位宽数目,第一次调用的返回值将会决定所有实例系统函数的返回值的宽度
- 有一定的局限性:调用的时间较早,verilog层次结构可能还没生成;只调用一次
- 只有这个routine关注返回值,其他几个都不用到返回值,返回值都会被仿真器忽略掉
callback
见chapter 6
Interfacing PLI applications to Verilog simulators
- PLI application包括系统任务/系统函数的名字+routine
- 完成上述以后PLI application需要连接到verilog仿真器,标准提供了接口机制来使系统任务和application routine相链接,包括TF ACC VPI三种机制。
- VPI接口机制包含三个步骤:
1 创建注册函数
2 通知仿真器注册函数
3 链接application到仿真器 - 其中,VPI 接口部分需要确认:
1 一个系统函数/任务的名字
2 application的类型:task/sizedfunction/intfunction/timefunction/realfunction
3 如果routine存在,需要一个指向routine的C函数的指针
4 一个user data pointer value,每次routine被调用仿真器将会作为C function的input传递给他们,userdata是一个指针,能够指向一个application-allocated data的block(???)
//application信息被指定在一个 s vpi systf data 结构中,该structure包含在vpi user. file中
register的步骤
上述参数与structure中的参数对应,但是为什么名字不一样?:tf data应该是注册函数的名字
s cb data / s vpi time是啥
- 一旦注册函数被定义,必须通知Verilog模拟器的注册函数名称,这使simulator可以调用函数和注册PLI应用程序。
- 通知可以用到vlog_startup_routines这个array,这个数组不能和PLI application位于同一个C source 文件中(?)
- 注册函数在仿真之前执行,可能仿真数据结构还没有完成创建
- 注册函数通常和PLI application C 函数位于同一个文件中(?)
Chapter 6 VPI Callback
6.1Overview
- 用户可以编写能够被verilog仿真器调用的C语言函数,这种调用在VPI标准中被称作PLI应用的回调机制,即 callback routines
- callback机制可以用于在routines之间分享数据;仿真行为发生;特定的仿真时间;逻辑值发生变化;程序执行语句
- VPI提供了两种callback routines: system task/function callback routines & simulation callback routines,两种类型都需要被registered with simulator
6.8 Simulation events-related callbacks
- VPI simulation event calback constant:cbValueChange
- register simulation:s_cb_data
set: reason→one of constants;** cb_rtn→PLI routine的名字; obj**→handle?;time→指定一个s_vpi_time structure的指针,其类型决定了仿真时间传递到回调机制的时间类型;value→指定一个s_vpi_value structure的指针,有很多format constants - 当simulator出现事件回调时,simulator将分配一个s_cb_data结构,将结构的指针作为输入传递给被调用的PLI routine。
- example:P238(看不懂)
Chapter 17 VCL(value change link)by ACC
17.1 Overview
- VCL routines 能够在无论何时一个特定的object的逻辑值或strength value改变时被调用,这种被调用的application为VCL consumer routine
- 功能:1.图形/波形展示,被选择的信号的变化可以被记录下来并通过波形展示;2.检测设计测试向量覆盖率,可监测所有关键信号并记录每一个信号的逻辑值变化的次数,并可生成报告记录;3.创建一个C语言模型的接口,将逻辑值的改变传递给C model(?)
- 关键步骤:
- 一个应用VCL的例子
目的:用VCL读取逻辑值变化,当时钟信号改变时调用C函数,实现计数器功能。
大概思路:写一个counter_moniotor的基础C函数程序代码(包含acc的所需参数和配置等等)、计数器的verilog testbench(其中包含$counter_monitor)→运行tb实现能够在时钟信号改变时调用counter函数→完善计数器的全部C函数代码→将该计数器与仿真器链接(因仿真器类型而异)。