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中仿真,一切順利。

經驗

有問題及時記錄,解決了也及時寫下解決方法,不要等所有問題解決再做這件事,一方面,所有問題解決時精力耗費很多,已經不想做了,另一方面,這時距離一些問題出現已經有時間了,可能已經忘了出現過哪些問題以及解決辦法了。所以要在問題出現的和解決的時候及時記錄,盡可能還原整個大問題的出現和解決的過程,為以后出現類似問題留下足夠可參考的經驗。

希望會對后面遇到問題的朋友起到幫助。

嗯,酒醬。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM