本文主要参考”The Verilog PLI Handbook(Second Edition)”, 权当读书笔记。主要针对VCS flow, 也许会穿插其他两大家工具的flow.


说在最前面

到今天为止,SV对C/Cpp的主要接口支持大多改用DPI, 也推荐使用DPI。或者直接使用UVM自带现成的DPI lib, 已经可以满足不少需求。然后类似C与汇编的关系,VPI更接近与底层Verilog与C的交互,可以很容易的取得各种仿真时的资源和状态。所以可以说因为迫不得已,有时候还得上VPI.


Hello World!

A “Hello, World!” program is traditionally used to introduce novice programmers to a programming language. —— [ wiki ]

让我们遵循传统,从hello world开始。
Hello world需要四步, 这里直接把原文例子搬运过来:

1. 定义系统task/function

第一步很简单, 起个名字,你希望在TB里怎么调用它?这里就叫$hello了:

module test;initial$hello();
endmodule

2. 实现系统task/function

看到“实现“两个字就知道这一步是核心。这一步主要完成的是Verilog里调用C的内容,因此也可以说是C的部分怎样去实现。另外,书中把这称之为calltf, 感觉这个tf是task/function的合体.下面给出具体实现:

#include <stdlib.h>
#include <stdio.h>
#include “vpi_user.h”
/* ANSI C standard library */
/* ANSI C standard input/output library */
/* IEEE 1364 PLI VPI routine library */
PLI_INT32 PLIbook_hello_calltf(PLI_BYTE8 *user_data)
{vpi_printf(“\nHello World!\n\n”);return(0);
}

首先值得一提的是vpi_user.h. 这个头文件里包含了vpi的各种数据结构体,参数类型,属性以及函数原型。这部分内容可以在IEEE 1800(SV标准)的附录里找到。可以说这是每一个vpi程序必备的头文件,EDA厂商据此实现API供用户使用,具体实现就内部保密了。正因为是自定义,御三家对这个文件具体处理是不一样的,比如synopsys就没有实现vpi_get_data()这个API,理由是他们觉得不会有很多人用。但是大体上说,三家都实现了绝大部分规定的VPI,以及自己还提供扩展的API.基于vpi_user.h的实现,一般可以认为是通用的。
第二点新鲜的是PLI_INT32与PLI_BYTE8,其实就是C里的int和char类型,这里认为int是32位而char是8位。
再往下看,vpi_printf()这个函数是第一个接触到的VPI函数,和C里的printf的用法是一致的。

3.注册系统task/function

说白了就是建立VPI和Verilog之间的关联,这样TB才知道调用哪个tf. 注册内容主要包括三个方面:

  • API类型:task还是function(熟悉Verilog的你知道这句话在说什么)
  • Verilog侧API名
  • VPI侧API名

可以看出,verilog侧完全可以不叫VPI那边的名字。
在VPI中注册信息包含在s_vpi_register_systf这个结构体中,vpi_register_systf()函数使用这个结构体去注册。注册的函数都保存在VPI侧一个叫vlog_startup_routines的数组里。下面以$hello为例:

void PLIbook_hello_register()
{s_vpi_systf_data tf_data;tf_data.type        = vpiSysTask;tf_data.sysfunctype = 0;tf_data.tfname      = "$hello";tf_data.calltf      = PLIbook_hello_calltf;tf_data.compiletf   = NULL;tf_data.sizetf      = NULL;tf_data.user_data   = NULL;vpi_register_systf(&tf_data);
}

以上是注册的细节,在实际操作中往往不用这么麻烦–其实至今没有实验出vcs走这个flow怎样才能走通。
vcs中通常使用的方法是pli.tab文件,在这个例子里很简单:

$hello call=PLIbook_hello_calltf

nc中有类似的文件plimap.


万事俱备, 开始编译:

vcs hello_test.v +vpi -P pli.tab hello_vpi.c -full64

运行simv输出

Hello World!

参考资料

[1]: Stuart Sutherland. The Verilog PLI Handbook(Second Edition), 2002

