通过SystemVerilog DPI-C层

时间:2018-05-15 13:43:33

标签: system-verilog modelsim vivado cadence system-verilog-dpi

SystemVerilog LRM有一些示例显示如何将SystemVerilog中的结构传递给\从C到DPI-C层。然而,当我尝试自己的例子时,它似乎在Incisive或Vivado模拟器中根本不起作用(它在ModelSim中有效)。我想知道我做错了什么,或者是否是模拟器的问题。我的例子如下:

#include <stdio.h>

typedef struct {
               char f1;
               int f2;
} s1;

void SimpleFcn(const s1 * in,s1 * out){
    printf("In the C function the struct in has f1: %d\n",in->f1);
    printf("In the C function the struct in has f2: %d\n",in->f2);
    out->f1=!(in->f1);
    out->f2=in->f2+1;    
}

我将上面的代码编译成共享库:

gcc -c -fPIC -Wall -ansi -pedantic -Wno-long-long -fwrapv -O0 dpi_top.c -o dpi_top.o
gcc -shared -lm dpi_top.o -o dpi_top.so

SystemVerilog代码:

`timescale 1ns / 1ns
typedef struct {
               bit f1;
               int f2;
               } s1;

import "DPI-C" function void SimpleFcn(input s1 in,output s1 out);

module top();
  s1 in,out;
  initial
    begin    
    in.f1=1'b0;  
    in.f2 = 400;
    $display("The input struct in SV has f1: %h and f2:%d",in.f1,in.f2);
    SimpleFcn(in,out);
    $display("The output struct in SV has f1: %h and f2:%d",out.f1,out.f2);
 end

endmodule 

在Incisive中,我使用irun:

运行它
irun -sv_lib ./dpi_top.so -sv ./top.sv

但它是SegV&#39。

在Vivado中,我使用

运行它
xvlog -sv ./top.sv 
xelab top -sv_root ./ -sv_lib dpi_top.so -R

它运行正常,直到退出模拟,然后存在内存损坏:

Vivado Simulator 2017.4
Time resolution is 1 ns
run -all
The input struct in SV has f1: 0 and f2:        400
In the C function the struct in has f1: 0
In the C function the struct in has f2: 400
The output struct in SV has f1: 1 and f2:        401
exit
*** Error in `xsim.dir/work.top/xsimk': double free or corruption (!prev): 0x00000000009da2c0 ***

1 个答案:

答案 0 :(得分:2)

你很幸运,这在Modelsim中有效。您的SystemVerilog原型与您的C原型不匹配。您在C中f1byte,在SystemVerilog中为bit

Modelsim / Questa有一个-dpiheader开关,可以生成一个C头文件,可以#include放入dpi_top.c文件中。这样,当原型不匹配而不是不可预测的运行时错误时,您会收到编译器错误。这是SV代码的C原型。

typedef struct {
    svBit f1;
    int f2;
}  s1;

void SimpleFcn(
    const s1* in,
    s1* out);

但我建议在SystemVerilog中坚持使用C兼容类型。