Icarus iverilog中PLI使用范例
安装Icarus verilog
本人是老师提供软件源码,linux环境为windows subsystem linux,ubuntu版本为18.04。据说,win环境有较多bug。。。下面的操作请在linux环境进行
给个ftp链接
ftp://ftp.icarus.com/pub/eda/verilog/
并没有尝试ftp服务,ftp不行的话,如果需要,联系yuantaogen@csu.edu.cn or yuantaogen@qq.com
首先tar解压:
然后进入解压目录
然后偷懒的方式,依次输入下面指令
最后需要提升权限,加sudo。过程十分流程,可以使用下图指令,检查安装成功与否
LPI基本使用
使用流程需要提供一个描述接口函数的c文件和描述仿真激励模型的.v文件。这里假设hello.c和hello.v,对于不同的应用,函数名可发生变化。
编译和执行过程如下:
需要注意的是,第二条指令 -o 后加空格,第三条指令-M.中.表示当前目录,-m与hello紧紧相连,不用空格,否则报错。
已经解决的bug
1、头文件包含
gcc在文件包含时,需要路径信息,因此头文件需要根据当前目录和需要包含的文件进行灵活更改。
在我的设计中,linux工作路径为workOfVPI
而必备头文件和实现文件都在verilog-10.3中,故文件包含应该写为:#include “./verilog-10.3/vpi_user.h”
注意使用双引号,尖括号也报错。。
2、最后的函数定义大括号后需要添加分号
上图中,该部分代码在末尾,不添加分号会报错:[Error] expected ‘,’ or ‘;’ at end of input
。加上分号就行了,这也太细节了吧。。。
3、The Verilog PLI Handbook 2.pdf在show_all_net.c代码缺少一部分注册。
也就是加上bug2中的代码,不知道光盘有没有漏,但文档中应该没有该代码
代码分享
show_all_nets.c
#include<stdlib.h>
#include<stdio.h>
#include<stdarg.h>
#include "./verilog-10.3/vpi_user.h"PLI_INT32 PLIBOOK_ShowNets_compiletf(PLI_BYTE8 *user_data),PLIBOOK_ShowNets_calltf(PLI_BYTE8 *user_data);void PLIBOOK_ShowNets_regisger()
{s_vpi_systf_data tf_data;tf_data.type=vpiSysTask;
// tf_data.sysfunctype=0;tf_data.tfname="$show_all_nets";tf_data.compiletf=PLIBOOK_ShowNets_compiletf;tf_data.calltf=PLIBOOK_ShowNets_calltf;tf_data.sizetf=NULL;tf_data.user_data=NULL;vpi_register_systf(&tf_data);return ;}PLI_INT32 PLIBOOK_ShowNets_compiletf(PLI_BYTE8 *user_data)
{vpiHandle systf_handle,arg_iterator,arg_handle;PLI_INT32 tfarg_type ;int err_flag=0;systf_handle=vpi_handle(vpiSysTfCall,NULL);arg_iterator=vpi_iterate(vpiArgument,systf_handle);if(arg_iterator==NULL) {vpi_printf("Error :$show_all_nets requires 1 argument\n");err_flag=1;}else {arg_handle =vpi_scan(arg_iterator);tfarg_type=vpi_get(vpiType,arg_handle);if (tfarg_type!=vpiModule) {vpi_printf("error :$show_all_nets arg must be module instance\n");vpi_free_object(arg_iterator);err_flag=1;}else {arg_handle=vpi_scan(arg_iterator);if(arg_handle!=NULL) {vpi_printf("error:$show_all_nets can only have 1 argument\n");vpi_free_object(arg_iterator);err_flag=1;}}}if(err_flag) vpi_control(vpiFinish,1);return 0;
}PLI_INT32 PLIBOOK_ShowNets_calltf(PLI_BYTE8 *user_data)
{vpiHandle systf_handle,arg_iterator,module_handle,net_iterator,net_handle;s_vpi_time current_time;s_vpi_value current_value;systf_handle=vpi_handle(vpiSysTfCall,NULL);arg_iterator=vpi_iterate(vpiArgument,systf_handle);module_handle =vpi_scan(arg_iterator);vpi_free_object(arg_iterator);current_time.type=vpiScaledRealTime;vpi_get_time(systf_handle,¤t_time);vpi_printf("\nAt time %2.2f, ",current_time.real);vpi_printf("net in module %s ",vpi_get_str(vpiFullName,module_handle));vpi_printf("(%s):\n",vpi_get_str(vpiDefName,module_handle));net_iterator=vpi_iterate(vpiNet,module_handle);if(net_iterator==NULL)vpi_printf(" no nets found in this module\n");else {current_value.format=vpiBinStrVal;while ( (net_handle=vpi_scan(net_iterator))!=NULL) {vpi_get_value(net_handle,¤t_value);vpi_printf(" net %-10s value is %s (binary) \n",vpi_get_str(vpiName,net_handle),current_value.value.str);}}return 0;
}void (*vlog_startup_routines[]) () ={PLIBOOK_ShowNets_regisger,0
};
show_all_nets.v
`timescale 1ns /1ns
module top;
reg [2:0]test;
tri [1:0]results;
addbit i1 (test[0],test[1],test[2],results[0],results[1]);
initial begintest=3'b000;#10 test=3'b011;#10 $show_all_nets(top);#10 $show_all_nets(i1);#10 $stop;#10 $finish;end
endmodule`timescale 1ns / 1ns
module addbit(a,b,ci,sum,co);
input a,b,ci;
output sum,co;
wire a,b,ci,sum,co,n1,n2,n3;
xor (n1,a,b);
xor #2 (sum,n1,ci);
and (n2,a,b);
and (n3,n1,ci);
or #2 (co,n2,n3);
endmodule
运行效果
最后输入finish可以结束仿真,回到shell.
Icarus iverilog中PLI使用范例相关推荐
- verilog中数组的定义_开源仿真工具Icarus Verilog中的verilog parser
前面提到用flex和bison开处理命令行参数,回顾一下:开源仿真工具Icarus Verilog中的命令行参数处理方法. 那么Verilog的parser又是怎么实现的呢?简单地说,与做命令行参数的 ...
- go 中使用socket范例
2019独角兽企业重金招聘Python工程师标准>>> package main import ( "fmt" "net" ) func ma ...
- Visual Studio 2005中web.sitemap 中扩展自定义属性的一些应用范例
Web.SiteMap 是 VS2005中一个非常重要的特性. 可以用于菜单等应用,但企业的应用中经常需要控制到 菜单的 target ,菜单的权限等. 通过扩展一些自定义属性可以实现(此方法已经在E ...
- 轻量版verilog仿真平台:icarus verilog使用简介
作为一名系统软件工程师,需要对verilog语言有一定的了解,学习verilog过程中免不了要进行仿真.工程上常见的verilog仿真软件基本就是国外EDA三大厂的:Mentor公司的ModelSim ...
- iverilog Makefile 阅读
读一波iverilog的makefile,理清项目结构 # # This source code is free software; you can redistribute it # and/or ...
- 财务 计算机网络,计算机网络技术在财务系统中的应用
计算机网络技术在财务系统中的应用 网络会计是信息技术的发展而使财务会计系统变革的产物. (本文共3页) 阅读全文>> 计算机网络技术在财务管理信息系统中的应用李忠臣,温青山,崔晶,张锡磊大 ...
- [原创].怎样制作一个简单ip,以方便在Quartus II和Nios II中使用?
概述:此处,我以Lcd12864(ST7920)作为范例,进行粗浅讲解,望各位网友踊跃拍砖. 0 软硬件环境 软件:Altera Quartus II 9.1 + Nios II 9.1 Sof ...
- PHP 4 中对象的比较
在 PHP 4 中,对象比较的规则十分简单:如果两个对象的类相同,且它们有相同的属性和值,则这两个对象相等.类似的规则还适用与用全等符(===)对两个对象的比较. 如果我们执行以下范例中的代码: If ...
- VC++2010中的GetWindowText与GetWindowTextW的区别
UpdateData(TRUE);//将控件上显示上的数据更新到关联变量 UpdateData(FALSE);将关联变量的值更新到控件显示. 当你改变控件对应的关联变量的值的时候,要使用UpdateD ...
- 在 C++ 中使用 PPL 进行异步编程
莱坞星探通常要拒绝那些有抱负的演员时,都会轻蔑地说:"别联系我们,我们会联系你的."然而对于开发人员来说,那句话却道出了许多软件框架工作的秘密,与其让程序员驱动整个应用程序的控制流 ...
最新文章
- netty4.0.x源码分析—bootstrap
- ei eo eq什么意思_EI源刊是什么意思
- verilog异步复位jk触发器_以不变应万变的异步FIFO面试宝典(二)
- Linux编译Opencv3.4.7: relocation R_X86_64_PC32 against `ff_w_ff‘ can not be used when makin with -fPIC
- Have Fun with Numbers及循环链表(约瑟夫问题)
- 多目标跟踪算法 | DeepSort
- BUGS 小胡的学习日志
- 零基础入门,资深吃货带你搞懂大数据
- 形容计算机很烂的网络用语,坑爹什么意思 网络术语坑爹是什么意思?
- 信用风险计量模型简述
- 基于TSUNG对MQTT进行压力测试-测试结果
- RGB 和 CMYK 相互转换
- Android笔记:将布局转换成图片
- NIO、AIO概述总结
- 文盾信息非结构化数据安全解决方案,高效防护企业文档安全
- 大华摄像头录像视频,可以使用PotPlayer剪切
- AlphaGo挑战围棋九段高手李世石
- 桂电计算机网络老师,刘忆宁-桂电网络空间安全博士点获批,且行且珍惜
- 小米平板刷机shell怎么退_小米平板2如何一键解锁?刷机教程图解
- 基于51单片机HC-SR04超声波测距带温度补偿
热门文章
- vue3使用keep-alive页面切换时报错:TypeError: parentComponent.ctx.deactivate is not a function
- matlab 获取文件毫秒时间,在Matlab中经过的时间,以毫秒为单位,具有不同的日期...
- word无法显示下划线
- 安卓投屏助手(B1358)之辅助调试
- 是非人生 — 一个菜鸟程序员的5年职场路 第30节
- 管理远程团队的4种方法
- 变频器在电机驱动中的作用
- 树莓派安装第三方操作系统
- 系统架构设计方法论——TOGAF
- vue 兼容IE解决方案, Babel .babelrc