Iverilog 源码分析 -- VPI的实现
在IVerilog中VVP可以通过-m或者-M制定需要加载的模块,本文介绍一下VPI的模块工作机制。
每个模块通过vpip_load_module来加载指定的动态链接库, 然后在动态链接库里面找到“vpip_set_callback”函数来设定vpip_routines_s 结构内的函数指针,这些函数是VerilogLRM预定义的37个函数, 参考Verilog LRM 27章: VPI routines definition, 这些函数定义在vvp/vpi_private.cc里面;
然后查找vlog_startup_routines 内指定的启动函数并且逐个执行;
vlog_startup_routines是一个注册函数列表, 每个自定义的模块要首先在该列表里面注册:
void vpip_load_module(const char*name) {// buf 保存了模块的路径、名称dll = ivl_dlopen(buf, export_flag);void*function = ivl_dlsym(dll, "vpip_set_callback");if (function) {vpip_set_callback_t set_callback = (vpip_set_callback_t)function;if (!set_callback(&vpi_routines, vpip_routines_version)) ;return;}}void*table = ivl_dlsym(dll, LU "vlog_startup_routines" TU);vpi_mode_flag = VPI_MODE_REGISTER;vlog_startup_routines_t*routines = (vlog_startup_routines_t*)table;for (unsigned tmp = 0 ; routines[tmp] ; tmp += 1)(routines[tmp])();vpi_mode_flag = VPI_MODE_NONE;}
VPI 的模块启动函数设定在vpi/sys_table.cc, 设定如下:
void (*vlog_startup_routines[])(void) = {sys_convert_register,sys_countdrivers_register,sys_darray_register,sys_fileio_register,sys_finish_register,sys_deposit_register,sys_display_register,sys_plusargs_register,sys_queue_register,sys_random_register,sys_random_mti_register,sys_readmem_register,sys_scanf_register,sys_time_register,sys_lxt_or_vcd_register,sys_sdf_register,sys_special_register,table_model_register,vams_simparam_register,0
};
这里定义了很多的自定义加载模块, 每个模块通过如下的方式来注册函数进行模块与simulator之间的交互, 使得用户模块可以访问simulator的内存状态信息。
typedef struct t_vpi_systf_data {PLI_INT32 type;PLI_INT32 sysfunctype;const char *tfname;PLI_INT32 (*calltf) (ICARUS_VPI_CONST PLI_BYTE8*);PLI_INT32 (*compiletf)(ICARUS_VPI_CONST PLI_BYTE8*);PLI_INT32 (*sizetf) (ICARUS_VPI_CONST PLI_BYTE8*);ICARUS_VPI_CONST PLI_BYTE8 *user_data;
} s_vpi_systf_data, *p_vpi_systf_data;s_vpi_systf_data tf_data;vpiHandle res;tf_data.type = vpiSysFunc;tf_data.tfname = "$time";tf_data.sysfunctype = vpiTimeFunc;tf_data.calltf = sys_time_calltf;tf_data.compiletf = sys_no_arg_compiletf;tf_data.sizetf = 0;tf_data.user_data = "$time";res = vpi_register_systf(&tf_data);vpip_make_systf_system_defined(res);
每当在Verilog里面调用$time(), 系统自动调用compiletf指针指向的函数,来检验函数调用的参数检查, 通过calltf函数指针来执行相关的操作。
在VVP目录下面, 存在很多的vpi_xxx.cc文档, 他们实现了VVP调用vpi模块的框架函数。
文件 | 主要功能 |
---|---|
vpi_modules.cc | 实现了load_vpi_module, 其功能如上面分析 |
vpi_task.cc | 记录系统函数或者系统任务, 任务的调用等 |
vpi_scope.cc | 定义了__vpiScope以及其字对象, 主要记录了模块以及子模块,参考: VPI scope |
vpi_signal.cc | 定义了signal的属性信息, 以及不同类型的valuechange的类定义 |
Iverilog 源码分析 -- VPI的实现相关推荐
- Iverilog源码分析 -- VPI scope的实现
在Verilog里面采用module/endmodule 来组成整个design的hierarchy结构, 比如, 如下的代码: 会产生如下的hierarchy结构: 目前在Verilog的LRM, ...
- Iverilog 源码分析 -- VCD的实现机制
VCD是Verilog LRM中定义的, 本文介绍Iverilog 基于VPI机制的VCD的实现过程.在vpi目录下面, 定义了不同模块加载的实现.如下显示了Iverilog下面已经支持的实现: vo ...
- 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析
目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...
- SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...
- SpringBoot-web开发(二): 页面和图标定制(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...
- SpringBoot-web开发(一): 静态资源的导入(源码分析)
目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...
- Yolov3Yolov4网络结构与源码分析
Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...
- ViewGroup的Touch事件分发(源码分析)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...
- View的Touch事件分发(二.源码分析)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...
最新文章
- IDEA函数调用关系图插件
- 区块链热度飙升 BAT抢先布局话语权争夺战开打
- 【学习排序】 Learning to Rank中Pointwise关于PRank算法源码实现
- 深入理解python的元组本身不可变性
- 天猫整站SSM-分页-limit(做个人学习笔记整理用)
- 广州科目三考试 不得不看的十条提醒(图)
- 聊下并发和Tomcat线程数(错误更正)
- linux复习题之阶段性考试题目
- 使用 Visual Studio 创建 .NET 控制台应用程序
- NGFF、M.2、PCIe、NVMe概念区分以及PCIEx1 x4 x8 x16区别
- 淘宝/京东/苏宁/拼多多/唯品会 返利消息批量转链思路
- oracle 软件证书错误,IE上ORACLE OEM 证书错误 , 导航阻止,无法”继续浏览此网站”...
- 投影幕布jsp_发现篇:亿立投影幕布真实使用感受诉说不看后悔 | 智能扫地机器人评测...
- 怎么快速学会计算机程序知识,零基础学电脑怎样才能学得快,自学电脑的基础知识分享...
- 5Gwifi和手机5G区别
- Java中OutOfMemoryError(内存溢出)和Tomcat进程假死崩溃
- android代码图片编辑,怎样修改android系统apk软件里面的代码和图片?
- g.SetGDIHigh()错误
- 晋江文学城网站优化与诊断
- 2020年书法落款_书法落款能不能写“年”字?