VPI step by step(1)相关推荐

  1. 【Step By Step】将Dotnet Core部署到Docker下

    一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core-使用.Net Core + Entity FrameWor ...

  2. python写一个通讯录step by step V3.0

    python写一个通讯录step by step V3.0 更新功能: 数据库进行数据存入和读取操作 字典配合函数调用实现switch功能 其他:函数.字典.模块调用 注意问题: 1.更优美的格式化输 ...

  3. C#2.0实例程序STEP BY STEP--实例二:数据类型

    C#2.0实例程序STEP BY STEP--实例二:数据类型 与其他.NET语言一样,C#支持Common Type Sysem(CTS),其中的数据类型集合不仅包含我们熟悉的基本类型,例如int, ...

  4. 文本分类step by step(二)

    (注:如有转载请标明作者:finallyliuyu, 和出处:博客园) <文本分类 step by step(一)> 在<文本分类step by step(一)>中,我们从处理 ...

  5. 数据库设计Step by Step (9)——ER-to-SQL转化

    2019独角兽企业重金招聘Python工程师标准>>> 引言:前文(数据库设计 Step by Step (8)--视图集成)讨论了如何把局部ER图集成为全局ER图.有了全局ER图后 ...

  6. ActionScript 3.0 Step By Step系列(五):走在面向对象开发的路上,以类为基础去思考编程问题...

    面向对象的程序设计(Object-Oriented Programming,简记为OOP)是一种功能非常强大的编程方法,立意于创建软件重用代码,以类为基础去思考编程问题. ActionScript 3 ...

  7. NHibernate Step by Step:序篇 (转)

    原文出处:http://www.cnblogs.com/abluedog/archive/2006/04/15/375676.html 原文作者:abluedog 很久以前,你可能习惯了connect ...

  8. Python 调试:step into/step out/step over 的区别

    Python 调试:step into/step out/step over 的区别: 首先在PyCharm 程序中设置 " 断点 ",后点击右上角的Debug 按钮进入调试程序状 ...

  9. Caffe使用step by step:caffe框架下的基本操作和分析

    Caffe使用step by step:caffe框架下的基本操作和分析 时间:2015-10-16 11:40:09      阅读:808      评论:0      收藏:0      [点我 ...

  10. 吴恩达深度学习课程deeplearning.ai课程作业:Class 4 Week 1 Convolutional Neural Networks: Step by Step

    吴恩达deeplearning.ai课程作业,自己写的答案. 补充说明: 1. 评论中总有人问为什么直接复制这些notebook运行不了?请不要直接复制粘贴,不可能运行通过的,这个只是notebook ...

最新文章

  1. CentOS 7 安装Boost 1.67及boost_python
  2. C#部分---函数添加基本格式;
  3. 汇编语言 利用ASCII以及AND OR进行字符串大小写转换
  4. matlab中m文件的作用,M文件主要包含()_matlab中m文件的好处
  5. pytorch forward_pytorch使用hook打印中间特征图、计算网络算力等
  6. c# 设计原则需要学习吗_向最好的学习:产品设计原则
  7. vue 响应式ui_如何在Vue.js中设置响应式UI搜索
  8. 【转】理解OAuth 2.0
  9. android一个工程的xml怎么引用另外一个工程的xml,如何在Android中使用XML引用库中另一个包的字符串?...
  10. 手机App都在偷听我说话?窃听疑云全球密布,科技公司连连喊冤
  11. 节奏大师闪退android,安卓节奏大师进不去的原因以及详细解决办法
  12. C# sqlhelper
  13. 浅析Marshmallow在flask中的应用
  14. 十二星座匹配对象_快来看看,准爆了的十二星座恋情分析表
  15. 智能空气净化器解决方案,飞睿科技无线WiFi芯片模块技术应用
  16. 人过三十,能不能成大事?看这10个细节足够,听话听音看人看小
  17. 纯css更改图片颜色的技巧
  18. 群晖docker搭建印象笔记_群晖docker安装蚂蚁笔记安装教程
  19. Oracle存储过程中loop、for循环的用法
  20. ArcGIS平滑处理

热门文章

  1. 押注混合云和人工智能,分拆后的IBM能成功吗?
  2. 建立管道大数据的可行性分析
  3. SysFader: iexplore.exe 应用程序错误的最终解决方案
  4. 广东省计算机等级考试一级试题(1),全国计算机等级考试一级B模拟试题及答案(1)...
  5. 免费分享一套开源充电桩物联网云平台(含硬件充电桩)(v2.3.2)
  6. 2021年山东省安全员C证考试内容及山东省安全员C证新版试题
  7. 机器学习:关于P-R曲线和Roc曲线
  8. 做副业月薪10K+,工作效率翻倍!Python是个什么宝藏?
  9. JAVA SE、JAVA EE、JAVA ME区别
  10. Vue、Node全栈项目~面向小白的博客系统~