您的位置:首页 > 编程语言 > C语言/C++

怎样在systemverilog DPI中调用SV,C与C++(一)

2014-06-06 11:59 656 查看
网上有些例子只给了简单的print,文档里也只有在module中调用c,c中用module的函数,不能充分说明问题。既然希望在C里调用C++的函数,那么肯定要能访问到C++类里的变量那才有意义。这里给出一个简单的例子,示例代码如下:

调用关系:

top call sv_print();

top call c_print();

c_print() call c_print_call();

c_print() call cpp_print();

// top.v
module top;
string  s;
c_sv    sv_inst;

import "DPI-C" function void c_print(input string s);

initial begin
s       = "Hello DPI";
sv_inst = new();

sv_inst.sv_print(s);
c_print(s);
end
endmodule


//c_dpi.c
void c_print(const char* s) {
c_print_call(s);
cpp_print(s);
}


//c_dpi_call.c
#include <stdio.h>

void c_print_call(const char* s) {
printf("C:\t%0s\n", s);
}


//cpp_dpi.cpp
#include <stdio.h>
#include <iostream>
#ifdef __cplusplus
extern "C" {
#endif
class c_cpp{
public:
c_cpp();
~c_cpp();
char* get_string();
private:
char* prefix;
};

void cpp_print(char* s);
#ifdef __cplusplus
}
#endif

using namespace std;

c_cpp::c_cpp() {
prefix = "CPP:\t";
}

c_cpp::~c_cpp(){
}

char* c_cpp::get_string(){
return prefix;
}

void cpp_print(char* s) {
c_cpp   inst;
char*   prefix;

prefix  = inst.get_string();
cout << prefix << s << endl;
}



//sv_dpi.sv
class c_sv;
function new();
endfunction : new

function void sv_print(string s);
$display("SV:\t%0s", s);
endfunction : sv_print
endclass


相较c调用c++, c++调用c会简单很多,详情请查看参考文献2.

参考文献:

1. SystemVerilog DPI (Direct Programming Interface) VCS 2006.06-SP2-2 by:Synopsys, Inc.

2. C++项目中的extern ”C“ {}by:吴秦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: