VPI step by step(1)
本文主要参考”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)相关推荐
- 【Step By Step】将Dotnet Core部署到Docker下
一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core-使用.Net Core + Entity FrameWor ...
- python写一个通讯录step by step V3.0
python写一个通讯录step by step V3.0 更新功能: 数据库进行数据存入和读取操作 字典配合函数调用实现switch功能 其他:函数.字典.模块调用 注意问题: 1.更优美的格式化输 ...
- C#2.0实例程序STEP BY STEP--实例二:数据类型
C#2.0实例程序STEP BY STEP--实例二:数据类型 与其他.NET语言一样,C#支持Common Type Sysem(CTS),其中的数据类型集合不仅包含我们熟悉的基本类型,例如int, ...
- 文本分类step by step(二)
(注:如有转载请标明作者:finallyliuyu, 和出处:博客园) <文本分类 step by step(一)> 在<文本分类step by step(一)>中,我们从处理 ...
- 数据库设计Step by Step (9)——ER-to-SQL转化
2019独角兽企业重金招聘Python工程师标准>>> 引言:前文(数据库设计 Step by Step (8)--视图集成)讨论了如何把局部ER图集成为全局ER图.有了全局ER图后 ...
- ActionScript 3.0 Step By Step系列(五):走在面向对象开发的路上,以类为基础去思考编程问题...
面向对象的程序设计(Object-Oriented Programming,简记为OOP)是一种功能非常强大的编程方法,立意于创建软件重用代码,以类为基础去思考编程问题. ActionScript 3 ...
- NHibernate Step by Step:序篇 (转)
原文出处:http://www.cnblogs.com/abluedog/archive/2006/04/15/375676.html 原文作者:abluedog 很久以前,你可能习惯了connect ...
- Python 调试:step into/step out/step over 的区别
Python 调试:step into/step out/step over 的区别: 首先在PyCharm 程序中设置 " 断点 ",后点击右上角的Debug 按钮进入调试程序状 ...
- Caffe使用step by step:caffe框架下的基本操作和分析
Caffe使用step by step:caffe框架下的基本操作和分析 时间:2015-10-16 11:40:09 阅读:808 评论:0 收藏:0 [点我 ...
- 吴恩达深度学习课程deeplearning.ai课程作业:Class 4 Week 1 Convolutional Neural Networks: Step by Step
吴恩达deeplearning.ai课程作业,自己写的答案. 补充说明: 1. 评论中总有人问为什么直接复制这些notebook运行不了?请不要直接复制粘贴,不可能运行通过的,这个只是notebook ...
最新文章
- CentOS 7 安装Boost 1.67及boost_python
- C#部分---函数添加基本格式;
- 汇编语言 利用ASCII以及AND OR进行字符串大小写转换
- matlab中m文件的作用,M文件主要包含()_matlab中m文件的好处
- pytorch forward_pytorch使用hook打印中间特征图、计算网络算力等
- c# 设计原则需要学习吗_向最好的学习:产品设计原则
- vue 响应式ui_如何在Vue.js中设置响应式UI搜索
- 【转】理解OAuth 2.0
- android一个工程的xml怎么引用另外一个工程的xml,如何在Android中使用XML引用库中另一个包的字符串?...
- 手机App都在偷听我说话?窃听疑云全球密布,科技公司连连喊冤
- 节奏大师闪退android,安卓节奏大师进不去的原因以及详细解决办法
- C# sqlhelper
- 浅析Marshmallow在flask中的应用
- 十二星座匹配对象_快来看看,准爆了的十二星座恋情分析表
- 智能空气净化器解决方案,飞睿科技无线WiFi芯片模块技术应用
- 人过三十,能不能成大事?看这10个细节足够,听话听音看人看小
- 纯css更改图片颜色的技巧
- 群晖docker搭建印象笔记_群晖docker安装蚂蚁笔记安装教程
- Oracle存储过程中loop、for循环的用法
- ArcGIS平滑处理
热门文章
- 押注混合云和人工智能,分拆后的IBM能成功吗?
- 建立管道大数据的可行性分析
- SysFader: iexplore.exe 应用程序错误的最终解决方案
- 广东省计算机等级考试一级试题(1),全国计算机等级考试一级B模拟试题及答案(1)...
- 免费分享一套开源充电桩物联网云平台(含硬件充电桩)(v2.3.2)
- 2021年山东省安全员C证考试内容及山东省安全员C证新版试题
- 机器学习:关于P-R曲线和Roc曲线
- 做副业月薪10K+,工作效率翻倍!Python是个什么宝藏?
- JAVA SE、JAVA EE、JAVA ME区别
- Vue、Node全栈项目~面向小白的博客系统~