通常,DPI只能连接到静态C例程,而不是C ++代码中的动态对象。所以你需要创建调用它的C包装器例程
C ++方法。
如果拥有多个对象实例,则需要从中传递指向该对象的指针SystemVerilog到C封装中。指针可以保存在SystemVerilog中的“chandle”变量中。
实例如下:
class Counter {
public:
void counter_signal(unsigned char *o, unsigned char i, char reset);
};
void Counter::counter_signal(unsigned char *o, unsigned char i,char reset) {
io_printf("C: count=%d, reset=%d\n", count, reset);
}
// DPI需要一个静态例程来与之通信,这个构造计数器对象并返回一个句柄
#ifdef __cplusplus
extern "C" void* counter_new()
#else
void* counter_new()
#endif
{
return new Counter;
}
//调用Counter实例,传递信号值
#ifdef __cplusplus
extern "C" void counter8(void* inst, unsigned char *o, unsigned char i, char reset)
#else
void counter(void* inst, unsigned char *o, unsigned char i, char reset)
#endif
{
Counter *c_inst = (Counter *) inst;
c_inst->counter_signal(o, i, reset);
}
在sv端,实例化counter_new,然后将指针传入counter中,伪代码如下:
initial begin
// Instantiate the counter in C++
inst = counter_new();
forever @(posedge ifc.clk) begin
// Call the C++ reference model
counter(inst, o, ifc.i, ifc.reset);
end
end