小姜的Verilog PLI Handbook学习笔记

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中也有一些详细说明)

  1. 系统任务:类似于编程语句,只能用于 initial/always procedure/verilog HDL task/HDL function,当系统任务被调用,仿真器执行该任务的功能;任务结束,仿真回到调用的任务的下一个语句
    在这里插入图片描述

  2. 系统函数:类似于有返回值的编程函数,返回值传递给仿真;可在逻辑值可用时随处调用;可能在initial/always/HDL task/HDL function/assign/复合表达式的操作中调用;返回值类型可以int、向量、浮点
    在这里插入图片描述
    在这里插入图片描述

  3. 定义形式:
    (1)IEEE标准内置:如display、random、finish等(Verilog language)
    (2)仿真器特定的系统函数/任务(其实也算内置的)
    (3)用户通过PLI自定义系统函数/任务的名字和功能

  4. 用户自定义的系统任务/系统函数会链接到一个自定义的C函数,当verilog仿真器遇到该系统函数的名字时,他将会执行与其链接的C函数, 所以也就是verilog中的系统函数的名字跟C函数名字可能不是一样的,但是存在一种链接的对应关系。(?)

  5. 自定义的可以和内置的取一样的名字,并以新功能覆盖内置函数

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
    structure

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函数代码→将该计数器与仿真器链接(因仿真器类型而异)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值