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/functionsNull foreign function pointer encountered when calling 'huffman#_mti_copy_opFailed 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代碼報錯,信息如下
- 使用命令行,分別輸入下面命令。第一個命令編譯VHDL代碼,第二個編譯SV和C代碼
- 此時Transcript的信息最多只有warning,沒有error,但是,實際上vlog之后我的BaseClass.sv已經被改變了,見圖
- 這時需要手動將BaseClass代碼改回來,保存,無需再編譯(這是我比較奇怪的地方,難道是vlog正常編譯了BaseClass,之后又把內容換掉了。隨后進行了實驗,不改BaseClass,也即保持它還是被改過的錯的代碼,依然能順利仿真。),之后在GUI中仿真,一切順利。
經驗
有問題及時記錄,解決了也及時寫下解決方法,不要等所有問題解決再做這件事,一方面,所有問題解決時精力耗費很多,已經不想做了,另一方面,這時距離一些問題出現已經有時間了,可能已經忘了出現過哪些問題以及解決辦法了。所以要在問題出現的和解決的時候及時記錄,盡可能還原整個大問題的出現和解決的過程,為以后出現類似問題留下足夠可參考的經驗。
希望會對后面遇到問題的朋友起到幫助。
嗯,酒醬。
轉載于:https://www.cnblogs.com/JVever/p/6686730.html
總結
以上是生活随笔為你收集整理的SystemVerilog搭建验证平台使用DPI时遇到的问题及解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Py修行路 python基础 (九)作
- 下一篇: canvas学习之粒子动画