本文目的在于分享一下把DPI稿能用了的过程,主要说一下平台其他部分搭建好之后,在完成DPI相关工作阶段遇到的问题,以及解决的办法。


工作环境:win10 64bit, Questasim 10.1b


首先,ref_model中导入C代码,同时将C代码放在相同与ref_model相同目录下

  1. import "DPI-C" context function void huffman(input int datain[256], output int dataout[35][32]);

C代码中添加include

  1. #include "svdpi.h"

之后开始,RTL代码+验证平台代码编译通过,图形界面点仿真,报错

  1. Can't locate a C compiler for compilation of DPI export tasks/functions
  2. Null foreign function pointer encountered when calling 'huffman#_mti_copy_op
  3. 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原来的内容不翼而飞了,如下

  1. /* MTI_DPI */
  2. /*
  3. * Copyright 2002-2012 Mentor Graphics Corporation.
  4. *
  5. * Note:
  6. * This file is automatically generated.
  7. * Please do not edit this file - you will lose your edits.
  8. *
  9. * Settings when this file was generated:
  10. * PLATFORM = 'win32'
  11. */
  12. #ifndef INCLUDED_HEAD
  13. #define INCLUDED_HEAD
  14. #ifdef __cplusplus
  15. #define DPI_LINK_DECL extern "C"
  16. #else
  17. #define DPI_LINK_DECL
  18. #endif
  19. #include "svdpi.h"
  20. DPI_LINK_DECL DPI_DLLESPEC
  21. void
  22. huffman(
  23. const int* datain,
  24. int* dataout);
  25. #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代码报错,信息如下
  1. D:/Code/NCICC/Testbench_SV/TestofDPI/Huffman_func.c: In function 'huffman':
  2. D:/Code/NCICC/Testbench_SV/TestofDPI/Huffman_func.c:41: warning: incompatible implicit declaration of built-in function 'printf'
  3. "D:/Code/NCICC/Testbench_SV/TestofDPI/Huffman_func.c", line 41: error:
  4. identifier "printf" is undefined
  5. printf("After weight refresh\n");
  6. ^
  7. 1 error detected in the compilation of "D:/Code/NCICC/Testbench_SV/TestofDPI/Huffman_func.c".
  8. ** Error: (sccom-6143) Creation of debug database failed.
  • 使用命令行,分别输入下面命令。第一个命令编译VHDL代码,第二个编译SV和C代码
  1. vcom -work work -2002 -explicit -vopt whole_module.vhd
  2. vlog -work work -sv -dpiheader *.sv Huffman_func.c
  • 此时Transcript的信息最多只有warning,没有error,但是,实际上vlog之后我的BaseClass.sv已经被改变了,见图

  • 这时需要手动将BaseClass代码改回来,保存,无需再编译(这是我比较奇怪的地方,难道是vlog正常编译了BaseClass,之后又把内容换掉了。随后进行了实验,不改BaseClass,也即保持它还是被改过的错的代码,依然能顺利仿真。),之后在GUI中仿真,一切顺利。

经验

有问题及时记录,解决了也及时写下解决方法,不要等所有问题解决再做这件事,一方面,所有问题解决时精力耗费很多,已经不想做了,另一方面,这时距离一些问题出现已经有时间了,可能已经忘了出现过哪些问题以及解决办法了。所以要在问题出现的和解决的时候及时记录,尽可能还原整个大问题的出现和解决的过程,为以后出现类似问题留下足够可参考的经验。

希望会对后面遇到问题的朋友起到帮助。

嗯,酒酱。

