SystemVerilog搭建验证平台使用DPI时遇到的问题及解决方案
本文目的在于分享一下把DPI稿能用了的过程,主要说一下平台其他部分搭建好之后,在完成DPI相关工作阶段遇到的问题,以及解决的办法。
工作环境:win10 64bit, Questasim 10.1b
首先,ref_model中导入C代码,同时将C代码放在相同与ref_model相同目录下
import "DPI-C" context function void huffman(input int datain[256], output int dataout[35][32]);
C代码中添加include
#include "svdpi.h"
之后开始,RTL代码+验证平台代码编译通过,图形界面点仿真,报错
Can't locate a C compiler for compilation of DPI export tasks/functions
Null foreign function pointer encountered when calling 'huffman#_mti_copy_op
Failed to find user specified function 'huffman' in DPI C/C++ source files.
以上几个错误,每一行是一个错误,不是在同一次出现。
因为SV绿皮书上没有提到需要额外的gcc编译器作为支持,所以开始没想到是缺少东西,以为是调用格式错误,搜索各种资料,在这个过程中发现可能是因为缺少编译器支持C的编译,想来也对,questasim应该是不可能原生支持C的编译的。
之后下载了编译器【附地址:http://vdisk.weibo.com/s/Cg59vH6N6n5EG】,解压后直接放在Questasim的安装目录即可。
理论上讲,这个时候应该就能用了,但是questasim中一仿真,还是会出错,没办法,又开始找问题。
这个过程中想到了软件自带的例子可能会有这方面的示例,于是到【D:\questasim_10.1b\examples\systemverilog\dpi】目录下找到了几个例子,之后在Questasim的命令行里do run.do运行了下给的例子,发现可以运行通过,没有报错,这说明,此时我的电脑中,使用DPI所需的东西肯定是全的,那么我的代码跑不过就一定是出在了运行的方式上。
于是尝试修改run.do文件来用命令行运行我的代码(之前都是在GUI中鼠标点击编译运行,问题可能就出在编译和仿真的时候的选项不同),在尝试的时候遇到新的问题, 因为RTL是用VHDL写的,而vlog是无法编译的,搜了一下知道,要用vcom来编译VHDL。
这之后还经历了非常诡异的问题,就是我的BaseClass.sv每次在vlog编译之后都一定会被修改,变成如下的代码,BaseClass原来的内容不翼而飞了,如下
/* MTI_DPI */
/*
* Copyright 2002-2012 Mentor Graphics Corporation.
*
* Note:
* This file is automatically generated.
* Please do not edit this file - you will lose your edits.
*
* Settings when this file was generated:
* PLATFORM = 'win32'
*/
#ifndef INCLUDED_HEAD
#define INCLUDED_HEAD
#ifdef __cplusplus
#define DPI_LINK_DECL extern "C"
#else
#define DPI_LINK_DECL
#endif
#include "svdpi.h"
DPI_LINK_DECL DPI_DLLESPEC
void
huffman(
const int* datain,
int* dataout);
#endif
为什么会出现这个问题,一直没搞清楚,并且现在也不出现了,如果有人知道原因,还请告诉我哈,对这个事耿耿于怀。
就这样,几经波折之后,这个问题消失了,用图形界面也可以顺利跑通了。
附上几个有关DPI的地址,有问题没解决的话可以去看一下
https://www.doulos.com/knowhow/sysverilog/tutorial/dpi/
https://en.wikipedia.org/wiki/SystemVerilog_DPI
刚刚又重建了一个project,把整个流程捋顺了一下。
- questasim 新建project,把没有问题的testbench代码导入,包括C代码和我的VHDL代码
- GUI编译,其他正常,只有C代码报错,信息如下
D:/Code/NCICC/Testbench_SV/TestofDPI/Huffman_func.c: In function 'huffman':
D:/Code/NCICC/Testbench_SV/TestofDPI/Huffman_func.c:41: warning: incompatible implicit declaration of built-in function 'printf'
"D:/Code/NCICC/Testbench_SV/TestofDPI/Huffman_func.c", line 41: error:
identifier "printf" is undefined
printf("After weight refresh\n");
^
1 error detected in the compilation of "D:/Code/NCICC/Testbench_SV/TestofDPI/Huffman_func.c".
** Error: (sccom-6143) Creation of debug database failed.
- 使用命令行,分别输入下面命令。第一个命令编译VHDL代码,第二个编译SV和C代码
vcom -work work -2002 -explicit -vopt whole_module.vhd
vlog -work work -sv -dpiheader *.sv Huffman_func.c
- 此时Transcript的信息最多只有warning,没有error,但是,实际上vlog之后我的BaseClass.sv已经被改变了,见图
- 这时需要手动将BaseClass代码改回来,保存,无需再编译(这是我比较奇怪的地方,难道是vlog正常编译了BaseClass,之后又把内容换掉了。随后进行了实验,不改BaseClass,也即保持它还是被改过的错的代码,依然能顺利仿真。),之后在GUI中仿真,一切顺利。
经验
有问题及时记录,解决了也及时写下解决方法,不要等所有问题解决再做这件事,一方面,所有问题解决时精力耗费很多,已经不想做了,另一方面,这时距离一些问题出现已经有时间了,可能已经忘了出现过哪些问题以及解决办法了。所以要在问题出现的和解决的时候及时记录,尽可能还原整个大问题的出现和解决的过程,为以后出现类似问题留下足够可参考的经验。
希望会对后面遇到问题的朋友起到帮助。
嗯,酒酱。
SystemVerilog搭建验证平台使用DPI时遇到的问题及解决方案的更多相关文章
- SystemVerilog搭建APB_I2C IP 层次化验证平台
一.前言 近期疫情严重,身为社畜的我只能在家中继续钻研技术了.之前写过一篇关于搭建FIFO验证平台的博文,利用SV的OOP特性对FIFO进行初步验证,但有很多不足之处,比如结构不够规范.验证组件类不独 ...
- UART UVM验证平台平台搭建总结
tb_top是整个UVM验证平台的最顶层:tb_top中例化dut,提供时钟和复位信号,定义接口以及设置driver和monitor的virual interface,在intial中调用run_te ...
- 基于简单DUT的UVM验证平台的搭建(一)
最近一个月在实习公司做回归测试,对公司的UVM平台用的比较熟练,就想着自己做一个DUT,然后搭建一个UVM验证平台. 首先,DUT是一个简单的32位的加法器,代码如下:alu.v module add ...
- ( 转)UVM验证方法学之一验证平台
在现代IC设计流程中,当设计人员根据设计规格说明书完成RTL代码之后,验证人员开始验证这些代码(通常称其为DUT,Design Under Test).验证工作主要保证从设计规格说明书到RTL转变的正 ...
- logstash+elasticsearch+kibana快速搭建日志平台
使用logstash+elasticsearch+kibana快速搭建日志平台 日志的分析和监控在系统开发中占非常重要的地位,系统越复杂,日志的分析和监控就越重要,常见的需求有: 根据关键字查询日 ...
- 大数据Hadoop学习之搭建hadoop平台(2.2)
关于大数据,一看就懂,一懂就懵. 一.概述 本文介绍如何搭建hadoop分布式集群环境,前面文章已经介绍了如何搭建hadoop单机环境和伪分布式环境,如需要,请参看:大数据Hadoop学习之搭建had ...
- run_test() 验证平台的入口
Run,just run! ——阿甘正传 一个简单的例子: module tb_top; dut u_dut (); initial begin run_test(); end config ...
- UART IP和UVM的验证平台
UART是工程师在开发调试时最常用的工具的,其通信协议简单.opencores 网站提供了兼容16550a的UART IP其基本特性如下: uart16550 is a 16550 compatibl ...
- eclispe搭建android平台
1.不推荐在线安装android ADT,因为需要FQ.可以在网上下载ADT,然后离线安装. 离线安装方式:help->Install ->点击add然后选择你的安装包(不需要解压),一直 ...
随机推荐
- Javascript基本语句
1.单行语句是大家用的最多的,下面讲讲复合语句的用法. 用一对花括号括起来,处理的时候,可以用单句来对待.这样做的好处是避免复合语句中语句互相干扰执行. 语法如下: { var x=1111: var ...
- [.NET] RabbitMQ 的行为艺术
RabbitMQ 的行为艺术 序 好像,今天已经是 2 月 28 号了. 听说,29.30.31 号放假. 据说,有图,有真相. 目录 简介 环境搭建 示例一:简单的 Hello World 示例二: ...
- 精通gulp常用插件
本文主要展示的是gulp常用插件的使用方法和用途,通过对插件的熟练运用达到精通gulp.不定期更新.可以到github上面下载DEMO. github地址:lin-xin/gulp-plugins 匹 ...
- Dapper的扩展这个你知道嘛?
之前写的ORM对比文章中,我选Dapper作为底层ADO的基础访问框架后,我对此再次进行进一步的深入研究,发现里面还有延伸了一些好用的扩展方法和特性,那我便简单的跟大家说一下特性标签. 一.Table ...
- C#如何获取指定周的日期范围
1. 不允许跨年 1) 第一周的第一天从每年的第一天开始,最后一周的最后一天为每年的最后一天. static void Main(string[] args) { DateTime first, la ...
- centOS7 mini配置linux服务器(三) 配置防火墙以及IPtables切换
一.firewall介绍 CentOS 7中防火墙是一个非常的强大的功能,在CentOS 6.5中在iptables防火墙中进行了升级了. 1.官方介绍 The dynamic firewall da ...
- Java中的for each实现原理与坑
文章转载自「开发者圆桌」一个关于开发者入门.进阶.踩坑的微信公众号 在Java中,遍历集合和数组一般有以下三种形式: for (int i = 0; i < list.size(); i++) ...
- 2729: [HNOI2012]排队
2729: [HNOI2012]排队 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 957 Solved: 449[Submit][Status] ...
- UISearchController 搜索
UISearchController实现搜索 通过 UISearchController 实现 UISearchResultsUpdating 这个委托实现上面的效果: 视图中中需要声明UISearc ...
- QT Creator 快速入门教程 读书笔记(一)
一 Qt简介 Qt 是一个跨平台的C++应用程序框架,支持Windows.Linux.Mac OS X.Android.iOS.Windows Phone.嵌入式系统等.也就是说,Qt 可以同时支持桌 ...