微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > systemverilog dpi simuation 出错,求助

systemverilog dpi simuation 出错,求助

时间:10-02 整理:3721RD 点击:

最近在学习systemverilog 的 dpi。试着自己写了一段简单的代码,但是仿真出错。代码如下
SV代码:
module top ;
import "DPI-C" context main = task c_main();
export "DPI-C" task tmp;
initial
begin
#10ns;
#10ns;
c_main();
#10ns;
$finish;
end
task tmp(input int dati, output int dato);
begin
#10ns;
if(dati==100)
dato = 100;
else
dato = 0;
end
endtask
endmodule

C代码
#include <stdio.h>
#include "svdpi.h"
#include "vpi_user.h"
#include "header.h"
void main () {
int i;
int* check_value;
tmp(100,*check_value);
printf("C-side got tmp value %d\n",*check_value);
}

出错信息(用的是NC)
ncsim: *E,SIGUSR: Unix Signal SIGSEGV raised from user application code.

求助各位大侠。此出错信息是什么原因造成的。
另外这种dpi的代码仿真出错以后要如何debug

PS: 这段代码的目的是让C通过调用SV的task,从而得到SV中的信号值。 如果有其他更好方法,请一并赐教

本来是想要送给帮助者信元的,不过貌似搞错了,变成收费主题了。现在改正了

没有人指点吗?
顺便说一下,仿真命令如下:
irun top.sv -cpost main.c -end -ncelabargs "-dpiheader header.h -dpi_void_task"

I found the reason.
In C side, although the type of check value is int*, but when used it as parameter of function tmp, it should be used like
tmp(100, check_value); instead oftmp(100, *check_value);
Is it common for general C code?

小编,你没搞清楚指针的用法。你的意思是要从SV往C传数,这个数是要存在C的,所以C里一定要有存储空间,而你只定义了一个没有初始化也没有分配内在的指针,tmp()函数往这个指针所指的内存写数肯定会访问到非法的空间从而造成程序崩溃。这样做是可以的:
int check_value;
tmp(100, &check_value);

LZ请问下你的SV代码和C代码是放在一起还是分开为2个文件,文件后缀是.SV和.C吧,是在NCVLOG的环境下运行的吗》

学习一下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top