小姜的Verilog PLI Handbook学习笔记

2023-11-10 20:10

本文主要是介绍小姜的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函数代码→将该计数器与仿真器链接(因仿真器类型而异)。

这篇关于小姜的Verilog PLI Handbook学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/384954

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件