SystemVerilog搭建验证平台使用DPI时遇到的问题及解决方案的更多相关文章

  1. SystemVerilog搭建APB_I2C IP 层次化验证平台

    一.前言 近期疫情严重,身为社畜的我只能在家中继续钻研技术了.之前写过一篇关于搭建FIFO验证平台的博文,利用SV的OOP特性对FIFO进行初步验证,但有很多不足之处,比如结构不够规范.验证组件类不独 ...

  2. UART UVM验证平台平台搭建总结

    tb_top是整个UVM验证平台的最顶层:tb_top中例化dut,提供时钟和复位信号,定义接口以及设置driver和monitor的virual interface,在intial中调用run_te ...

  3. 基于简单DUT的UVM验证平台的搭建(一)

    最近一个月在实习公司做回归测试,对公司的UVM平台用的比较熟练,就想着自己做一个DUT,然后搭建一个UVM验证平台. 首先,DUT是一个简单的32位的加法器,代码如下:alu.v module add ...

  4. ( 转)UVM验证方法学之一验证平台

    在现代IC设计流程中,当设计人员根据设计规格说明书完成RTL代码之后,验证人员开始验证这些代码(通常称其为DUT,Design Under Test).验证工作主要保证从设计规格说明书到RTL转变的正 ...

  5. logstash+elasticsearch+kibana快速搭建日志平台

    使用logstash+elasticsearch+kibana快速搭建日志平台   日志的分析和监控在系统开发中占非常重要的地位,系统越复杂,日志的分析和监控就越重要,常见的需求有: 根据关键字查询日 ...

  6. 大数据Hadoop学习之搭建hadoop平台(2.2)

    关于大数据,一看就懂,一懂就懵. 一.概述 本文介绍如何搭建hadoop分布式集群环境,前面文章已经介绍了如何搭建hadoop单机环境和伪分布式环境,如需要,请参看:大数据Hadoop学习之搭建had ...

  7. run_test() 验证平台的入口

    Run,just run!    ——阿甘正传   一个简单的例子: module tb_top; dut u_dut (); initial begin run_test(); end config ...

  8. UART IP和UVM的验证平台

    UART是工程师在开发调试时最常用的工具的,其通信协议简单.opencores 网站提供了兼容16550a的UART IP其基本特性如下: uart16550 is a 16550 compatibl ...

  9. eclispe搭建android平台

    1.不推荐在线安装android ADT,因为需要FQ.可以在网上下载ADT,然后离线安装. 离线安装方式:help->Install ->点击add然后选择你的安装包(不需要解压),一直 ...

随机推荐

  1. Javascript基本语句

    1.单行语句是大家用的最多的,下面讲讲复合语句的用法. 用一对花括号括起来,处理的时候,可以用单句来对待.这样做的好处是避免复合语句中语句互相干扰执行. 语法如下: { var x=1111: var ...

  2. [.NET] RabbitMQ 的行为艺术

    RabbitMQ 的行为艺术 序 好像,今天已经是 2 月 28 号了. 听说,29.30.31 号放假. 据说,有图,有真相. 目录 简介 环境搭建 示例一:简单的 Hello World 示例二: ...

  3. 精通gulp常用插件

    本文主要展示的是gulp常用插件的使用方法和用途,通过对插件的熟练运用达到精通gulp.不定期更新.可以到github上面下载DEMO. github地址:lin-xin/gulp-plugins 匹 ...

  4. Dapper的扩展这个你知道嘛?

    之前写的ORM对比文章中,我选Dapper作为底层ADO的基础访问框架后,我对此再次进行进一步的深入研究,发现里面还有延伸了一些好用的扩展方法和特性,那我便简单的跟大家说一下特性标签. 一.Table ...

  5. C#如何获取指定周的日期范围

    1. 不允许跨年 1) 第一周的第一天从每年的第一天开始,最后一周的最后一天为每年的最后一天. static void Main(string[] args) { DateTime first, la ...

  6. centOS7 mini配置linux服务器(三) 配置防火墙以及IPtables切换

    一.firewall介绍 CentOS 7中防火墙是一个非常的强大的功能,在CentOS 6.5中在iptables防火墙中进行了升级了. 1.官方介绍 The dynamic firewall da ...

  7. Java中的for each实现原理与坑

    文章转载自「开发者圆桌」一个关于开发者入门.进阶.踩坑的微信公众号 在Java中,遍历集合和数组一般有以下三种形式: for (int i = 0; i < list.size(); i++) ...

  8. 2729: [HNOI2012]排队

    2729: [HNOI2012]排队 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 957  Solved: 449[Submit][Status] ...

  9. UISearchController 搜索

    UISearchController实现搜索 通过 UISearchController 实现 UISearchResultsUpdating 这个委托实现上面的效果: 视图中中需要声明UISearc ...

  10. QT Creator 快速入门教程 读书笔记(一)

    一 Qt简介 Qt 是一个跨平台的C++应用程序框架,支持Windows.Linux.Mac OS X.Android.iOS.Windows Phone.嵌入式系统等.也就是说,Qt 可以同时支持桌 ...