在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的实现相关推荐

  1. Iverilog源码分析 -- VPI scope的实现

    在Verilog里面采用module/endmodule 来组成整个design的hierarchy结构, 比如, 如下的代码: 会产生如下的hierarchy结构: 目前在Verilog的LRM, ...

  2. Iverilog 源码分析 -- VCD的实现机制

    VCD是Verilog LRM中定义的, 本文介绍Iverilog 基于VPI机制的VCD的实现过程.在vpi目录下面, 定义了不同模块加载的实现.如下显示了Iverilog下面已经支持的实现: vo ...

  3. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  4. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  5. SpringBoot-web开发(二): 页面和图标定制(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...

  6. SpringBoot-web开发(一): 静态资源的导入(源码分析)

    目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...

  7. Yolov3Yolov4网络结构与源码分析

    Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...

  8. ViewGroup的Touch事件分发(源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...

  9. View的Touch事件分发(二.源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...

最新文章

  1. IDEA函数调用关系图插件
  2. 区块链热度飙升 BAT抢先布局话语权争夺战开打
  3. 【学习排序】 Learning to Rank中Pointwise关于PRank算法源码实现
  4. 深入理解python的元组本身不可变性
  5. 天猫整站SSM-分页-limit(做个人学习笔记整理用)
  6. 广州科目三考试 不得不看的十条提醒(图)
  7. 聊下并发和Tomcat线程数(错误更正)
  8. linux复习题之阶段性考试题目
  9. 使用 Visual Studio 创建 .NET 控制台应用程序
  10. NGFF、M.2、PCIe、NVMe概念区分以及PCIEx1 x4 x8 x16区别
  11. 淘宝/京东/苏宁/拼多多/唯品会 返利消息批量转链思路
  12. oracle 软件证书错误,IE上ORACLE OEM 证书错误 , 导航阻止,无法”继续浏览此网站”...
  13. 投影幕布jsp_发现篇:亿立投影幕布真实使用感受诉说不看后悔 | 智能扫地机器人评测...
  14. 怎么快速学会计算机程序知识,零基础学电脑怎样才能学得快,自学电脑的基础知识分享...
  15. 5Gwifi和手机5G区别
  16. Java中OutOfMemoryError(内存溢出)和Tomcat进程假死崩溃
  17. android代码图片编辑,怎样修改android系统apk软件里面的代码和图片?
  18. g.SetGDIHigh()错误
  19. 晋江文学城网站优化与诊断
  20. 2020年书法落款_书法落款能不能写“年”字?

热门文章

  1. 模拟飞机票订票和退票系统的c++实现
  2. 锂电池充电管理IC/DP4056
  3. Kotlin鱿鱼游戏大奖赛
  4. Python类型判断
  5. 酷鱼桌面2设计器简介
  6. JAVA正则表达式匹配多个空格
  7. 文化因素对商标翻译的影响
  8. PHP的医院预约挂号系统
  9. 病毒营销成功案例-阿里影业的广告片《啥是佩奇》
  10. 区块链产教融合刻不容缓,高校该如何培养行业人才